构建 AAB 时出错 - Flutter (Android) - 完整性检查失败:java.security.NoSuchAlgorithmException:算法 HmacPBESHA256 不可用

Jas*_*tto 6 java android keystore flutter

我正在尝试为我的颤振应用程序构建一个 AAB。我使用以下命令生成了密钥库:

keytool -genkey -v -keystore ~/pc-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias pckey
Run Code Online (Sandbox Code Playgroud)

我有一个key.properties文件,我使用 flutter 文档中提供的代码引用了它。如何解决此 Java 相关问题?我的程序抛出以下异常

* What went wrong:                                                      
Execution failed for task ':app:signReleaseBundle'.                     
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > Failed to read key pckey from store "/Users/jrperfetto/pc-keystore.jks": Integrity check failed: java.security.NoSuchAlgorithmException: Algorithm HmacPBESHA256 not available
                                                   
Run Code Online (Sandbox Code Playgroud)

Azh*_*Ali 138

我遇到了同样的错误,我尝试这个命令

keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload -storetype JKS
Run Code Online (Sandbox Code Playgroud)

具有额外属性

-storetype JKS
Run Code Online (Sandbox Code Playgroud)

它帮助我解决我的问题并成功创建捆绑包。

仅 Java 9 或更高版本需要 -storetype JKS 标记。从 Java 9 版本开始,密钥库类型默认为 PKS12。

  • 解决了问题,但是迁移到行业标准 PKCS12 的警告又如何呢? (5认同)
  • 在 M1 Mac 上工作过,谢谢。 (2认同)

Jas*_*tto 17

事实证明,我使用与我的应用程序用于构建应用程序不同的 Java 版本生成我的签名密钥。您可以通过运行 flutter doctor -v 并查看 Java 二进制文件的位置来检查这一点,并将其与运行“which java”时进行比较。

解决方案是运行带有在 flutter doctor 输出中找到的 Java bin 位置前缀的 keygen 命令,如下所示:

/Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home/bin/keytool -genkey -v -keystore ~/pc-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias pckey
Run Code Online (Sandbox Code Playgroud)

  • 同一命令失败,因为 HmacPBESHA256 算法在 Android Studio 附带的 java 11 中不可用。@Jason 这会发生在你身上吗? (3认同)
  • 我确实找到了一种让它工作的方法是使用“genkeypair”而不是“-genkey”。我在这里创建了一个问题:https://github.com/flutter/website/issues/5871 (2认同)

Tok*_*ris 15

注意:\nkeytool 命令可能不在 Java 的路径\xe2\x80\x94it\xe2\x80\x99s 部分中,Java 是作为 Android Studio 的一部分安装的。对于具体路径,运行 flutter doctor -v 并找到 \xe2\x80\x98Java 二进制文件后面打印的路径:\xe2\x80\x99。然后使用该完全限定路径将 java(最后)替换为 keytool。如果您的路径包含空格分隔的名称(例如 Program Files),请使用适合平台的名称表示法。例如,在 Mac/Linux 上使用 Program\\ Files,在 Windows 上使用“Program Files”。\n仅 Java 9 或更高版本需要 -storetype JKS 标记。从 Java 9 版本开始,密钥库类型默认为 PKS12

\n

1-删除upload-keystore.jks

\n
a-  /android/app/upload-keystore.jks\nb- /home/user/upload-keystore.jks\n
Run Code Online (Sandbox Code Playgroud)\n

2-重新生成文件:

\n
keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload -storetype JKS\n
Run Code Online (Sandbox Code Playgroud)\n

3-将文件 /home/user/ upload-keystore.jks复制到 android/app/

\n

4-flutter clean

\n

5-Flutter build appbundle

\n


Ali*_*ber 14

如果您尚未创建密钥库文件:

  1. 苹果:
keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload -storetype JKS
Run Code Online (Sandbox Code Playgroud)
  1. Windows(更改 USER_NAME):
keytool -genkey -v -keystore "c:\Users\USER_NAME\upload-keystore.jks" -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias upload
Run Code Online (Sandbox Code Playgroud)

如果您之前已经创建了密钥库文件:

keytool -importkeystore -srckeystore "path/to/upload-keystore.jks" -destkeystore "path/to/new-upload-keystore.jks" -deststoretype JKS
Run Code Online (Sandbox Code Playgroud)


Gra*_*llo 11

如果您不能/不想生成新密钥。

生成新密钥对我来说不是一个选择,因为我们的应用程序已经投入生产,联系谷歌非常麻烦。正如其他人指出的那样,构建失败是因为该应用程序是使用高于 Java 11 的 java 版本进行签名的。但是 HmacPBESHA256 算法在 Android Studio 附带的 java 11 中不可用。也就是说,Android Studio 正在尝试使用 Java 11 构建您的应用程序。

所以我的解决方案是让 Android Studio 使用我的本地 java 版本而不是 java 11 构建 aab。为了告诉 Android Studio 使用哪个 JDK 版本,在 中gradle.properties,我添加了:

org.gradle.java.home=/Library/Java/JavaVirtualMachines/jdk-15.0.2.jdk/Contents/Home

此后,我能够构建我的 aab,而我已有的密钥没有任何问题。