前语:咱们在开发sdk时,经常会需要将产物aar上传到maven库中,而sdk又需要依靠一些公共模块或许第三方库,这个时分简略的使用implementation
就会呈现问题,一是无法将依靠的公共模块打包进sdk中,二是将依靠的第三方库比如gson打包进aar后,他人依靠时又会呈现版别冲突(duplicated class),如果不将第三方库打进aar,他人依靠时又有必要单独引进,很是费事。本文介绍了一种比较高雅的方法,解决了这样的问题。
直接上终究解决方案:
- 在项目的build.gradle中增加fataar:
repositories {
dependencies {
classpath 'com.github.kezong:fat-aar:1.3.6'
}
}
- 在lib的module模块的build.gradle中这样增加依靠:
plugins {
id 'com.android.library'
}
apply plugin: 'com.kezong.fat-aar'
apply from: 'upload.gradle'
....
....
dependencies {
implementation "com.squareup.okhttp3:okhttp:$okhttpVersion"
api "com.google.code.gson:gson:$gsonVersion"
if(isSdkMode.toBoolean()){
embed project(":base")
} else {
api project(":base")
}
}
使用embed
替换之前的implementation
或许api
就能够将base模块打包进aar中了。
- upload.gradle是用来将lib库打包上传的maven的工具,首要解决办法也是在这个文件里实现的。先上代码:
apply plugin: 'maven-publish'
def USERNAME = "xiaoqiang"
def PASSWORD = "xiaoqiang"
def REPOSITORY_URL = "https://xiaoqiang.com/test-snapshot/"
publishing {
publications {
Production(MavenPublication) {
groupId = "com.example.xiaoqiang"
artifactId = "xiaoqiang"
version = "$sdkVersion"
afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) }
pom.withXml {
def dependencies = asNode().appendNode('dependencies')
def dependency = dependencies
.appendNode("dependency")
dependency.appendNode("groupId", "com.squareup.okhttp3")
dependency.appendNode("artifactId", "okhttp")
dependency.appendNode("version", "$okhttpVersion")
dependency = dependencies
.appendNode("dependency")
dependency.appendNode("groupId", "com.google.code.gson")
dependency.appendNode("artifactId", "gson")
dependency.appendNode("version", "$gsonVersion")
}
}
}
repositories {
maven {
url REPOSITORY_URL
credentials {
username = USERNAME
password = PASSWORD
}
allowInsecureProtocol true
}
}
}
这儿需要留意的是:snapshot版别的版别姓名有必要带snapshot,否则会上传失败。这样做的原理其实便是将第三方依靠写进aar的pom文件中,他人以maven方式长途依靠咱们的sdk时,gradle会主动拉下来pom文件中的依靠版别。另外,如果外部也依靠了gson的话,版别不一致也不会呈现冲突,外部引证用的是外部的版别,sdk用的是pom文件中的版别。
- 一般情况下,app模块会作为demo调试用,这个时分在app的build.gradle中能够这样配置:
dependencies {
//引证 sdk
if (sdkMode.toBoolean()) {
implementation("com.example.xiaoqiang:xiaoqiang:$sdkVersion")
} else {
implementation project(":sdk")
}
}
当然,在增加依靠时,也要在setting.gradle中声明库地址,包括aar发布的地址以及依靠的第三方库的地址:
repositories {
google()
mavenCentral()
maven {
allowInsecureProtocol true
url 'http://****.*****.com/repository/maven-public/'
}
maven {
url 'https://maven.aliyun.com/repository/public/'
}
}
其中sdk的版别号及第三方依靠的版别我都抽离出来放在gradle.properties文件中了,由于这儿能够定义一些全局变量,这样在每次发布aar时只需要在这一个文件里修改变量的值就能够啦。
sdkMode=true
sdkVersion=0.0.1-SNAPSHOT
gsonVersion=2.10
okhttpVersion=4.10.0
到此已经全部配置完结。改一下sdkVersion的值,在gradle点一下publish就能够将sdk上传到maven库了,然后在sync一下,就能够把刚刚上传的sdk拉下来验证了。留意:sdkMode的值在publish时有必要是true。
本地调试时,只需要将sdkMode改为false就能够主动依靠本地模块了。