問題來源
上一把都還調(diào)試安裝正常,添加庫,修改gradle文件,然后簽名驗(yàn)證失敗,出現(xiàn)如下錯(cuò)誤:

嘗試解決方式
1.手動(dòng)生成簽名文件,并生成apk,push到手機(jī)安裝,提示 " 安裝包解析失敗 "
分析:初步判斷和簽名方式有關(guān),但是一般未指定keyStore文件,調(diào)試狀態(tài)下默認(rèn)使用系統(tǒng)盤下Users\xxx.android\debug.keystore,而且在修改gradle文件里面僅僅是添加依賴,并未修改相關(guān)簽名配置;
2.修改gradle簽名配置,無效

分析:很多兄弟說到Android7.0后使用新的簽名方式,打包以防萬一,兩種方式都勾選,然后一拍腦袋手動(dòng)配置debug的簽名,并指明兩種簽名方式均可用。為什么無效呢?進(jìn)源碼一看:(原來這兩個(gè)值默認(rèn)就是true,根本不用設(shè)置)

3.換手機(jī)試試,用Android7、Android10的手機(jī),編譯、安裝都正常
分析:到這里確實(shí)產(chǎn)生困惑了,按理說Android6手機(jī)不行,高于6就正常,確實(shí)應(yīng)該和簽名方式有關(guān)啊,束手無策...
4、各種clean、InvalidCache And Restart、重啟電腦,無效
5、終極辦法,恢復(fù)版本,所有手機(jī)編譯、安裝、運(yùn)行正常
分析:原來和添加的依賴包有關(guān),回頭一看只是添加了Mqtt相關(guān)依賴,并未有多余動(dòng)作,猛然想起高版本手機(jī)貌似拋出過異常,當(dāng)時(shí)一心解決簽名問題,忽略了,回頭看看:

6、排查異?!癝ecurityException: Invalid signature file digest for Manifest main attributes”
分析:這個(gè)非常見異常,趕緊去查了查:
原因?yàn)閙aven打包之后由于重復(fù)引用某些依賴導(dǎo)致生成了一些.RSA、.DSA和.SF等文件,運(yùn)行jar時(shí)會(huì)拋出該異常,多數(shù)解決方案都是刪除Jar中的這些文件,于是修改打包配置:

7、成功,依賴中的.RSA、.DSA、.SF為什么會(huì)產(chǎn)生6.0及以下系統(tǒng)的簽名異常
分析:首先想到的還是簽名方式,V1是驗(yàn)證單個(gè)的ZIP條目,而V2則是驗(yàn)證壓縮文件的所有字節(jié)碼,在安裝apk的時(shí)候,手機(jī)會(huì)使用簽名META-INF目錄下的簽名摘要信息文件進(jìn)行簽名驗(yàn)證,而由MAVEN依賴新產(chǎn)生的一些.RSA、.DSA、.SF與META-INF下面產(chǎn)生沖突,解析APK時(shí)檢索到的以這幾個(gè)后綴名的文件并非我們以KeyStore產(chǎn)生的摘要信息文件,所以導(dǎo)致簽名驗(yàn)證失敗。

總結(jié)一下
1、V1(JAR)簽名需要對apk內(nèi)所有文件進(jìn)行簽名,V2方案是針對APK整體文件進(jìn)行簽名;同理安裝校驗(yàn)簽名,V1需要對所有文件進(jìn)行hash校驗(yàn),V2只需要校驗(yàn)一次。
2、V1只保證了Apk壓縮包內(nèi)每個(gè)文件的完整性,不能保證整個(gè)包的完整性,V2兩者均能保證。
3、有較多文件的工程,V2在打包、安裝解析兩個(gè)過程中明顯快于V1