因为未来公司的项目会需要聚合一些三方sdk生成自己的sdk,所以近期在整理公司现有的一些三方sdk并尝试聚合生成自己的sdk。在生成aar测试的时候遇到了一些问题,在此记录一下。
AndroidStudio生成aar的方式
1.可以选择新建项目或者用旧项目改造,需要将AndroidManifest中Application标签中的属性都删掉(如果需要保留的话,得处理好引入到主项目后,合并Manifest时可能会发生的冲突问题),若使用旧项目的话AndroidManifes中Application内的主activity,需要把intent-filter的内容去除。
2.在app module的build.gradle中,把com.android.application pulgins 改成 com.android.library pulgins,以及去除defaultConfig中的applicationId。
3.使用Gradle中的assemble构建项目。
4.构建完成后会在app module的build/outputs/aar中找到生成的aar文件。
遇到的问题
我在之前的工作中也构建过aar供其他项目使用,但在之前构建aar的时候我的项目中没有包含第三方的aar,而且也不需要在其他项目中使用我的aar中依赖的第三方包。 所以,这次的尝试很明显的是失败了,所幸解决方法并不难找,在网上找到解决的方案后我尝试了一下,成功在包含第三方aar的情况下生成了我自己的aar包,并且在其他项目中测试了aar中包含的第三方依赖的可用性,结果成功了,所以在此记录一下方案。
解决方案
1.针对项目中包含第三方aar问题
这里使用的是 github.com/kezong/fat-… 库。
在项目级的 build.gradle中添加fat-aar的依赖。
在app module的build.gradle中添加fat-aar插件,并用embed替换implementation关键字来引入你想一起打包的三方aar,然后就可以使用assemble来构建aar。
2.针对其他项目无法使用aar中的第三方依赖问题。
针对这个问题找到的解决方式有两种,一是把所有三方依赖都改成用jar包或aar的方式引入项目,这种方式明显不合理。二是使用maven,远程本地都可以,我这边尝试了本地maven的方式。
在app module中添加 maven-publish插件。
同时添加如下代码,其中repositories中的url 即是你想要输出所生成文件的路径。
publications {
maven(MavenPublication) {
groupId 'com.xxxxxx.xxxxxxx'
artifactId 'xxxxxx'
version '1.0.0'
artifact "$buildDir/outputs/aar/zzzzz.aar"
pom.withXml {
def dependenciesNode = asNode().appendNode('dependencies')
configurations.implementation.allDependencies.each { dependency ->
if (!"unspecified".equals(dependenciesNode.name)) {
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', dependency.group)
dependencyNode.appendNode('artifactId', dependency.name)
dependencyNode.appendNode('version', dependency.version)
}
}
}
}
}
repositories {
maven {
url "/Users/xxxx/AndroidStudioProjects/mavenLocal"
}
}
}
复制代码
添加完后构建一下项目,然后可以在Gradle中使用publish,等publish完成后可以在对应的文件夹找到aar文件和pom文件。
接着在需要使用aar的项目的 项目级build.gradle 中添加本地的maven路径。
在需要使用aar的项目的app moudle中如下引入aar即可。