7

我在构建项目时遇到了这个问题。下面是堆栈跟踪。我为发布密钥创建了一个新的密钥库文件,但没有用。

Caused by: java.io.IOException: Failed to generate v1 signature
at com.android.tools.build.apkzlib.sign.SigningExtension.onOutputZipReadyForUpdate(SigningExtension.java:292)
at com.android.tools.build.apkzlib.sign.SigningExtension.access$200(SigningExtension.java:53)
at com.android.tools.build.apkzlib.sign.SigningExtension$1.lambda$beforeUpdate$2(SigningExtension.java:171)
at com.android.tools.build.apkzlib.zip.ZFile.notify(ZFile.java:2154)
at com.android.tools.build.apkzlib.zip.ZFile.update(ZFile.java:923)
at com.android.tools.build.apkzlib.zip.ZFile.close(ZFile.java:1207)
at com.android.tools.build.apkzlib.zfile.ApkZFileCreator.close(ApkZFileCreator.java:174)
at com.google.common.io.Closer.close(Closer.java:216)
at com.android.builder.internal.packaging.IncrementalPackager.close(IncrementalPackager.java:332)
at com.android.build.gradle.tasks.PackageAndroidArtifact.doTask(PackageAndroidArtifact.java:704)
at com.android.build.gradle.tasks.PackageAndroidArtifact.splitFullAction(PackageAndroidArtifact.java:515)
at com.android.build.gradle.tasks.PackageAndroidArtifact.lambda$doFullTaskAction$3(PackageAndroidArtifact.java:396)
at com.android.build.gradle.internal.scope.BuildElements$ExecutorBasedScheduler$transform$$inlined$forEach$lambda$1.call(BuildElements.kt:121)
at com.android.build.gradle.internal.scope.BuildElements$ExecutorBasedScheduler$transform$$inlined$forEach$lambda$1.call(BuildElements.kt:110)
at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1424)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: java.security.InvalidKeyException: Failed to sign using signer "CERT"
at com.android.apksig.internal.apk.v1.V1SchemeSigner.signManifest(V1SchemeSigner.java:295)
at com.android.apksig.internal.apk.v1.V1SchemeSigner.sign(V1SchemeSigner.java:256)
at com.android.apksig.DefaultApkSignerEngine.outputJarEntries(DefaultApkSignerEngine.java:424)
at com.android.tools.build.apkzlib.sign.SigningExtension.onOutputZipReadyForUpdate(SigningExtension.java:290)
... 18 more
Caused by: java.security.InvalidKeyException: Failed to sign using SHA1withDSA
at com.android.apksig.internal.apk.v1.V1SchemeSigner.generateSignatureBlock(V1SchemeSigner.java:519)
at com.android.apksig.internal.apk.v1.V1SchemeSigner.signManifest(V1SchemeSigner.java:293)
... 21 more
Caused by: java.security.InvalidKeyException: The security strength of SHA-1 digest algorithm is not sufficient for this key size
at sun.security.provider.DSA.checkKey(DSA.java:104)
at sun.security.provider.DSA.engineInitSign(DSA.java:136)
at java.security.Signature$Delegate.init(Signature.java:1152)
at java.security.Signature$Delegate.chooseProvider(Signature.java:1112)
at java.security.Signature$Delegate.engineInitSign(Signature.java:1176)
at java.security.Signature.initSign(Signature.java:527)
at com.android.apksig.internal.apk.v1.V1SchemeSigner.generateSignatureBlock(V1SchemeSigner.java:515)

在论坛上关注了其他问题,但没有任何效果。请帮忙。Android Studio 版本 - 3.2.1

编辑- 将 minSdkVersion 从 18 更改为 21 解决了这个问题。但无法弄清楚这背后的真正原因。

4

3 回答 3

4

错误消息意味着,密钥可能具有1024位强度,因为它是使用 JDK 之前的任何 JDK 版本生成的8u151- 而预计至少 2048位密钥强度:

SHA-1 摘要算法的安全强度对于这个密钥大小是不够的。

这背后的原因是, JDK的默认密钥大小已从1024位更改为20488u151位。此更改也可以在 datecode的 JRE/JDK加密路线图2017-10-17中找到:

将 jarsigner 和 keytool -sigalg 默认升级为 SHA256withDSA,将 DSA 密钥的 -keysize 默认升级为 2048。

“还原说明”将是(实际上并不适用于 Android Studio 的标牌):

要使用不同的算法和/或更小的密钥大小,请使用 keytool 和 jarsigner 的 -sigalg 和 -keysize 选项来覆盖当前默认值。在此更改之前,默认值为 SHA1withDSA 和 1024 位。

对于 APK,建议使用apksigner而不是jarsigner - 同时还有一个APK Signature Scheme v3(这些是向后兼容的 - 因此最好不要使用v1)。

生成具有至少 2048位强度的新密钥应允许v1( jar) 签名。降级 JDK 也是一种可行的解决方法(虽然我不建议这样做)。

如果您已经将此密钥发布到 Google Play,最好的选择可能是尝试迁移到Google Play App Signing(发布密钥将降级为上传密钥)。


最重要的是,您的系统范围内安装的 JDK 版本很可能比与当前版本的 Android Studio 捆绑的 OpenJDK 旧得多 - 因此您可以生成任意数量的新密钥,但它们不会满足最低安全要求。更新系统范围内安装的 JDK 版本应该使您能够生成足够强度的密钥;运行java -version,看看你甚至使用什么来生成强度不足的密钥。

或者简单地使用... /android-studio/jre/jre/bin/keytool来生成它们。

于 2019-04-11T04:09:22.653 回答
4

生成密钥长度为 2048 的密钥库我有用。

keytool -genkey -v -keystore ~/.android/debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000
于 2020-06-06T13:39:50.827 回答
-1

这可能是由错误的图标格式引起的,这里跟踪了一个问题:https ://issuetracker.google.com/issues/63885809

运行以下命令以查看有问题的资源

./gradlew assemble --stacktrace 

找到如下日志:

错误:org.gradle.tooling.BuildException:无法生成 v1 签名错误:java.io.IOException:无法生成 v1 签名错误:com.android.apksig.apk.ApkFormatException:ZIP 条目名称“xxxx/ 中不支持字符 xxxx” xxx?”

尝试删除文件或替换为新文件。

于 2018-12-20T02:00:07.697 回答