如何在自制的AAR文件中包含依赖项?
如何将依赖项打包进AAR文件
默认情况下,Android的AAR文件不会包含开发时依赖的第三方库或模块,只会在对应的POM文件中声明依赖关系。如果需要把依赖直接打包进AAR(也就是构建「Fat AAR」),可以用以下两种方式实现:
方法一:手动编写Gradle任务合并依赖(无需第三方插件)
适用于不想引入额外插件,希望完全自定义打包逻辑的场景。在你的Library模块的build.gradle(Groovy DSL)中添加以下配置:
android { // 保留你原有的编译、签名等配置 defaultConfig { // ... } buildTypes { // ... } // 为每个变体构建Fat AAR任务 libraryVariants.all { variant -> variant.outputs.each { output -> // 创建自定义任务,命名规则为assemble[变体名]FatAar,比如assembleReleaseFatAar def fatAarTask = tasks.create( name: "assemble${variant.name.capitalize()}FatAar", type: Jar ) { // 先把原AAR的所有内容加进来 from zipTree(output.outputFile) // 遍历编译依赖,合并所有Jar包 configurations.compileClasspath.each { file -> if (file.name.endsWith('.jar')) { from zipTree(file) } } // 处理本地AAR依赖,提取其中的classes.jar合并进来 configurations.compileClasspath.each { file -> if (file.name.endsWith('.aar')) { from zipTree(file).matching { include 'classes.jar' } } } // 设置输出文件名和目录 archiveFileName.set("${variant.baseName}-fat.aar") destinationDirectory.set(file("$buildDir/outputs/aar/fat")) } // 让Fat AAR任务依赖原有的assemble任务,确保先完成常规构建 fatAarTask.dependsOn variant.assembleProvider.get() } } }
配置完成后,运行对应的Gradle任务(比如./gradlew assembleReleaseFatAar),就能在build/outputs/aar/fat/目录下拿到包含依赖的Fat AAR。
方法二:使用第三方Fat AAR插件
如果觉得手动编写任务太繁琐,可以用成熟的第三方插件简化流程,比如fat-aar-android:
- 在项目根目录的
build.gradle中添加插件依赖:
buildscript { repositories { mavenCentral() } dependencies { classpath 'com.kezong:fat-aar:1.3.8' } }
- 在Library模块的
build.gradle中应用插件,并将需要打包进AAR的依赖用embed替代implementation:
apply plugin: 'com.kezong.fat-aar' dependencies { // 用embed标记需要打包进AAR的远程依赖 embed 'com.squareup.okhttp3:okhttp:4.10.0' // 本地模块依赖也可以用embed embed project(path: ':your-local-library-module') // 不需要打包的依赖依然用implementation声明 implementation 'androidx.core:core-ktx:1.10.1' }
运行常规的assembleRelease或assembleDebug任务,生成的AAR就会包含所有用embed声明的依赖。
注意事项
- 避免依赖冲突:如果Fat AAR包含的依赖和使用方项目的依赖版本不一致,很可能导致编译失败或运行时崩溃。建议只打包自己维护的本地模块,或版本稳定、兼容性强的基础依赖。
- 不要打包系统级依赖:比如AndroidX、Jetpack组件这类通用库,通常由使用方自行引入,强行打包会增加AAR体积,还容易引发冲突。
- 验证打包结果:可以用解压工具打开生成的AAR,检查
classes.jar或libs目录下是否包含了目标依赖的内容,确保打包成功。
内容的提问来源于stack exchange,提问作者Mustafa Maden
相关产品推荐
相关产品推荐

