關(guān)于簽名錯(cuò)誤"INSTALL_PARSE_FAILED_NO_CERTIFICATES"的踩坑之旅

問題來源

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


image.png

嘗試解決方式

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簽名配置,無效

image.png

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


image.png

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í)一心解決簽名問題,忽略了,回頭看看:


image.png

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中的這些文件,于是修改打包配置:

image.png

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)證失敗。
image.png

總結(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容