我在2010年发布了一个应用程序。那时候,我创建了一个本地密钥库和一个密钥,我从未更改过这个密钥,用于我从那时起发布的这个应用程序的所有(大约30个)版本。 / p>
我从来没有遇到任何问题,它总是运行良好,早在我使用Eclipse开发的时候,在过去的几年里我都没有切换到Android Studio。
我发布的最新版本2016-12-23。现在我想发布一个新的,用Android Studio生成签名的APK,将其上传到Developer Console ...并收到以下错误消息:
上传失败 - 您上传了带有无效签名的APK(了解有关签名的详情)。来自apksigner的错误:ERROR(Jar签名者CERT.DSA):JAR签名META-INF / CERT.DSA使用摘要算法SHA-1和签名算法SHA-1与DSA不支持API级别8对此APK正在验证
我尝试了(新推出的)签名版本选项的这些组合(总是具有相同的结果):
我正在使用带有buildToolsVersion 25.0.0和Gradle版本3.3的Android Studio 2.3.3。
答案 0 :(得分:2)
您看到的错误消息是此APK不会安装在Android Froyo(API级别8)上。 APK的JAR签名(META-INF/CERT.DSA
)使用OID 1.2.840.10040.4.3(带有DSA的SHA-1)来指定签名算法。 Android仅在API级别9的JAR签名中支持此OID,但您的APK AndroidManifest.xml
指定 - 通过android:minSdkVersion
属性 - 该APK支持API级别8.对于DSA,最佳签名算法OID在JAR签名中使用的是1.2.840.10040.4.1(DSA,而不是带有DSA的SHA-1)。生成的加密签名完全相同,只是所有Android版本的JAR签名都支持此OID。签名工具通常不提供这种级别的控制,但它们应该选择一个可用的OID。
Android Studio,Gradle的Android插件和apksigner
都应该生成正确签名的APK。例如,您的build.gradle
文件是否有机会指定minSdkVersion
9或更高?或者,也许您使用不知道Android规则的jarsigner
对APK进行发布签名......
思路:
如果您使用jarsigner
进行发布签名,请切换到apksigner
或使用适用于Gradle的Android Studio / Android插件进行发布签名。例如,要使用apksigner重新签名APK:
apksigner sign --ks my.keystore app.apk
如果您使用适用于Gradle的Android Studio / Android插件进行发布签名,请在build.gradle
文件中指定与minSdkVersion
中相同的AndroidManifest.xml
。或者,也许从build.gradle文件中删除minSdkVersion将使Android的Android Studio / Android插件使用AndroidManifest.xml中的minSdkVersion?我对此有点怀疑,因为在签署此类APK时,Android Studio 2.3.3应该使用正确/安全的OID 1.2.840.10040.4.1 ...
如果你没有放弃对Froyo的支持,请将minSdkVersion
中的AndroidManifest.xml
调整为9或更高。
P上。 S.检查您的APK是否已正确签名并查看Google Play在上传时可能会报告的错误:
apksigner verify my.apk