构建APK报错:生成已签名Android应用包时提示Algorithm HmacPBESHA256不可用
Execution failed for task ':app:packageRelease'.
A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable
com.android.ide.common.signing.KeytoolException: Failed to read key 1 from store "/Users/KDApps/Documents/KDApps/original-signing-keystore.jks": Integrity check failed: java.security.NoSuchAlgorithmException: Algorithm HmacPBESHA256 not available
错误根源
该报错是不同JDK版本对JKS密钥库的默认完整性校验算法支持不一致导致的:JDK 9及更高版本创建的JKS密钥库默认使用HmacPBESHA256做完整性校验,而JDK 8及更低版本没有内置该算法,直接读取就会触发上述错误。你提到的SHA1withRSA是APK的签名算法,和本次报错无关。
解决方案
方案1:临时适配(无需修改原有密钥库)
直接将Android Studio的构建JDK版本切换为和生成密钥库时一致的版本即可,操作步骤:
- 打开Android Studio,依次进入
File > Settings > Build, Execution, Deployment > Build Tools > Gradle(Mac系统路径为Android Studio > Settings > Build, Execution, Deployment > Build Tools > Gradle) - 在
Gradle JDK下拉选项中选择匹配的JDK版本,若密钥库是JDK 8生成的就选JDK 8,是高版本JDK生成的就选对应版本的JDK - 同步Gradle后重新执行打包签名操作
方案2:转换密钥库格式,永久兼容所有JDK版本
如果需要在不同JDK环境下都能正常读取密钥库,可通过keytool命令转换密钥库格式,操作前务必先备份原有密钥库,步骤如下:
- 使用生成原有密钥库的JDK版本,执行命令导出密钥库内容为PKCS12格式:
keytool -importkeystore -srckeystore 你的原密钥库路径.jks -destkeystore 临时导出文件路径.p12 -deststoretype PKCS12
执行时按提示输入原密钥库密码、目标p12文件的密码(可与原密码保持一致)
2. 使用JDK 8执行命令,将PKCS12格式内容导入为新的兼容格式JKS密钥库:
keytool -importkeystore -srckeystore 临时导出文件路径.p12 -srcstoretype PKCS12 -destkeystore 新密钥库路径.jks -deststoretype JKS -storepass 你要设置的新密钥库密码
- 替换项目中原有配置的密钥库为新生成的JKS文件,同步Gradle后重新打包即可。转换后的密钥库签名与原密钥库完全一致,不会影响Google Play的应用更新校验。
内容的提问来源于stack exchange,提问作者KDApps

