如何用Keystore签名Android AAR并通过maven-publish发布至Maven仓库?
问题分析
你遇到的核心问题是:publish任务并不直接依赖assembleRelease——Android Gradle Plugin(AGP)中生成AAR的核心任务是bundleReleaseAar,publish任务直接依赖这个任务,而非assembleRelease。因此你在assembleRelease.doLast中添加的签名逻辑,只会在执行assembleRelease时触发,执行publish时不会运行这段代码,最终发布的是bundleReleaseAar生成的未签名AAR。
解决方案
要实现用Keystore签名AAR并发布,需要将签名逻辑绑定到AAR生成的核心流程中,确保发布前必执行签名。以下是具体配置步骤:
1. 配置签名任务(替代assembleRelease.doLast)
创建独立的签名任务,依赖bundleReleaseAar任务(确保先生成未签名AAR),并将签名后的文件覆盖原AAR路径(或直接指定为发布产物)。
方式一:使用Ant的signjar任务(Groovy示例)
// 读取gradle.properties中的密钥配置(建议不要硬编码密码) def releaseStoreFile = rootProject.file(project.property("RELEASE_STORE_FILE")) def releaseStorePassword = project.property("RELEASE_STORE_PASSWORD") def releaseKeyAlias = project.property("RELEASE_KEY_ALIAS") def releaseKeyPassword = project.property("RELEASE_KEY_PASSWORD") // 创建签名任务 task signReleaseAar(type: AntBuilder) { // 依赖未签名AAR的生成任务 dependsOn bundleReleaseAar // 获取未签名AAR的路径 def unsignedAar = bundleReleaseAar.outputs.files.singleFile // 定义签名后AAR的临时路径 def signedAar = new File(unsignedAar.parent, "${unsignedAar.name.replace('.aar', '-signed.aar')}") // 执行Ant签名命令 ant.signjar( jar: unsignedAar.absolutePath, signedjar: signedAar.absolutePath, keystore: releaseStoreFile.absolutePath, storepass: releaseStorePassword, keypass: releaseKeyPassword, alias: releaseKeyAlias, sigalg: 'SHA256withRSA', digestalg: 'SHA-256' ) // 标记任务输出,让Gradle能追踪产物变化 outputs.file signedAar // 签名完成后,覆盖原未签名AAR(确保发布的是签名后的文件) doLast { copy { from signedAar into unsignedAar.parent rename { unsignedAar.name } } } }
方式二:直接调用jarsigner命令(Groovy示例)
task signReleaseAar(type: Exec) { dependsOn bundleReleaseAar def unsignedAar = bundleReleaseAar.outputs.files.singleFile def signedAar = new File(unsignedAar.parent, "${unsignedAar.name.replace('.aar', '-signed.aar')}") // 执行jarsigner命令 commandLine 'jarsigner', '-verbose', '-sigalg', 'SHA256withRSA', '-digestalg', 'SHA-256', '-keystore', releaseStoreFile.absolutePath, '-storepass', releaseStorePassword, '-keypass', releaseKeyPassword, unsignedAar.absolutePath, releaseKeyAlias outputs.file signedAar doLast { copy { from signedAar into unsignedAar.parent rename { unsignedAar.name } } } }
2. 关联签名任务与发布流程
修改maven-publish配置,让发布任务依赖签名任务,确保签名在发布前执行:
publishing { publications { release(MavenPublication) { // 关联AAR产物(此时原路径已被签名后的文件覆盖) afterEvaluate { artifact bundleReleaseAar } // 配置库的基本信息 groupId = "com.your.group" artifactId = "your-library-id" version = "1.0.0" // 生成POM文件(可选,按需配置) pom { name = "Your Library Name" description = "Your library description" url = "https://your-library-url.com" } } } repositories { // 配置Maven仓库(本地/远程) maven { // 本地仓库示例 url = uri("file://${rootProject.buildDir}/local-maven-repo") // 远程仓库示例(需配置凭证) // url = uri("https://your-remote-maven-repo.com") // credentials { // username = "your-username" // password = "your-password" // } } } } // 让发布任务依赖签名任务 publish.dependsOn signReleaseAar // 若有多个发布任务,可指定具体任务依赖: // publishReleasePublicationToMavenRepository.dependsOn signReleaseAar
3. 安全管理密钥信息
在项目根目录的gradle.properties中添加密钥配置(避免硬编码到构建脚本):
RELEASE_STORE_FILE=../your-keystore.jks RELEASE_STORE_PASSWORD=your-store-password RELEASE_KEY_ALIAS=your-key-alias RELEASE_KEY_PASSWORD=your-key-password
验证与执行
执行发布命令:
./gradlew publish
发布完成后,可通过jarsigner验证仓库中的AAR是否签名:
jarsigner -verify -verbose -certs path/to/published/library.aar
内容的提问来源于stack exchange,提问作者JonasVautherin
相关产品推荐
相关产品推荐

