我在构建项目时遇到了这个问题。下面是堆栈跟踪。我为发布密钥创建了一个新的密钥库文件,但不起作用。
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
Edit- 将 minSdkVersion 从 18 更改为 21 解决了该问题。但无法弄清楚这背后的真正原因。
该错误消息意味着该密钥可能有1024位强度,因为它是使用 JDK 之前的任何 JDK 版本生成的8u151
- 尽管at least 2048位密钥强度是预期的:
SHA-1 摘要算法的安全强度对于这个密钥大小来说是不够的。
这背后的原因是,默认密钥大小已从1024 to 2048JDK 的位8u151
。此更改也可以在 JRE/JDK 中找到加密路线图在日期代码2017-10-17
:
将 jarsigner 和 keytool ‑sigalg 默认值升级为 SHA256withDSA,将 DSA 密钥的 ‑keysize 默认值升级为 2048。
“恢复说明”将是(这并不真正适用于 Android Studio 的标牌):
要使用不同的算法和/或更小的密钥大小,请使用 keytool 和 jarsigner 的 ‑sigalg 和 ‑keysize 选项来覆盖当前默认值。在此更改之前,默认值为 SHA1withDSA 和 1024 位。
对于 APK,建议使用apk签名者而不是贾西格纳- 同时有一个APK签名方案v3(这些是向后兼容的 - 因此不要使用v1
).
生成新密钥at least 2048位强度应允许v1
(jar
)签名。降级 JDK 也是一个可行的解决方法(虽然我不想建议这样做)。
如果您已将此密钥发布到 Google Play,则最好的选择可能是尝试迁移到Google Play 应用签名(发布密钥将降级为上传密钥)。
最重要的是,您的系统范围安装的 JDK 版本很可能比当前版本的 Android Studio 捆绑的 OpenJDK 旧得多 - 因此您可以根据需要生成任意数量的新密钥,但它们不会满足最低安全要求。更新系统范围内安装的 JDK 版本应该使您能够生成具有足够强度的密钥;跑步java -version
,看看您甚至使用什么来生成强度不足的密钥。
or只需使用... /android-studio/jre/jre/bin/keytool
来生成它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)