生成 AAR 包

在Android Studio Terminal 窗口输入以下命令:

./gradlew :monitor:assembleRelease
  • 1.

monitor 换成你子模块的名称,不出意外的话 就会在下面目录生成相应aar文件

安卓将子模块打aar包,并将其远程依赖打包进去_android

注意:如果你的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
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

这个文件原本只有 plugins 块,把 buildscript 放进去就行

Step 2: 添加插件 在你想要打包的子Moudlebuild.gradle 中 添加 id 'com.kezong.fat-aar'

plugins {
    id 'com.android.library'
    id 'com.kezong.fat-aar'
}
  • 1.
  • 2.
  • 3.
  • 4.

也有可能你项目是这种写法: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'
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

然后运行上面 生成 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
  • 1.
  • 2.
  • 3.

然后 BUILD SUCCESSFUL 你会发现aar包 比原来胖了一圈,不出意外你就可以拿着aar包 愉快地玩耍了

当然,不出意外是不可能的,导入, 运行, 啪! 又报错🤦♂️

看log又是相关类找不到。我不是都打包进去了吗?怎么还找不到!

以上面 'com.arthenica:ffmpeg-kit-full:6.0-2'举例

如果要在项目中依赖的话,确实没什么问题,因为它如果依赖了别的文件的话,会自动下载的,而打包成aar文件它就不会下载了,这时候就缺少了相关文件,怎么办呢?分析吧

打开External Libraries文件夹,可以看到 多了 exception-javaexception-common 这两个库

安卓将子模块打aar包,并将其远程依赖打包进去_android_02

把这两个库 像上面Step 3 那样 放进去就行了,然后再回到最初 生成 AAR 包

关机 跑路 一气呵成 emm... 跑题了😆

编译 运行 啪!成了😁,特,属予作文以记之。