直奔主题:

本文主要解决module中引用aar包依赖报错的问题,及aar包合并打成新aar包的问题

网上有很多解决方案,基本上都很麻烦,或者需要改变项目结构,今天我提供一个最简单的实现方案。

首先,为了复现问题及解决问题,新建了一个测试项目,主app引用名为mylibrary的module,module中为了实现某些功能需要依赖aar包及相关so库。目录结构如下:

airtest 如何将代码打包成apk airtest打包apk无法运行_android studio

问题复现:

我们一般会按照app层集成方式,添加flatDir指定aar包目录,dependencies中添加依赖引用,如:

airtest 如何将代码打包成apk airtest打包apk无法运行_airtest 如何将代码打包成apk_02

 这样引用看上去没有问题,编译的时候就会报

* 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

airtest 如何将代码打包成apk airtest打包apk无法运行_android_03

解决方案:

方案一:

将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') },如:

airtest 如何将代码打包成apk airtest打包apk无法运行_笔记_04

需要注意的是,如果你更新了新版gradle需要改为在settings.gradle中配置,如:

airtest 如何将代码打包成apk airtest打包apk无法运行_笔记_05

 上面方案就是解决在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'

添加示例如:

airtest 如何将代码打包成apk airtest打包apk无法运行_airtest 如何将代码打包成apk_06

 ②在module的build plugins中添加

id 'com.kezong.fat-aar'

添加示例:

airtest 如何将代码打包成apk airtest打包apk无法运行_笔记_07

③修改依赖方式为embed,添加示例:

airtest 如何将代码打包成apk airtest打包apk无法运行_android studio_08

 重新打包即可得到合并后的aar包,完整的示例demo已上传,可以点击合并aar包示例demo下载