5

我在 2010 年发布了一个应用程序。那时,我创建了一个本地密钥库和一个密钥,我从未更改并用于我此后发布的该应用程序的所有(大约 30 个)版本。

在我使用 Eclipse 开发的时候,我从来没有遇到过任何问题,它总是运行良好,在我切换到 Android Studio 的最后几年也没有。

我发布的最后一个版本是 2016-12-23。现在我想发布一个新的,用 Android Studio 生成一个签名的 APK,上传到开发者控制台......并收到以下错误消息:

上传失败 - 您上传的 APK 签名无效(了解有关签名的更多信息)。来自 apksigner 的错误:错误(Jar 签名者 CERT.DSA):JAR 签名 META-INF/CERT.DSA 使用摘要算法 SHA-1 和签名算法 SHA-1 和 DSA,这在 API 级别 8 上不受支持APK 正在验证中

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

  • 只有“V1(Jar 签名)”
  • “V1(Jar 签名)”和“V2(完整 APK 签名)”

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

4

1 回答 1

3

您看到的错误消息是此 APK 不会安装在 Android Froyo(API 级别 8)上。APK 的 JAR 签名 ( META-INF/CERT.DSA) 使用 OID 1.2.840.10040.4.3(带有 DSA 的 SHA-1)来指定签名算法。此 OID 仅在 API 级别 9 的 JAR 签名中在 Android 上受支持,但您的 APKAndroidManifest.xml通过android:minSdkVersion属性指定 APK 支持 API 级别 8。对于 DSA,在 JAR 签名中使用的最佳签名算法 OID 是 1.2.840.10040。 4.1(DSA,不是带有 DSA 的 SHA-1)。生成的加密签名完全相同,只是所有 Android 版本的 JAR 签名都支持此 OID。虽然签名工具通常不提供这种级别的控制,但它们应该选择一个工作 OID。

除非您指定自定义参数,否则Android Studio、Android Plugin for Gradleapksigner都应该生成正确签名的 APK。例如,您的build.gradle文件是否指定minSdkVersion了 9 或更高?或者,也许,您正在使用jarsigner不了解 Android 规则的 APK 对 APK 进行发布签名...

想法:

  • 如果您使用 发布签名jarsigner,请切换到apksigner或使用 Android Studio / Android Plugin for Gradle 进行发布签名。例如,要使用 apksigner 重新签署 APK:

    apksigner sign --ks my.keystore app.apk
    
  • 如果您使用 Android Studio / Android Plugin for Gradle 进行发布签名,请在您的build.gradle文件中指定minSdkVersionAndroidManifest.xml. 或者,也许从 build.gradle 文件中删除 minSdkVersion 会使 Android Studio / Android Plugin for Android 使用来自 AndroidManifest.xml 的 minSdkVersion?我对此有点怀疑,因为在签署此类 APK 时,Android Studio 2.3.3 应该使用正确/安全的 OID 1.2.840.10040.4.1 ...

  • 如果您可以放弃对 Froyo 的支持,请调整minSdkVersion为9 或更高。AndroidManifest.xml

PS 要检查您的 APK 是否已正确签名并查看 Google Play 在上传时可能会报告的错误:

apksigner verify my.apk
于 2017-10-19T02:10:14.883 回答