如何高效发布Android AAR包到远程Maven仓库

本文同步发布于公众号:移动开发那些事如何高效发布Android AAR包到远程Maven仓库

1 背景

Gradle 7.0之前的版本中,maven插件是发布AAR包到远程Maven仓库的主要工具。但从Gradle 7.0开始,maven插件被废弃,官方推荐使用maven-publish插件。本文将介绍如何使用这两种插件高效发布AAR包。

2 maven插件

使用maven插件的前提是对应工程的的Gradle的版本要小于7.0,如:

buildscript {
    dependencies {
    	// 这里使用3.5.0版本
        classpath 'com.android.tools.build:gradle:3.5.0'
        
    }
}

2.1 上传脚本制作

maven插件的使用也比较简单,只需要在对应module下编写对应的gradle脚本就可以,笔者一般喜欢新建一个gradle文件来写相关的脚本,新建一个upload.gradle的脚本

apply plugin: 'maven'

def getRepositoryUsername() {
    return "stringwu"
}

def getRepositoryPassword() {
     // 要上传的仓库的密码,按需改为实际的
    return "abcdemoabc"
}

uploadArchives {
    repositories {
        mavenDeployer {
        	// 这里远程仓库的地址需要改为实际要发布的地址
            repository(url: "https://repo1.maven.org/maven2/") {
                authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
            }
            snapshotRepository(url: "https://repo1.maven.org/maven2/snapshot") {
                authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
            }

            pom.groupId = "com.demo.abcsdk"
            pom.artifactId = "abcsdk"
            // 版本
            def version = "0.0.1"

            // 判断是否是release版本,非release版本自动在版本号后面加个SNAPSHOT
            if (System.getenv('isRelease') && Boolean.valueOf(System.getenv('isRelease'))) {
                pom.version = version
            } else {
                if (System.getenv('buildID')) {
                    version = version + "." + System.getenv('buildID')
                }
                pom.version = version  +
                        "-SNAPSHOT"

            }

        }
    }
}

这里有个点需要留意的是maven插件会自动根据版本号是否带SNAPSHOT 后缀来决定发布到哪个远程仓库(版本号带SNAPSHOT 会发布到snapshotRepository仓库,否则发布到repository仓库)

2.2 发布

在编写完对应的上传脚本后,就需要在对应的modulebuild.gradle文件里引用前面编写好的脚本:

apply from: 'upload.gradle'

android {
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles  'proguard-rules.pro'
        }
        debug {
            minifyEnabled false
        }
    }
}
.....

在搞定了这些后,我们就只需要在命令行执行gradle uploadArchives 就可以把对应的AAR包发布到远程仓库了,如果需要在上传前处理一些额外的逻辑,也可以把相关的逻辑封装成shell脚本。

3 maven-publish插件

使用maven-publish插件的前提是对应工程的的Gradle的版本要大于7.0,如:

buildscript {
    ext {
        kotlin_version = '1.4.10'
    }
    dependencies {
    	// gradle的版本要大于7.0,这里使用7.1.2
        classpath 'com.android.tools.build:gradle:7.1.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
 }

3.1 上传脚本制作

maven-publish插件的使用也比较简单,只需要在对应module下编写对应的gradle脚本就可以,笔者一般喜欢新建一个gradle文件来写相关的脚本,新建一个upload.gradle的脚本

apply plugin: 'maven-publish'

static def getRepositoryUsername() {
	// 要上传的仓库的用户名 按需改为实际的
    return "stringwu"
}

static def getRepositoryPassword() {
    // 要上传的仓库的密码,按需改为实际的
    return "abcdemoabc"
}
task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}

// 上传相关的脚本
publishing {
    repositories {
        maven {
        	// 这里远程仓库的地址需要改为实际要发布的地址
            def releaseUrl = "https://repo1.maven.org/maven2/"
            def snapshotUrl = "https://repo1.maven.org/maven2/snapshot"
            // 这里去拿系统变量:isRelease   来决定要发布到哪个地址,可省略
            if (System.getenv('isRelease') && Boolean.valueOf(System.getenv('isRelease'))) {
                url = releaseUrl
            } else {
                url = snapshotUrl
            }
            // 身体信息
            credentials {
                username getRepositoryUsername()
                password getRepositoryPassword()
            }
        }
    }
    publications {
        release(MavenPublication) {
        	// eg:com.demo.a
            groupId = project.MAVEN_GROUP
            // eg : sdkA
            artifactId = project.UPLOAD_ARCHIVES_MODULE_ONE
            // 版本
            def tmpVersion = project.MAVEN_VERSION
            // 如果系统变量有,就用系统变量里设置的
            if (System.getenv('VERSION_NAME')) {
                tmpVersion = System.getenv('VERSION_NAME')
            }
            version = tmpVersion
            // 要上传的aar包
            artifact("$buildDir/outputs/aar/*.aar")
            // 同时打包上传jar source 可省略
            artifact(sourcesJar)
            // 这一步骤主要是把依赖信息都打进pom文件里
            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.implementation.allDependencies.each {
                    // 避免出现空节点或 artifactId=unspecified 的节点
                    if (it.group != null && (it.name != null && "unspecified" != it.name) && it.version != null) {
                        println "dependency=${it.toString()}"
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', it.group)
                        dependencyNode.appendNode('artifactId', it.name)
                        dependencyNode.appendNode('version', it.version)
                        dependencyNode.appendNode('scope', 'implementation')
                    }
                }
            }
        }

    }
}


3.2 发布

在编写完对应的上传脚本后,就需要在对应的modulebuild.gradle文件里引用前面编写好的脚本:

apply from: 'upload.gradle'

android {
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles  'proguard-rules.pro'
        }
        debug {
            minifyEnabled false
        }
    }
}
.....

在搞定了这些后,我们就只需要编写简单的shell脚本build.sh就可以轻松上传到远程仓库了:

echo "start clean"
gradle clean
echo "end clean"
# 打出要上传的release 的aar包
gradle assembleRelease
# 执行上传命令
gradle publish

4 总结

本文介绍了两种发布AAR包到远程Maven仓库的方法:maven插件和maven-publish插件。对于Gradle 7.0之前的版本,可以使用maven插件;而对于7.0及之后的版本,推荐使用maven-publish插件。通过提供的脚本示例,读者可以轻松地将AAR包发布到远程仓库,大家有需要的可直接复制脚本到工程里就可运行了,如果想了解更多的细节,可查看官方的指导文档。

5 参考

posted @ 2024-11-22 10:36  woodWu  阅读(1)  评论(0编辑  收藏  举报