前语:咱们在开发sdk时,经常会需要将产物aar上传到maven库中,而sdk又需要依靠一些公共模块或许第三方库,这个时分简略的使用implementation就会呈现问题,一是无法将依靠的公共模块打包进sdk中,二是将依靠的第三方库比如gson打包进aar后,他人依靠时又会呈现版别冲突(duplicated class),如果不将第三方库打进aar,他人依靠时又有必要单独引进,很是费事。本文介绍了一种比较高雅的方法,解决了这样的问题。

直接上终究解决方案:

  1. 在项目的build.gradle中增加fataar:
repositories {
    dependencies {
        classpath 'com.github.kezong:fat-aar:1.3.6'
    }
}
  1. 在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中了。

  1. 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文件中的版别。

  1. 一般情况下,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就能够主动依靠本地模块了。