如何在com.android.library模块中引用多个aar制品?
Android 本地多AAR依赖落地实现
两种失败方案的根因
- 复合构建(
includeBuild)方案失效:参考的单AAR实现没有处理多AAR之间的内部依赖链路,多个同属一个SDK的AAR本身存在依赖层级,复合构建默认不会自动推导这种内部依赖关系,自然无法解析制品。 - 单AAR对应独立模块方案报错:
attr/shimmer_auto_start属性找不到的核心原因是,配置时只引入了AAR本体,没有补全AAR自身依赖的第三方库。报错里提到的shimmer是独立的开源控件库,对应AAR运行、资源编译都需要这个库的支持,缺失依赖时AAPT编译资源就会抛出属性不存在的错误。同时单AAR单模块的方案本身存在资源命名空间隔离的问题,跨AAR资源引用很容易出现额外的编译错误,不推荐使用。
可直接复用的实现方案
根据项目封装需求二选一即可,不需要依赖任何外部Maven仓库的SDK制品。
方案1:直接引用(配置成本最低)
适合不需要对SDK做额外封装、直接在业务模块使用的场景:
- 在需要引用SDK的Android Library模块根目录,新建
aars文件夹,将所有属于该SDK的.aar文件全部放入该目录 - 修改模块下的
build.gradle文件,和android配置块平级添加flatDir仓库声明:
repositories { flatDir { dirs 'aars' } }
- 在
dependencies配置块中按依赖层级引入所有AAR:被其他AAR依赖的底层AAR放在依赖列表靠后的位置,同时补全AAR对应的第三方传递依赖,解决资源、类找不到的问题:
dependencies { // 上层业务AAR靠前,基础底层AAR靠后 implementation(name: 'sdk-ui-1.2.3', ext: 'aar') implementation(name: 'sdk-core-1.2.3', ext: 'aar') implementation(name: 'sdk-common-1.2.3', ext: 'aar') // 补全传递依赖,对应解决shimmer属性找不到的报错 implementation 'com.facebook.shimmer:shimmer:0.5.0' // 其余传递依赖根据编译报错提示补全即可 }
如果不确定AAR之间的依赖顺序,直接根据编译报错调整即可:编译时提示哪个AAR里的类/资源缺失,就把对应AAR往依赖列表的后方移动。
方案2:聚合模块封装(适合隔离SDK逻辑)
适合需要把SDK和业务逻辑完全隔离、后续统一升级SDK的场景:
- 新建一个空的Android Library模块(例如命名为
sdk-bundle),删除模块内默认生成的测试、布局、代码文件 - 和方案1一致,在该模块根目录新建
aars文件夹放入所有AAR,添加flatDir仓库声明 - 修改该模块的
build.gradle,在dependencies块中用api配置(不要用implementation)引入所有AAR和对应的传递依赖,保证其他模块引用该聚合模块时能正常访问SDK的所有类和资源:
dependencies { api(name: 'sdk-ui-1.2.3', ext: 'aar') api(name: 'sdk-core-1.2.3', ext: 'aar') api(name: 'sdk-common-1.2.3', ext: 'aar') api 'com.facebook.shimmer:shimmer:0.5.0' // 其余传递依赖补全 }
- 在需要使用SDK的业务模块中,只需要依赖这个
sdk-bundle聚合模块即可,不需要单独引入任何AAR文件。
编译问题排查规则
- 抛出AAPT资源/属性找不到错误:优先检查对应AAR的第三方传递依赖是否补全,根据报错的属性、资源名找到对应的依赖库添加即可
- 抛出类找不到(
NoClassDefFoundError/ClassNotFoundException):先检查AAR的依赖顺序是否正确,再检查是否漏加对应类所属的传递依赖 - 不要使用单AAR对应独立模块的方案,多模块的资源命名空间隔离机制会大幅提升多AAR场景的配置成本,极易出现跨模块资源引用失败的问题。
内容的提问来源于stack exchange,提问作者JJD
相关产品推荐
相关产品推荐

