使用apktool、jarsigner反編譯並重新簽名apk


問題來源:

              使用jarsigner對APK二次簽名,提示:jarsigner: 無法對 jar 進行簽名: java.util.zip.ZipException: invalid entry compressed size (expected 41278 but got 42575 bytes) 

 

網上說解決辦法是:把要重新簽名的apk后綴改成zip,打開后刪除里面的META-INF目錄,然后重新改成apk后綴

我采用的上面的方法,:unzip解壓apk-->刪除META-INF-->zip壓縮成新的apk-->簽名

                     新生成的apk,此方法apk雖然可以安裝成功,但是不能使用,會崩潰。

所以以我自己的經驗,不建議用上面的方法

我建議用這種方式:把要重新簽名的apk用apktool.jar反編譯,打開后刪除里面的META-INF目錄,然后使用apktool重編譯成改成apk,這樣保險點

我的流程是這樣的:(網上有很多apktool.jar的下載鏈接,就不詳些了,比如https://ibotpeaches.github.io/Apktool/install/)

(1)java -jar apktool.jar d old_name.apk    (說明:反編譯給定的old_name.apk)

  (2) rm old_name.apk (說明:刪除舊的apk)

  (2) rm -rf old_name/original/META-INF  (說明:刪除原有的簽名相關的文件)

 (3) java -jar apktool.jar b old_name (說明:重編譯apk)

 (4) mv old_name/dist/old_name.apk  target_name.apk (說明:重編譯生成的apk就是old_name/dist/old_name.apk)

 (5)jarsigner -verbose -digestalg SHA1 -sigalg SHA1withRSA -keystore aw.key -signedjar signed_target_name.apk  target_name.apk allis_aw -storepass secret 

(說明:用java自帶的命令jarsigner簽名,簽名算法可以根據自己的情況選擇,jarsigner默認使用的是SHA1-256,如果需要指定簽名算法為SHA1,需要加參數-digestalg SHA1 -sigalg SHA1withRSA,否則將會出現安裝失敗的問題,簽名以后文件中顯示的是SHA1-Digest,-keystore跟你的簽名證書key存儲文件,-signedjar new.apk old.apk allis_aw是你的key文件的簡稱  -storepass接key文件的密碼,參考https://blog.csdn.net/chen_xi_hao/article/details/73801631)

 (6)jarsigner -certs -verify signed_target_name.apk  (說明:驗證簽名)

(7)(說明:壓縮優化,參考https://blog.csdn.net/fulushan/article/details/80841649)

             zipalign_command="/usr/local/sdk/build-tools/25.0.3/zipalign"

             $zipalign_command -v 4 signed_target_name.apk  zipalign_signed_target_name.apk   

 

最后這個zipalign_signed_target_name.apk  就是我們需要的apk ,確保簽名算法滿足要求,安裝后可以正常使用

 

  上面的方法對於改動apk是沒毛病的,比如,我們打包了一個公版的包,所有的配置的都是開發默認設置的,這時候我們有個渠道包,比如小米渠道,只需要改下里面的圖標,如果我們完全再重新打包小米的渠道包,如果apk多呢,簡直就是浪費時間,這時我們可以用上面的方法,反編譯apk,刪掉META-INF,替換掉默認圖標為小米的圖標,再重編譯apk,再簽名就可以用了,這個過程腳本不要一分鍾就搞定了,大概20幾秒。

  如果我們不需要改apk里的東西呢,只是想重新簽名一下,比如我們會有這樣的場景需要驗證,apk只能是我們自己的簽名才能安裝,如果其他人換用其他簽名就會安裝失敗並報錯簽名不可用。這個時候我們只需要重新簽名apk就可以了,如果還是采用反編譯,刪META-INF,重編譯,再簽名,一個apk,我們可以忍受,多個apk呢,就有點吃力了。這個時候,我們可以采用另一種方式簽名:就是把key轉化成pk8和pem文件,然后一條命令就可以完成重簽名了,參考https://www.cnblogs.com/zndxall/p/9857767.html

 

另外轉一篇如何判斷兩個apk的簽名是否一致的博客:https://blog.csdn.net/qq_31490071/article/details/72842407


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM