直奔主题:
本文主要解决module中引用aar包依赖报错的问题,及aar包合并打成新aar包的问题
网上有很多解决方案,基本上都很麻烦,或者需要改变项目结构,今天我提供一个最简单的实现方案。
首先,为了复现问题及解决问题,新建了一个测试项目,主app引用名为mylibrary的module,module中为了实现某些功能需要依赖aar包及相关so库。目录结构如下:
问题复现:
我们一般会按照app层集成方式,添加flatDir指定aar包目录,dependencies中添加依赖引用,如:
这样引用看上去没有问题,编译的时候就会报
* What went wrong:
Execution failed for task ':app:mergeDebugResources'.
> Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
> Could not find :test:.
Required by:
project :app > project :mylibrary
解决方案:
方案一:
将aar包集成改为jar包集成。即将aar后缀改为zip,解压出jar包及资源文件(如果有),将jar包及资源文件(如果有)复制到相应的目录,按照jar包的方式集成。如果aar包中有通过R.id./R.layout.等方式调用资源文件,这种集成方式可能会报资源文件找不到。
方案二:
module中引用aar包,需要在project的build中配置路径,flatDir { dirs '../mylibrary/libs' }或者flatDir { dirs project(':mylibrary').file('libs') },如:
需要注意的是,如果你更新了新版gradle需要改为在settings.gradle中配置,如:
上面方案就是解决在module中依赖aar包编译或运行报错的问题。
新的问题:
上面提供的方案虽然能解决本项目中集成报错问题,但是如果你想将module打成aar包供其他项目使用,你会发现module中引用的aar包是打不进去的。
解决方案:
方案一:
上面说的将aar包集成改为jar包集成也是可以的。需要注意的是如果aar包中有通过R.id./R.layout.等方式调用资源文件,这种集成方式可能会报资源文件找不到,需要自己测试。
方案二:
使用第三方的fat-aar。导入方式:
①在根目录build的dependencies中添加
classpath 'com.github.kezong:fat-aar:1.3.6'
添加示例如:
②在module的build plugins中添加
id 'com.kezong.fat-aar'
添加示例:
③修改依赖方式为embed,添加示例:
重新打包即可得到合并后的aar包,完整的示例demo已上传,可以点击合并aar包示例demo下载