之前写过一个如何打包嵌套第三方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重新加载下


相关资料:https://blog.csdn.net/kongqwesd12/article/details/117529541

**解决方法2**:  
app/gradle中配置引用libs下sdk的时候,按如下方式:

    implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'])

下次再更新aar包的时候,改个名称替换进去,最好每次aar包都能带个版本号,这样每次替换都是新的版本,名字不会重复。

如果看完这篇你还是没明白或者打包过程中出现其他问题,可以去参考下如下几篇文章,可能会有所启发。

发表评论

邮箱地址不会被公开。 必填项已用*标注