Android Studio中利用fat-aar实现多级依赖aar的合并打包实战
1. 为什么需要fat-aar合并打包在Android开发中我们经常会遇到这样的场景你开发了一个功能模块比如天气组件Weather.aar这个模块又依赖了第三方aar比如图表库Chart.aar。当你把Weather.aar提供给其他团队使用时他们不仅需要引入你的aar还要手动添加Chart.aar的依赖这显然不够优雅。我去年就踩过这个坑。当时给业务部门封装了一个视频播放SDK打包成aar后发给他们结果运行时各种ClassNotFoundException。排查后发现是SDK内部依赖的FFmpeg解码库没有被打包进去。这种多级依赖的场景正是fat-aar要解决的痛点。fat-aar的工作原理就像它的名字一样——把依赖喂胖。它会递归分析所有层级的依赖关系将子module、第三方aar、甚至远程仓库的依赖全部内嵌到最终的aar文件中。这样使用者只需要引入这一个胖aar就能获得完整功能。2. 基础环境配置2.1 插件版本选择首先要注意版本兼容性问题。根据我的实测经验Android Gradle Plugin 3.5.x ~ 4.2.x 建议使用fat-aar 1.3.6AGP 7.0 需要搭配fat-aar 1.3.8最新版AGP 8.0目前兼容性还不稳定建议在项目根目录的build.gradle中添加依赖buildscript { repositories { google() mavenCentral() } dependencies { classpath com.android.tools.build:gradle:7.4.2 classpath com.github.kezong:fat-aar:1.3.8 } }2.2 仓库配置在allprojects闭包中添加flatDir配置否则会找不到本地aarallprojects { repositories { flatDir { dirs libs // 指定本地aar存放目录 } google() mavenCentral() } }3. 多级依赖合并实战3.1 单层aar嵌入假设主模块app依赖本地Weather.aar最简单的配置如下apply plugin: com.kezong.fat-aar dependencies { // 普通依赖方式不会打包进aar // implementation(name: Weather-release, ext: aar) // fat-aar嵌入方式 embed(name: Weather-release, ext: aar) }这种场景下生成的app模块aar会包含Weather的全部代码和资源。3.2 多级嵌套依赖更复杂的场景是依赖链app → ModuleA → ModuleB → thirdparty.aar。这时需要在每一级都使用embed声明// ModuleA的build.gradle dependencies { embed project(:ModuleB) embed(name: thirdparty, ext: aar) } // ModuleB的build.gradle dependencies { embed com.squareup.okhttp3:okhttp:4.9.3 // 远程库也可以嵌入 }注意子module必须应用fat-aar插件否则嵌入会失效。4. R文件冲突解决方案4.1 问题现象合并后运行时可能会报错java.lang.NoClassDefFoundError: Failed resolution of: Lcom/weather/R$drawable;这是因为各模块的R文件包名不一致导致的。比如主模块R文件com.example.app.R子模块R文件com.weather.lib.R4.2 终极解决方案统一包名修改各模块的AndroidManifest.xmlmanifest packagecom.example.sdk关闭包名校验可选android { enforceUniquePackageName false }代码中统一引用import com.example.sdk.R;我在实际项目中采用方案13的组合虽然要修改历史代码但一劳永逸。方案2适合快速修复但可能带来其他编译问题。5. 高级配置技巧5.1 资源合并策略通过resPrefix避免资源命名冲突android { resourcePrefix weather_ }这样所有资源会被自动重命名比如原ic_icon → weather_ic_icon原bg_main → weather_bg_main5.2 排除特定依赖如果不想嵌入某些依赖可以这样配置dependencies { embed(com.squareup.retrofit2:retrofit:2.9.0) { exclude group: com.squareup.okhttp3 } implementation com.squareup.okhttp3:okhttp:4.9.3 }5.3 缓存问题处理更新aar后可能出现类找不到的问题解决方法修改build.gradle配置implementation fileTree(dir: libs, include: [*.aar, *.jar])或者给aar添加版本号embed(name: Weather-1.2.0, ext: aar)6. 常见问题排查6.1 依赖版本冲突在app模块添加强制版本声明configurations.all { resolutionStrategy { force com.google.code.gson:gson:2.8.9 } }6.2 重复类错误检查是否同时使用了embed和implementation声明同一个依赖// 错误示例 embed com.google.code.gson:gson:2.8.9 implementation com.google.code.gson:gson:2.8.9 // 正确做法 embed com.google.code.gson:gson:2.8.96.3 插件兼容性问题如果遇到Transform异常可以尝试升级AGP版本在gradle.properties中添加android.enableJetifiertrue7. 性能优化建议按需嵌入只embed必要的依赖使用proguard混淆android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile(proguard-android.txt) } } }分模块打包将稳定不变的依赖拆分成独立aar我在电商项目中实践发现合理使用fat-aar可以使SDK体积减少30%以上。最关键的是要分析清楚依赖关系避免无脑embed所有依赖。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2476951.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!