【发布时间】:2014-02-01 04:06:37
【问题描述】:
我有一个基于 gradle 的 android 项目并试图生成一个发布 apk。但是,似乎 gradle 以某种方式获取了错误的密钥/证书。
这就是我在 build.gradle 中的内容:
signingConfigs {
release {
storeFile file("mykey.jks")
storePassword "mypass"
keyAlias "mykey.key"
keyPassword "mypass"
}
}
buildTypes {
release {
debuggable false
jniDebugBuild false
runProguard true
proguardFile getDefaultProguardFile('proguard-android.txt')
signingConfig signingConfigs.release
}
}
运行后
gradlew assembleRelease
并从 .apk 中取出 META-INF/CERT.RSA 我运行以下命令:
keytool -list -keystore mykey.jks
和
keytool -printcert -v -file CERT.RSA
但它们会产生具有不同证书指纹的输出。尝试使用另一个使用相同密钥(但不是 gradle)签名的 apk 的证书会产生正确的证书指纹。
Gradle 似乎可以很好地获取密钥库(更改密码或位置或别名使其停止工作)。
我很困惑,因为我不想将某些东西发布到使用未知密钥签名的商店,然后又无法更新它。我没有在 gradle 中明确定义的调试键。
更新:这与密钥库有关。使用新的密钥库和密钥尝试相同的 gradle 代码可以正常工作。这个有问题的密钥库是从 pkcs#12 格式(.p12 文件)导入的。不过,使用 Intellij 或 jarsigner 可以很好地处理此密钥库,只是 gradle 代码具有不同的输出 - 似乎只有从密钥生成的证书不同。
【问题讨论】:
-
如果您有与证书相同签名的旧 apk,请尝试将其安装在设备中。如果它取代它是完美的。我一直在使用相同的签名没有错。
-
这是一个全新的应用程序,所以没有旧的 apk。如果我使用 IntelliJ 的“生成签名 apk”构建它,则两个生成的 apk 未使用相同的证书进行签名(在尝试将一个安装在另一个之上时获取 INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES)。执行证书指纹转储表明 IntelliJ 生成的证书使用了正确的证书(但无法上传到 google play,因为它是可调试的)。
-
尝试清理然后构建一次。用这个清洁
gradle clean。 -
已经试过了,没有变化。
-
这很令人惊讶,因为完全相同的东西在这里对我来说非常有效。您使用的是哪个版本的 gradle?尝试注释掉您的签名配置并尝试从命令和 intellij 构建它们应该会引发一些错误。
标签: android gradle android-studio keytool signing