安卓将子模块打aar包,并将其远程依赖打包进去
这时你会发现aar包并不大,甚至只有几十kb,如果你的子moudle 没使用第三方依赖的话,你会发现使用时没什么问题,如果有第三方依赖的话,它还是不大,甚至编译期也不会报错 ,但你运行时就会报错依赖找不到。如果要在项目中依赖的话,确实没什么问题,因为它如果依赖了别的文件的话,会自动下载的,而打包成aar文件它就不会下载了,这时候就缺少了相关文件,怎么办呢?代码写的,好家伙,源码的和说明文档的写法不
生成 AAR 包
在Android Studio Terminal 窗口输入以下命令:
./gradlew :monitor:assembleRelease
把 monitor
换成你子模块的名称,不出意外的话 就会在下面目录生成相应aar文件
注意:如果你的Java运行环境是Java 8 则在老一点的AS上 可以运行打包成功,在较新一点的AS上会打包报错,主要是新的AS要求的环境变量 都Java 11 以上了,可以考虑配个环境,再打包或者使用较旧的AS如 2021版本的。
🆗,到这里没什么压力
这时你会发现aar包并不大,甚至只有几十kb,如果你的子moudle 没使用第三方依赖的话,你会发现使用时没什么问题,如果有第三方依赖的话,它还是不大,甚至编译期也不会报错 ,但你运行时就会报错依赖找不到。
其实你在打aar包的时候并没有把第三方库 打包进去,这还搞个🔨
不要慌,继续往下看👇
将远程依赖打包进aar中
介绍下我们的主角:fat-aar-android
链接如下
https://github.com/kezong/fat-aar-android?tab=readme-ov-file
一个gradle插件,它可以将依赖项合并到最终的aar文件中,并与agp3 .+一起工作
由于作者不维护了最终支持版本为 AGP 3.0 - 7.1.0
,和 Gradle 4.9 - 7.3
在新项目上会报错,这不是重点,还是有大佬fork版本呢
下面这个库还在继续维护,gradle 版本大于 4.9 - 7.3
可以使用这个库
https://github.com/aasitnikov/fat-aar-android
我照着使用文档搞的,好像报错了,就按着example
代码写的,好家伙,源码的和说明文档的写法不一样,懵了,就试着搞了一下,编译通过🤭,如过你照着使用文档弄,可以通过的话就忽略下面代码把!
Step 1: 将下面的代码段添加到root build
中:
就是你项目的根build.gradle
文件,不是app
下的哦
buildscript {
repositories {
mavenCentral()
google()
jcenter()
maven { url "https://plugins.gradle.org/m2/" }
}
dependencies {
classpath 'com.github.kezong:fat-aar:1.3.8'
}
}
plugins {
id 'com.android.application' version '7.0.2' apply false
id 'com.android.library' version '7.0.2' apply false
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
}
这个文件原本只有 plugins
块,把 buildscript
放进去就行
Step 2: 添加插件
在你想要打包的子Moudle 的build.gradle
中 添加 id 'com.kezong.fat-aar'
plugins {
id 'com.android.library'
id 'com.kezong.fat-aar'
}
也有可能你项目是这种写法:apply plugin: 'com.kezong.fat-aar'
都一样
Step 3: Embed 依赖
就是把你引入的第三方依赖 从 implementation xxx
换成 embed xxx
效果如下:
dependencies {
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
embed 'com.lzy.net:okgo:3.0.4'
// ffmpeg
embed 'com.arthenica:ffmpeg-kit-full:6.0-2'
embed 'com.arthenica:smart-exception-java:0.2.1'
embed 'com.arthenica:smart-exception-common:0.2.1'
// util
embed 'com.blankj:utilcodex:1.31.1'
// gson
embed 'com.google.code.gson:gson:2.8.6'
}
然后运行上面 生成 AAR 包 的指令,就会看下像下面的打印
[fat-aar][embed detected][aar]com.lzy.net:okgo:3.0.4
[fat-aar][embed detected][aar]com.arthenica:ffmpeg-kit-full:6.0-2
[fat-aar][embed detected][aar]com.blankj:utilcodex:1.31.1
然后 BUILD SUCCESSFUL 你会发现aar包 比原来胖了一圈,不出意外你就可以拿着aar包 愉快地玩耍了
当然,不出意外是不可能的,导入, 运行, 啪! 又报错🤦♂️
看log又是相关类找不到。我不是都打包进去了吗?怎么还找不到!
以上面 'com.arthenica:ffmpeg-kit-full:6.0-2'
举例
如果要在项目中依赖的话,确实没什么问题,因为它如果依赖了别的文件的话,会自动下载的,而打包成aar文件它就不会下载了,这时候就缺少了相关文件,怎么办呢?分析吧
打开External Libraries文件夹,可以看到 多了 exception-java
和 exception-common
这两个库
把这两个库 像上面Step 3 那样 放进去就行了,然后再回到最初 生成 AAR 包
关机 跑路 一气呵成 emm… 跑题了😆
编译 运行 啪!成了😁,特,属予作文以记之。
其他:
打aar包时,想要自定义包版本号和文件名可以看这篇文章:https://blog.csdn.net/Jason_Flash/article/details/122985517
重复类问题
如果你打包的子模块中使用了某三方库,同时你的主模块也包含了该库的话,就会报错重复类问题,要么你的主模块去依赖aar包里的三方库,要么aar包去除该库,但是,一般为了aar包 给别的项目通用,尽量少包含其他三方库,能用原生写 尽量用原生,避免乱七八糟的适配问题!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)