如何使用无密钥密码的新上传密钥签名AAB应用包
近期需要在Google Play商店(内部测试轨道)为名下应用注册新的上传密钥,本次操作流程和此前方案存在差异:之前使用keytool创建.jks格式密钥时,系统会要求为密钥别名设置对应密码。
原有实现方案是将storeFile & storePassword以及多组key<Flavor>Alias & key<Flavor>Password参数存储在keystore.properties文件中,该方案运行稳定,项目中的build.gradle会遍历所有产品风味,为每个风味匹配分配对应的签名配置。
本次按照Google Play控制台给出的操作指引,在CLI中执行以下命令生成新证书:
keytool -genkeypair -alias upload -keyalg RSA -keysize 2048 -validity 9125 -keystore keystore.jks keytool -export -rfc -alias upload -file upload_certificate.pem -keystore keystore.jks
执行完成后上传密钥已成功创建,但全程未提示设置密钥密码。
核心疑问:执行gradle bundle<Flavour>Release命令构建应用时,在无对应密钥密码的情况下该如何正确完成签名配置?
当前项目配置详情如下:
def keystorePropertiesFile = rootProject.file("keystore.properties") def keystoreProperties = new Properties() keystorePropertiesFileExists && keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) android { ndkVersion rootProject.ext.ndkVersion compileSdkVersion rootProject.ext.compileSdkVersion signingConfigs { } defaultConfig { applicationId <application-id> minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion resValue "string", "build_config_package", <application-id> } flavorDimensions "default" productFlavors { Staging { applicationId "<application-id>.staging" } RC { applicationId "<application-id>.rc" } Production {} } buildTypes { debug { signingConfig null } release { productFlavors.all { flavor -> flavor.signingConfig = android.signingConfigs.create("${flavor.name}") flavor.signingConfig.storeFile = rootProject.file(keystoreProperties["storeFile"]) flavor.signingConfig.storePassword = keystoreProperties["storePassword"] flavor.signingConfig.keyAlias = keystoreProperties["keyAlias${flavor.name}"] flavor.signingConfig.keyPassword = keystoreProperties["keyPassword${flavor.name}"] } minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" debuggable false } } }
另外项目使用fastlane的supply工具完成应用上传流程,咨询该场景下是否需要调整相关命令配置。
1. 未提示设置密钥密码的原因
执行keytool生成密钥时如果没有加-keypass参数,在非交互式环境(包括部分CI环境、新版JDK默认配置)下,keytool会默认将密钥条目密码(keyPassword)设置为和密钥库密码(storePassword)完全一致,不会单独弹出密码设置提示,并非没有设置密钥密码。
可以执行以下命令验证该逻辑:
keytool -keypasswd -alias upload -keystore keystore.jks
输入密钥库密码后,会提示当前密钥密码和密钥库密码相同,直接确认即可。
2. Gradle签名配置调整
不需要修改原有遍历产品风味的签名逻辑,仅需调整keystore.properties中的参数即可:
- 所有风味的
keyAlias<FlavorName>统一填写为upload(生成密钥时指定的别名就是upload) - 所有风味的
keyPassword<FlavorName>直接填写和storePassword相同的密钥库密码
keystore.properties配置参考:
storeFile=./keystore.jks storePassword=你设置的密钥库密码 keyAliasStaging=upload keyPasswordStaging=你设置的密钥库密码 keyAliasRC=upload keyPasswordRC=你设置的密钥库密码 keyAliasProduction=upload keyPasswordProduction=你设置的密钥库密码
配置完成后直接执行原有gradle bundle<Flavour>Release命令即可正常完成签名,无需改动build.gradle中的现有逻辑。
3. Fastlane supply配置调整
不需要修改supply工具的核心上传逻辑,仅需确认supply读取的签名后aab文件路径和原有配置一致即可。supply本身不校验密钥密码,只负责上传构建完成的正式制品,只要Gradle构建出的aab是用新上传密钥正确签名的,原有上传命令可以直接复用。
注意:如果之前在fastlane中配置了
json_key_file等服务账号认证参数,不需要做任何改动,这部分配置和上传密钥无关联。
内容的提问来源于stack exchange,提问作者joshuaaron

