安装apk的时候总是提示 INSTALL_PARSE_FAILED_NO_CERTIFICATES 错误

安装apk的时候总是提示 INSTALL_PARSE_FAILED_NO_CERTIFICATES 错误

按照网上的各种方式都没有成功,后来


排查方法:

1、先排查签名文件aaa.keystore是否有误

使用eclipse来签名, 在工程点击右键->Anroid Tools-Export Unsigned Application Package

后来发现生成的apk能正常安装,说明aaa.keystore没有问题。


2、查看签名的方式

网络流行的方法是 jarsigner -verbose -keystore idiom.keystore -storepass 123456 -signedjar aaa_signed.apk aaa.apk aaa.keystore

还是报 INSTALL_PARSE_FAILED_NO_CERTIFICATES 错误


3、对比 aaa_signed.apk 、aaa.apk 签名前后的文件,发现META-INF/AAA_KE.SF文件有点不一样

签名后的是SHA-256-Digest-Manifest,签名前的是SHA1-Digest-Manifest,

查看资料发现两边的jre版本不一样,1.6.0之前的是SHA1-Digest-Manifest。

所以加上参数-digestalg SHA1,发现还是报错INSTALL_PARSE_FAILED_NO_CERTIFICATES 错误,这时候有点奔溃了。


4、之后再加上参数 -sigalg MD5withRSA, 发现问题终于解决了。

例子:

jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore aaa.keystore -storepass 123456 -signedjar aaa_signed.apk aaa.apk aaa.keystore

[-sigalg <算法>] 签名算法的名称

[-keystore <url>] 密钥库位置
[-storepass <口令>] 用于密钥库完整性的口令
[-storetype <类型>] 密钥库类型
[-keypass <口令>] 专用密钥的口令(如果不同)
[-sigfile <文件>] .SF/.DSA 文件的名称
[-signedjar <文件>] 已签名的 JAR 文件的名称
[-digestalg <算法>] 摘要算法的名称
[-sigalg <算法>] 签名算法的名称
[-verify] 验证已签名的 JAR 文件
[-verbose] 签名/验证时输出详细信息
[-certs] 输出详细信息和验证时显示证书
[-tsa <url>] 时间戳机构的位置
[-tsacert <别名>] 时间戳机构的公共密钥证书
[-altsigner <类>] 替代的签名机制的类名
[-altsignerpath <路径列表>] 替代的签名机制的位置
[-internalsf] 在签名块内包含 .SF 文件
[-sectionsonly] 不计算整个清单的散列
[-protected] 密钥库已保护验证路径
[-providerName <名称>] 提供者名称
[-providerClass <类> 加密服务提供者的名称
[-providerArg <参数>]] ... 主类文件和构造函数参数





推荐阅读