上传新APK版本时出现签名错误消息(API级别8不支持SHA1)

时间:2017-10-16 20:37:31

标签: android apksigner

我在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正在验证

我尝试了(新推出的)签名版本选项的这些组合(总是具有相同的结果):

  • 仅" V1(Jar Signature)"
  • " V1(Jar Signature)"和" V2(完整APK签名)"

我正在使用带有buildToolsVersion 25.0.0和Gradle版本3.3的Android Studio 2.3.3。

1 个答案:

答案 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