问题来源
上一把都还调试安装正常,添加库,修改gradle文件,然后签名验证失败,出现如下错误:
尝试解决方式
1.手动生成签名文件,并生成apk,push到手机安装,提示 " 安装包解析失败 "
分析:初步判断和签名方式有关,但是一般未指定keyStore文件,调试状态下默认使用系统盘下Users\xxx.android\debug.keystore,而且在修改gradle文件里面仅仅是添加依赖,并未修改相关签名配置;
2.修改gradle签名配置,无效
分析:很多兄弟说到Android7.0后使用新的签名方式,打包以防万一,两种方式都勾选,然后一拍脑袋手动配置debug的签名,并指明两种签名方式均可用。为什么无效呢?进源码一看:(原来这两个值默认就是true,根本不用设置)
3.换手机试试,用Android7、Android10的手机,编译、安装都正常
分析:到这里确实产生困惑了,按理说Android6手机不行,高于6就正常,确实应该和签名方式有关啊,束手无策...
4、各种clean、InvalidCache And Restart、重启电脑,无效
5、终极办法,恢复版本,所有手机编译、安装、运行正常
分析:原来和添加的依赖包有关,回头一看只是添加了Mqtt相关依赖,并未有多余动作,猛然想起高版本手机貌似抛出过异常,当时一心解决签名问题,忽略了,回头看看:
6、排查异常“SecurityException: Invalid signature file digest for Manifest main attributes”
分析:这个非常见异常,赶紧去查了查:
原因为maven打包之后由于重复引用某些依赖导致生成了一些.RSA、.DSA和.SF等文件,运行jar时会抛出该异常,多数解决方案都是删除Jar中的这些文件,于是修改打包配置:
7、成功,依赖中的.RSA、.DSA、.SF为什么会产生6.0及以下系统的签名异常
分析:首先想到的还是签名方式,V1是验证单个的ZIP条目,而V2则是验证压缩文件的所有字节码,在安装apk的时候,手机会使用签名META-INF目录下的签名摘要信息文件进行签名验证,而由MAVEN依赖新产生的一些.RSA、.DSA、.SF与META-INF下面产生冲突,解析APK时检索到的以这几个后缀名的文件并非我们以KeyStore产生的摘要信息文件,所以导致签名验证失败。
总结一下
1、V1(JAR)签名需要对apk内所有文件进行签名,V2方案是针对APK整体文件进行签名;同理安装校验签名,V1需要对所有文件进行hash校验,V2只需要校验一次。
2、V1只保证了Apk压缩包内每个文件的完整性,不能保证整个包的完整性,V2两者均能保证。
3、有较多文件的工程,V2在打包、安装解析两个过程中明显快于V1