分拆代码的过程中需要把核心代码编译成一个库上传到内部maven服务器上,所以研究了一下上传私库的方法。
首先拆分的是工具类库,这个库和java的库类似,没有配置flavors,所以按照网上通用的方法引入maven插件就可以了。
pply plugin: 'com.android.library' android { } dependencles{ } apply plugin: 'maven' version = '1.0.2-SNAPSHOT' uploadArchives { repositories { mavenDeployer { repository(url: "http://11.2.3.71:8081/repository/core-release/") { authentication(userName: "admin", password: "admin123") pom.groupId = "com.example.baselib" pom.artifactId = "myLib" } snapshotRepository(url: "http://11.2.3.71:8081/repository/core-dev/") { authentication(userName: "admin", password: "admin123") pom.groupId = "com.example.baselib" pom.artifactId = "myLib" } } } }
然后执行./gradlew upload,或者在android studio中点开gradle窗口,一般在右边框的上面。找到对应模块,执行upload就行了。
然后这种方法对于有flavors的库没有效果,我觉得是我配置的不对,然后我又找到了另一种方法解决有flavors的android库,这回不用maven插件了,用maven-publish插件,具体方法是这样的:
apply plugin: 'maven-publish' publishing { publications { android.libraryVariants.all { variant -> variant.outputs.each { output -> create("${variant.name.capitalize()}", MavenPublication) { groupId "app.android" artifactId "core-${output.baseName}" version '1.0.0' artifact(output.outputFile) } } } } repositories { maven { name 'artifactory' url "http://11.2.3.71:8081/repository/ruixin-release/" credentials { username = "admin" password = "admin123" } } } }
它会把所有的组合全部上传上去,但是它有一个缺陷,直接在gradle框中点击publish是没有效果的,它需要我们首先执行build,然后再点击发布的按纽publish。
天这里任务完成了一大半,还有一个小问题,你发布的这个库可能信赖了很多maven上的其它库,所以自己的库发布的时候要告诉用的人它所有信赖的库,于是需要一个收集信赖并写入pom文件的方法:
pom.withXml { def node = asNode() // ugly hack to set the packaging property in the POM as 'aar' ((NodeList) node.get('packaging')).get(0).value = 'aar' def dependenciesNode = node.appendNode('dependencies') def cl = { Dependency dep -> // if (dep.group == null || dep.version == null || dep.name == null || dep.name == "unspecified") if (dep.name == null || dep.name == "unspecified") return // ignore invalid dependencies def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', dep.group) dependencyNode.appendNode('artifactId', dep.name) dependencyNode.appendNode('version', dep.version) if (!dep.transitive) { // If this dependency is transitive, we should force exclude all its dependencies them from the POM def exclusionNode = dependencyNode.appendNode('exclusions').appendNode('exclusion') exclusionNode.appendNode('groupId', '*') exclusionNode.appendNode('artifactId', '*') } else if (!dep.properties.excludeRules.empty) { // Otherwise add specified exclude rules def exclusionNode = dependencyNode.appendNode('exclusions').appendNode('exclusion') dep.properties.excludeRules.each { ExcludeRule rule -> exclusionNode.appendNode('groupId', rule.group ?: '*') exclusionNode.appendNode('artifactId', rule.module ?: '*') } } } // List all dependencies and write to POM configurations.api.getAllDependencies().each cl configurations.implementation.getAllDependencies().each cl }
这段代码要放到任务的创建代码中,也就是
artifact(output.outputFile)
下面另起一行,反正是一个大括号中就行。
还有一个要注意的地方,引用库的代码不会自动使用你更新的库,除非你的版本号变了,并且你修改了gradle文件使用新版本号的库。在不改变版本的前提下,使用新发布的库需要先把先前的缓存清理掉
./gradlew build --refresh-dependencies