You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:55:41