最近在创建新项目的时候,使用AS生产新的签名并打包时,打包失败,一开始报签名格式问题,查了一下,有的说要迁移到行业标准格式PKCS12,但是试了一下还是报错,再次查资料发现是JDK版本问题,不过还有报这个错的:
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 key0 from store "E:\...\analysis.jks": Integrity check failed: java.security.NoSuchAlgorithmException: Algorithm HmacPBESHA256 not available
这是因为在jdk11环境导致的。在jdk11的环境下,使用AS生成签名文件对App进行签名,但是再进行签名时报出 Algorithm HmacSHA256 not available 的异常。
解决过程
单纯从日志观察是无法从AS生成的签名密钥存储文件(analysis.jks)中获取签名密钥(key0),而出现这个问题的原因是 HmacSHA256 这个算法不可用。
所以根本的原因就是 HmacSHA256 这个算法的问题,那么为什么这个算法不可用呢?
在网上看到相关的资料时怀疑可能是JDK版本的问题(网上的解释是JDK11中 HmacSHA256 这个算法不存在),推荐将JDK版本进行回退到1.8版本或者升级到16版本。但是我这边项目由于依赖问题无法将JDK版本进行升级或者回退。当然我也将回退方法贴出来...
————————————————
但是有一点很奇怪的事儿,我在JDK11的环境上对其他项目(存在签名密钥存储文件)进行编译出包是正常的。所以我怀疑出现这个问题可能是AS生成的签名密钥存储文件导致的。
所以我就本地生成了一个密钥存储文件,没想到问题就解决了...具体生产命令如下:
说明:
生成密钥文件的命令
keytool -genkeypair -alias key0 -keyalg RSA -keysize 2048 -validity 100000 -keystore analysis.jks
-genkeypair --- 产生密钥
-alias key0 --- 密钥的别名 key0
-keyalg RSA --- 使用RSA算法对签名文件进行加密
-keysize 2048 --- 密钥文件的大小为 2048
-validity 100000 --- 生成的签名文件的有效期为100000天
-keystore analysis.jks --- 生成签名文件的存放路径(自定义)
对Apk进行签名
jarsigner -verbose -keystore analysis.jks -signjar app-debug-sign.apk app-debug.apk analysis.jks
-verbose --- 输出详细信息
-keystore analysis.jks ---签名过程中使用的签名文件(注意使用key的绝对路径)
-signjar app-debug-sign.apk app-debug.apk analysis.jks --- 正式签名,三个参数依次为签名后的apk,待签名的apk以及签名文件,在这之后我也对本地签名进行了行业标准格式PKCS12迁移,打包就可以了,以此作为记录,如有遇到的朋友,可以照此方法解决
参考这位博主的文章,原文链接:https://blog.csdn.net/HaveFun_Wine/article/details/129836042