【问题标题】:Error building AAB - Flutter (Android) - Integrity check failed: java.security.NoSuchAlgorithmException: Algorithm HmacPBESHA256 not available构建 AAB 时出错 - Flutter (Android) - 完整性检查失败:java.security.NoSuchAlgorithmException:算法 HmacPBESHA256 不可用
【发布时间】:2021-08-10 09:20:36
【问题描述】:

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

keytool -genkey -v -keystore ~/pc-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias pckey

我有一个 key.properties 文件,并且我使用颤振文档中提供的代码引用了它。如何解决这个 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
                                                   

【问题讨论】:

标签: java android flutter keystore


【解决方案1】:

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

keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload -storetype JKS

带有额外属性

-storetype JKS

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

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

【讨论】:

  • 为我工作。谢谢!
  • 我也是!!谢谢:)
  • 它也对我有用。一个问题,用JKS代替PKS12有什么坏处吗?
  • 为我工作!!!!
【解决方案2】:

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

解决方案是运行您的 keygen 命令,其前缀为在颤振医生输出中找到的 Java bin 的位置,如下所示:

/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

【讨论】:

  • 同一命令失败,因为 HmacPBESHA256 算法在 Android Studio 附带的 java 11 中不可用。 @Jason 这发生在你身上吗?
  • 我不确定,但无论从终端尝试还是从 Android Studio 运行构建,我都面临同样的问题 - 最终,我可以解决问题的唯一方法是如上所述为我的 java 位置添加前缀在我的后续行动中
  • 奇怪了,能查一下Android studio自带的java版本吗? /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home/bin/java --version
  • 我确实找到了一种让它工作的方法是使用genkeypair 而不是-genkey。我在这里创建了一个问题:github.com/flutter/website/issues/5871
  • 我按照你说的做了,但是我不知道keystone文件是在哪个位置创建的。我在根文件夹中执行了此命令以防止权限问题。您能告诉我创建密钥库文件的位置吗?
【解决方案3】:

当我从下面的目录中删除 debug.keystore 时,它​​解决了我的问题。

/Users/tariqul/.android/debug.keystore

【讨论】:

  • 我已经删除了所有与 Keystore 相关的文件,并且工作正常。请记住重建密钥(SHA1 和 SHA256)并使用 firebase 进行更新。
【解决方案4】:

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

1- 删除 upload-keystore.jks

a-  /android/app/upload-keystore.jks
b- /home/user/upload-keystore.jks

2- 重新生成文件:

keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload -storetype JKS

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

4-flutter clean

5-Flutter build appbundle

【讨论】:

    【解决方案5】:

    在 app 文件夹中的 android 文件夹中打开 build.gradle 并确保保留

    (buildTypes { release { signingConfig signingConfigs.debug } })

    在准备应用程序包之前将其更改为 (signingConfig signingConfigs.release)

    【讨论】:

    • 您可以添加屏幕截图,让您的答案易于理解。
    【解决方案6】:

    我不知道我解决问题的方式是否正确,也不知道别人会不会这样解决,但我想如果我做了很多事情我会解决的.

    我将 JAVA_HOME 改编为 java 二进制文件的形式,像这样提出flutter doctor -v

    % flutter doctor -v                            
    [✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
    .
    .
    .
        • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    
    

    并将JAVA_HOME 设置为.zshrc

    % cd ~
    % vi .zshrc
    
    
    export JAVA_HOME="/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home"
    
    % echo $JAVA_HOME
    /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home
    

    % flutter clean
    % flutter build appbundle
    

    这行得通

    % flutter build appbundle
    
    ? Building with sound null safety ?
    
    Running Gradle task 'bundleRelease'...                                  
    Running Gradle task 'bundleRelease'... Done                         4.1s
    ✓ Built build/app/outputs/bundle/release/app-release.aab (21.2MB).
    
    

    【讨论】:

      【解决方案7】:

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

      生成新密钥对我来说不是一个选项,因为我们的应用程序已经在生产中并且联系谷歌是如此的麻烦。正如其他人指出的那样,构建失败是因为该应用程序是使用高于 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,而我已经拥有的密钥没有任何问题。

      【讨论】:

        【解决方案8】:

        与 Graciela 一样,我无法重新创建证书。但是,我在 Android Studio 中使用 Java 12+ 对我来说并不是一个好的解决方法。使用更新的 Java 版本适用于从我的机器部署,但不适用于从 CI 服务器部署。

        相反,我导出和导入证书以更改签名算法。

        以下是我使用的步骤:

        使用 Java v12+ 将证书导出到 PKCS12:

        keytool -importkeystore -srckeystore ./upload-keystore.jks -destkeystore ./pcstore.p12 -deststoretype PKCS12
        

        使用 openssl,将密钥导出为 .pem

        openssl pkcs12 -nodes -in pcstore.p12 -out keystore.pem
        

        使用 openssl 创建一个新的 .p12 存储

        openssl pkcs12 -export -in keystore.pem -out new-pcstore.p12 -name upload
        

        通过导入 .p12 存储,使用 Android Studio 版本的 Java (Java 11) 创建一个新的 jks 存储:

        /Applications/Android\ Studio.app/Contents/jre/Contents/Home/bin/keytool -importkeystore -srckeystore ./new-pcstore.p12 -destkeystore ./new-upload-keystore.jks -deststoretype jks
        

        现在密钥库适用于 Java 11,它使用的证书与我之前签署应用程序时使用的证书相同。

        【讨论】:

          【解决方案9】:

          我昨天遇到了同样的问题。我删除了位于/Users/<username>/.android/debug.keystore 的旧调试密钥。对于像我这样的新手来说,我认为这是处理这个问题的最简单方法。

          附:不确定“发布”模式。这仅适用于“调试”模式。

          【讨论】:

            【解决方案10】:

            这对我来说很好:)

            /Users/macbookpro/Library/Java/JavaVirtualMachines/openjdk-16.0.1/Contents/Home/bin/keytool -genkey -v -keystore android/app/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload -storetype JKS
            

            【讨论】:

              【解决方案11】:

              我之前发现了这个问题,当我在 windows 10 64bit 中将 JDK 从 11 版本更改为 16 版本时解决了这个问题

              【讨论】:

                【解决方案12】:

                就我而言,我使用了 gradle 7.3 构建工具来编译源代码。它可以正常工作。

                首先,从这个链接下载 gradle:https://gradle.org/releases/

                解压到你喜欢的位置

                比运行这个命令:export PATH=$PATH:/gradle_bin_path

                这将只为当前终端会话添加 gradle 二进制文件。如果要永久添加此路径,则需要执行额外的步骤:

                首先运行此命令以获取您正在使用的终端:

                echo $SHELL
                

                我使用 zsh 作为 shell,所以如果输出是 /bin/zsh,则运行以下命令:

                sudo -s
                cd /users/username
                ls
                vim .zshrc
                

                在编辑 .zshrc 文件之前,请务必备份此文件

                然后在此文件中添加以下行:export PATH=$PATH:/gradle_bin_path

                保存并退出编辑器。

                比运行这个命令:source .zshrc

                路径列表现已更新。让我们运行这个命令:

                gradle --version
                

                它应该显示当前的 gradle 版本。

                现在,是时候编译应用了。让 cd 到你的项目所在的目录。

                然后,运行以下命令:gradle clean

                等到 gradle 完成同步您的项目。完成同步后,运行以下命令:

                gradle build
                

                最后,您将能够解决您的问题。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2021-07-29
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-05-17
                  • 1970-01-01
                  • 2021-10-30
                  相关资源
                  最近更新 更多