解决Android Studio下flutter使用签名构建失败的问题

在 Android Studio 运行 flutter build apk 命令来构建安装包时,如果使用了签名,我们可能会遇到下面的问题:

1
2
Failed to read key upload from store "<your keystore>": Integrity check failed: 
java.security.NoSuchAlgorithmException: Algorithm HmacPBESHA256 not available

本文将介绍这一问题的解决办法

环境

  • windows 10

  • Android Studio:

    Android Studio Arctic Fox | 2020.3.1 Patch 3

    Build #AI-203.7717.56.2031.7784292, built on October1.2021

    Runtime version: 11.0.10+0-b96-7249189 amd64

  • flutter:2.2.3

  • Dart:2.13.4

原因分析

出现这一问题的原因是 Android Studio 内置的 JAVA 版本为 JAVA11,但 HmacPBESHA256 是 JAVA12 才加入 keytool 的。Gradle 在构建时使用了 JAVA11(而不是环境变量 JAVA_HOME 所指向的版本),而它不支持 HmacPBESHA256 ,导致报错退出。

为了验证我们的猜想,可以在 <project dir>/android/app/build.gradle 的最后加入下面这三行代码,再次运行 flutter build apk ,我们会发现它使用的 JAVA 版本是 JAVA11,而不是环境变量 JAVA_HOME 所指向的版本。

1
2
3
task javaHome {
println "JAVA_HOME:" + System.getProperty("java.home")
}

解决方法

所以问题就变得非常简单:我们需要指定 Gradle 所使用的 JAVA 版本

首先查询已经安装的 JAVA 位置:

1
2
C:\Users\Administrator>set JAVA_HOME
JAVA_HOME=D:\Program Files\Java\jdk-16.0.2

如果这里显示的是一个 JAVA11 或以下的版本,需要先安装 JAVA12 或以上的版本。

根据 Gradle 文档的指引,我们在 ~/.gradle/gradle.properties 文件中加入以下一行(将 ~ 替换为你的用户文件夹,比如 C:\Users\Administrator

1
org.gradle.java.home=D:\\Program Files\\Java\\jdk-16.0.2

注意

  • 如果找不到这个文件,手动添加
  • 如果文件中已经有对 org.gradle.java.home 的配置,先删除
  • D:\\Program Files\\Java\\jdk-16.0.2 替换为你的 JAVA_HOME
  • 不要忘记双反斜杠转义

完成之后,回到项目文件夹运行 flutter build apk ,构建成功。

作者

Cao Mingjun

发布于

2021-10-14

更新于

2021-10-14

许可协议

评论