标签: aar

Android多模块构建合并aar解决方案

前段时间,我在实现gradle多模块构建遇到一个问题,以前我们基本上是以jar包形式让开发者集成到工程中使用,但自从Android Studio中有了多module的概念,而我们的SDK也是分了多个模块进行构建的,但我们这里有个问题就是模块之间是相互关联的,不能针对每个模块单独打包,而每个module都会生成对应的aar,但并不会把依赖的module代码打进去,别问我为什么知道,你将aar后缀改为zip,然后反编译classes.jar就可以看到。所以我们这边就有了合并aar这样的一个需求,下面就告诉大家怎么来实现。

android-fat-aar

当时我遇到这个问题,就去github搜了一下,已经有人将合并aar的脚本开源出来了,开源地址如下:

https://github.com/adwiv/android-fat-aar

什么是aar?

什么是aar?它跟jar包有什么区别?它该怎么样使用?相信大家一定会有这些疑问。首先aar是针对Android Library而言的,你可以理解为IDE针对Android Library的打包,一个aar包含什么东西?
它的文件后缀名是.aar,它本身是一个zip文件,强制包含以下文件:

/AndroidManifest.xml
/classes.jar
/res/
/R.txt

另外,AAR文件可以包括以下可选条目中的一个或多个:

/assets/
/libs/name.jar
/jni/abi_name/name.so (where abi_name is one of the Android supported ABIs)
/proguard.txt
/lint.jar

具体看到这里看如何创建一个Android Library:
https://developer.android.com/studio/projects/android-library.html#aar-contents

jar包跟aar包有什么区别?
jar:只包含了class文件与清单文件,不包含资源文件,如图片等所有res中的文件。
aar:包含所有资源,class以及res资源文件全部包含。

如果你只是简单实用一些类库,你可以直接使用*.jar文件,而如果你想既想使用类库,又想实用资源,那么你就可以创建一个Android Library,使用它生成的*.aar文件。

jar文件的使用方式我们应该比较熟悉了,将它复制到工程的libs目录下,然后在gradle中添加以下脚本:

dependencies {
compile fileTree(include: [‘*.jar’], dir:’libs’)
}

aar文件使用同样需要复制到libs目录下,并按照以下方式集成:

repositories {
flatDir {
dirs’libs’
}
}

dependencies {
compile(name:’your aar’, ext:’aar’)

多模块构建合并aar

这个是本文的重点,我们可以再每个module下的build/outputs/aar下找到编译生成的*.aar文件。

步骤1:
将gradle文件’fat-aar.gradle’到你的项目目录,然后apply:

apply from: ‘fat-aar.gradle’

步骤2:定义嵌入的依赖关系
你需要修改你以前依赖项,并将compile更改为embedded,作为你想要合并的aar。使用例子如下:

%title插图%num

通过以上的方式你可以将多个module生成的aar合成一个,大家可以新建一个demo工程来测试下

%title插图%num

android 打包 aar,第三方远程依赖无法打入包内

试过很多方法,fat-aar-android 打包之后,还是没有打入包内,请大佬指教

16 条回复    2021-02-02 16:36:10 +08:00
anxiousPumpkin
    1

anxiousPumpkin   69 天前

这 是不是应该贴一点信息或特征出来?
JayFang1993
    2

JayFang1993   69 天前

https://github.com/kezong/fat-aar-android 亲试有效,可能你的姿势不对
ZoteTheMighty
    3

ZoteTheMighty   69 天前

@JayFang1993 正解,打 jar 或者 aar 包时如果是远程的依赖 as 不会打进包里,要用这个插件,或者下载下来手动依赖。apk 包就可以。
chenjiajia9411
    4

chenjiajia9411   69 天前

也有可能是你开了 minifyEnabled 然后被优化掉了。
hotlook10
    5

hotlook10   69 天前

@JayFang1993
我们用的就是这个,打包的库引用了 Retrofit
集成进去之后调用会报错
java.lang.NoClassDefFoundError: Failed resolution of: Lokhttp3/HttpUrl;
at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:506)
at com.zh.pocket.base.http.impl.RetrofitCallFactory.<init>(RetrofitCallFactory.java:20)
at com.zh.pocket.base.http.impl.ApiFactory.<init>(ApiFactory.java:23)
at com.zh.pocket.base.http.impl.ApiFactory.<clinit>(ApiFactory.java:16)
at com.zh.pocket.base.http.impl.ApiFactory.create(ApiFactory.java:41)
hotlook10
    6

hotlook10   69 天前

@ZoteTheMighty 因为 retrofit 依赖 okhttp 的,所以会报上述错误,有解决方案吗

java.lang.NoClassDefFoundError: Failed resolution of: Lokhttp3/HttpUrl;
at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:506)
at com.zh.pocket.base.http.impl.RetrofitCallFactory.<init>(RetrofitCallFactory.java:20)
at com.zh.pocket.base.http.impl.ApiFactory.<init>(ApiFactory.java:23)
at com.zh.pocket.base.http.impl.ApiFactory.<clinit>(ApiFactory.java:16)
at com.zh.pocket.base.http.impl.ApiFactory.create(ApiFactory.java:41)

hotlook10
    7

hotlook10   69 天前

@anxiousPumpkin

打包的库引用了 Retrofit,集成进去之后调用会报错,因为 retrofit 依赖 okhttp 的,所以会报上述错误,请问下有解决方案吗
java.lang.NoClassDefFoundError: Failed resolution of: Lokhttp3/HttpUrl;
at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:506)
at com.zh.pocket.base.http.impl.RetrofitCallFactory.<init>(RetrofitCallFactory.java:20)
at com.zh.pocket.base.http.impl.ApiFactory.<init>(ApiFactory.java:23)
at com.zh.pocket.base.http.impl.ApiFactory.<clinit>(ApiFactory.java:16)
at com.zh.pocket.base.http.impl.ApiFactory.create(ApiFactory.java:41)

JayFang1993
    8

JayFang1993   69 天前

@hotlook10 姿势不对 我之前是可以的
hotlook10
    9

hotlook10   69 天前

@JayFang1993 换了 3 种体位了
xmt328
    10

xmt328   69 天前

不建议把外部依赖打进去,让使用方自己去导入相关依赖
HangoX
    11

HangoX   69 天前

我提供另外一个思路吧,普通发布之后,新建一个 java 项目依赖这个依赖,然后打 war 包,这个时候你这个包需要的依赖都会出现在 war 包中,只是不是都在 aar 中,但是能都导入
katana97
    12

katana97   66 天前

先把 aar 传到 maven 仓库里,再引用就有了
hotlook10
    13

hotlook10   66 天前

@katana97 这种,我不知道怎么做混淆。。。
AoEiuV020
    14

AoEiuV020   65 天前

记得某个版本 android studio 有一个相关 bug, 其他没头绪的话更新 as 试试,
AoEiuV020
    15

AoEiuV020   65 天前   ❤️ 1

https://issuetracker.google.com/issues/140508065
as3.5.0 提的 bug,3.6.0 解决的,版本在这范围的话先更新 as 再说,
hotlook10
    16

hotlook10   64 天前

@AoEiuV020 好的,谢谢,我试试
友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速