之前写过一个如何打包嵌套第三方jar包的jar包,现在又搞了一把aar,齐活了。。。
开发过程中需要将自己开发的项目Screen(包含资源文件)以aar的形式提供给同事,但是打包的时候会发现,Screen项目中依赖的Weather.aar中的代码并没有一块打包进来。。。
解决这个问题,我使用的是fat-aar工具,参考博客图解使用fat-aar方式在AndroidStudio中打包嵌套第三方aar的aar,博客很详细。主要步骤如下:
1、Screen代码库app下的build.gradle中加入:
apply plugin: 'com.android.library'
apply plugin: 'com.kezong.fat-aar'//添加fat-aar
2、Screen代码库app下的build.gradle中,将下面的dependencies中aar导入代码修改下:
//implementation files ('Weather-release.aar')
embed (name:'Weather-release',ext:'aar')
3、Screen整个项目下的build.gradle文件中,添加fat-aar classpath和flatDir:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
// 配置fat包依赖
classpath 'com.github.kezong:fat-aar:1.3.6'
}
}
allprojects {
repositories {
//配置fat包依赖
flatDir{
dirs 'libs'
}
google()
jcenter()
}
}
4、R文件合并问题:
此时Weather-release.aar代码在Screen项目打包的时候都会包含在内,但是此时如果调用到的Weather包中的资源文件会报错,提示找不到,这个问题是参考Android 多 Module 合并打包 AAR这个文章提到的R文件合并问题。
问题原因:
R 文件合并问题:如果打包模块和依赖的模块中都存在资源文件,也就是存在 R 文件的引用,这是需要注意 R 文件合并的问题。因为一个 ARR 包只会存在一个 R 文件,使用 fat-aar 打包时会把依赖模块中的 R 文件进行合并,但是因为原先模块中导入的 R 文件包名还是之前的模块的,所以会存在找不到 R 文件的错误。
问题解决方案:
R 文件是根据 AndroidManifest.xml 文件的 package 字段内容来生成的对应包名的,比如 module 中 AndroidManifest.xml 的 package 指定为 com.xx.xxx 时,那么该 module 内的 R 文件导包就是:import com.xx.xxx.R 了。我们可以利用这一点,把所有需要打包的 module 的 package name 改成统一的名称,这样的话,所有 R 文件导包就变成一致的了,就算合并后的 AAR 中只存在一个 R 文件也不会存在找不到的问题。
为了避免不同模块使用相同包名导致的编译失败的问题,我们可以使用 enforceUniquePackageName = false 配置各个 module 的 build.gradle 文件,这样可以不强制各 module 使用唯一包名。
我的做法是引用R文件的地方改了下包名。改成了Weather项目中的包名解决这个问题。
5、打包aar时把依赖的jar打包进aar中
如果打包aar项目时,还想把项目中引入的jar包一块打包,需要在app下的build.gradle中使用如下方式导入,参考打包aar时把依赖的jar打包进aar中这篇文章。
//C方法
dependencies {
……
implementation files ('libs/fastjson-1.1.71.android.jar')
}
6、aar修改后,例如新加了代码和包,但是aar复制替换后测试,找不到新加的类:
原因:缓存中还是原来aar的代码,新的没有替换进去。
解决方法1:
File->Sync Project with Gradle Files重新加载下
解决方法2:
app/gradle中配置引用libs下sdk的时候,按如下方式:
implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'])
下次再更新aar包的时候,改个名称替换进去,最好每次aar包都能带个版本号,这样每次替换都是新的版本,名字不会重复。
如果看完这篇你还是没明白或者打包过程中出现其他问题,可以去参考下如下几篇文章,可能会有所启发。
参考文章:
【填坑往事】图解使用fat-aar方式在AndroidStudio中打包嵌套第三方aar的aar
Android 多 Module 合并打包 AAR
打包aar时把依赖的jar打包进aar中
ANDROID STUDIO 生成AAR和引用AAR
问题解决:Android Studio aar 导入后找不到类