Android上传aar到jcenter的正确姿势

Android上传aar到jcenter的正确姿势

常规操作

Android Studio 上传aar(Library)到JCenter - 简书

完成上述操作后可以成功把aar上传到jcenter。但是有个问题——aar的依赖传递问题,下面会详细描述,这里以我的commonlib项目为例。

这个库用于快速构建android工程,如果想快速构建一个app而不在意依赖的aar细节时,可以使用本库进行快速开发。

问题描述

按照上述的方式打包aar后我们可以在工程里方便使用:

1
implementation 'com.sonicers:commonlib:0.0.8'

但是sync后会发现,ide报出没找到OkHttp包等的问题,因为这个库依赖了OkHttp等包

1
2
3
4
5
6
// 网络
api 'com.squareup.okhttp3:okhttp:3.10.0'
api 'com.squareup.okhttp3:logging-interceptor:3.10.0'
api 'com.squareup.retrofit2:retrofit:2.3.0'
api 'com.squareup.retrofit2:converter-gson:2.3.0'
api 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

gradle默认是不会把lib里面的依赖传递进来的,这就是依赖传递问题

我们需要添加一个属性:

1
2
3
implementation('com.sonicers:commonlib:0.0.8') {
transitive = true//依赖传递为true时才能把依赖的库打进去
}

加了以后,嗯,发现没什么卵用 (⊙ө⊙),嗯,基本操作,程序员天天遇到。。。

原因在于使用上述上传aar到jcenter的常规操作,没有把依赖信息打进pom.xml。关于pom文件的用处,可以网上自己搜搜。可以参考

Android-少不了的 AAR 文件常识,最好知道的注意事项

Google Android Studio 的负责人在 stackoverflow 上解释了 为什么 Android Studio 不能将多个依赖打包进一个 AAR 文件的原因,是因为将不同的library打包在一起,涉及到资源和配置文件智能合并,所以是个比较复杂的问题,同时也容易造成相同的依赖冲突。

虽然Google爸爸这么说,但是加入依赖信息会使我们使用起来方便很多,只要引用我们的库,就可以把其他依赖的库引用进来。那怎么把依赖信息打进pom文件呢? (๑•̀ㅂ•́)و✧

骚操作

首先看下常规操作所用的插件

1
2
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'

这两个插件的官网

jfrog.bintray,这个个人理解是上传到jcenter的插件

android-maven-gradle-plugin,maven adnroid aar打包插件

可以看到android-maven-gradle-plugin对这个插件的描述是已经过时的,这个插件默认是不把dependency信息打进pom文件的。

so,我们抛弃android-maven-gradle-plugin插件,使用maven插件,这是关键,对于jfrog.bintray如何结合maven使用,在jfrog.bintray上有详细的描述和demo。

直接看gradle pluin 3.0的demo,这个demo有两个坑。

第一,

使用

1
2
user = project.hasProperty('bintrayUser') ?: System.getenv('BINTRAY_USER')
key = project.hasProperty('bintrayApiKey') ?: System.getenv('BINTRAY_API_KEY')

是读取不到local.properties里面的内容的

正确姿势:

1
2
3
4
Properties propertyReader = new Properties()
propertyReader.load(new FileInputStream("${rootDir}${File.separator}local.properties"))
user = propertyReader.bintrayUser.toString()
key = propertyReader.bintrayApiKey.toString()

第二,

需要把dryRun = true去掉,文档解释:

1
dryRun = false //[Default: false] Whether to run this as dry-run, without deploying

这个demo仔细看应该是开发人员随便写的,没有验证过,这两个坑需要改过来,可以直接参照我的commonlib的upload.gradle,这个脚本还额外加了sources和javadoc的上传,符合jcenter的规范。另外一些路径的东西需要根据自己的具体配置修改,这里不赘述。

其他

使用maven插件可以自定义写pom文件,通过一些本地配置去控制写dependency或者不写,这里没有示例,有兴趣可以自行研究。

如果是上传到自己的pixel仓库需要自己去修改一些脚本的配置,暂时没做过,我就不吹牛逼了。

另外,非常感谢文中链接的作者。站在巨人的肩膀上٩(•̤̀ᵕ•̤́๑)ᵒᵏᵎᵎᵎᵎ

扩展链接

利用 gradle 多 aar 发布私有 maven