执行flutter build apk --split-per-abi提示:app:packageRelease任务失败
问题根因
报错Algorithm HmacPBESHA256 not available的核心原因是生成upload-keystore.jks签名文件时使用的JDK版本过高:JDK 18及以上版本生成jks文件默认采用HmacPBESHA256加密算法,但当前Flutter项目依赖的Android Gradle插件、构建用JDK版本较低,不支持该算法,直接导致签名文件读取失败、release包打包中断。
修复方案
按落地成本从低到高排序,可自行选择:
方案1:重新生成兼容格式的签名文件(优先推荐,无兼容隐患)
注意:如果应用已经上架应用商店,重新生成时填写的密钥别名、签名库密码、密钥密码、主体信息必须和原签名完全一致,否则后续升级包会因签名不匹配无法上架、无法覆盖安装。
- 切换到JDK 11环境(Android Studio默认自带的JBR runtime就是JDK11,可直接使用,路径一般在Android Studio安装目录的jbr文件夹下)
- 执行签名生成命令,显式指定兼容的加密算法、存储格式:
keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload -storetype JKS
- 按提示输入对应密码、组织信息后,会在用户根目录生成新的签名文件,覆盖原路径下的旧文件即可
- 回到项目根目录执行
flutter clean清理构建缓存,再运行flutter build apk --split-per-abi即可正常打包
方案2:对齐构建链路的JDK版本(无需重新生成签名)
如果不想改动原有签名文件,可以直接把Gradle构建用的JDK版本切换为生成签名时用的高版本JDK:
- 打开项目下的android目录,进入Android Studio
- 依次打开
Settings > Build, Execution, Deployment > Build Tools > Gradle配置页 - 将
Gradle JDK选项切换为本地安装的JDK 18及以上版本 - 保存配置后执行
flutter clean,重新触发打包即可
方案3:转换现有签名文件的加密格式
如果不想重新填写签名信息,也可以直接对现有jks文件做格式转换:
- 先在高版本JDK环境下执行命令,把原有jks转成中间p12格式:
keytool -importkeystore -srckeystore ~/upload-keystore.jks -destkeystore ~/upload-temp.p12 -deststoretype PKCS12
- 按提示输入原签名库密码完成转换
- 切换回JDK11环境,把p12文件转回兼容的JKS格式:
keytool -importkeystore -srckeystore ~/upload-temp.p12 -srcstoretype PKCS12 -destkeystore ~/upload-keystore-fixed.jks -deststoretype JKS
- 用生成的
upload-keystore-fixed.jks替换原签名文件,保持android/app/build.gradle里的签名配置不变即可
避坑提示
- 正式发布用的签名文件不要用JDK 18+版本默认参数生成,目前绝大多数稳定版AGP对HmacPBESHA256算法的兼容支持不完善
- 签名文件务必多备份,一旦丢失没有任何办法找回,会直接导致应用无法正常迭代上架
内容的提问来源于stack exchange,提问作者Ariyo
相关产品推荐
相关产品推荐

