標籤:
重新打包apk,使用java bin目錄裡的jarsigner進行簽名
反編譯android apk包使用apktool工具,http://download.csdn.net/detail/fancylovejava/8447801
命令:
cmd>cd /d E:\apktool
apktool d xxxx.apk執行後會在當前apktool目錄下產生一個xxxx名的檔案,此檔案就是apk包反編譯後的檔案
然後如果想在asset目錄下添加個檔案,可以放在檔案下,不過代碼需要修改預先寫入讀取asset的邏輯
然後使用命令apktool b xxxx<這個是目錄> 然後會在xxxx目錄裡多出個dist檔案,裡麵包含個重新打包好的apk,但是這個apk沒有使用keystore簽名,所以需要使用java的jarsigner進行簽名
命令如下
C:\Program Files\Java\jdk1.8.025\bin>jarsigner -verbose -keystore keybaohuai -digestalg SHA1 -sigalg MD5withRSA -signedjar AndroidTestsigned.apk zhaocaixiong_101.apk baohuai
會出現一行警告
警告:未提供 -tsa 或 -tsacert, 此 jar 沒有時間戳記。如果沒有時間戳記, 則在簽名者認證的到期日 (2113-10-30) 或以後的任何撤銷日期之後, 使用者可能無法驗證此 jar。
注意
jarsigner 簽名命令裡加入如下參數來解決:-digestalg SHA1 -sigalg MD5withRSA
可以忽略,安裝後測試是否可行!
利用標準的java工具keytool.exe(位於jdk\jre\bin目錄下)建立key,利用jarsigner.exe工具使用產生認證和給程式簽名(位於jdk\bin目錄下)。
win+R運行cmd,進入目錄D:\temp(注:使用該目錄為樣本工作目錄)
a)、建立可以,運行如下命令
keytool -genkey -alias demo.keystore -keyalg RSA -validity 20000 -keystore demo.keystore
/*說明:keytool工具是Java JDK內建的認證工具
-genkey參數表示:要產生一個認證(著作權、身份識別的安全性憑證)
-alias參數表示:認證有別名,-alias demo.keystore表示認證別名為:demo
-keyalg RSA表示加密類型,RSA表示需要加密,以防止別人盜取
-validity 20000表示有效時間20000天
-keystore demo.keystore表示要產生的認證名稱為demo
b)、刪除之前的簽名檔案
用解壓縮工具解開啟apk檔案(如:更改a.apk為a.zip,便可用壓縮公用程式開啟,並找到下面的目錄META-INF下的CERT.RSA和CERT.SF檔案,並刪除該檔案。刪除後,再次更改尾碼名為.apk;)
註:
META-INF目錄:存放簽名後的CERT和MANIFEST檔案,用於識別軟體的簽名及著作權。
res目錄:存放各種Android原始資源,包括:動畫anim、圖片drawable、布局layout、menu菜單、xml等等
AndroidManifest.xml編碼後的Android項目描述檔案,包括了Android項目的名稱、版本、許可權、程式組件描述等等
classes.dex編譯後Class被dx程式轉換成Dalvik虛擬機器的可執行位元組碼檔案
resources.arsc所有文本資源的編譯產物,裡麵包含了各Location對應的字串資源。
c)、使用產生的key對apk簽名,運行如下命令:
jarsigner -verbose -keystore demo.keystore -signedjar demo_signed.apk demo.apk demoAlias
/*說明:jarsigner是java的簽名工具
-verbose參數表示:顯示出簽名詳細資料
-keystore表示:使用目前的目錄中的demo.keystore簽署憑證檔案。
-signedjar demo_signed.apk demo.apk demo正式簽名,三個參數中依次為簽名後產生的檔案
demo_signed,要簽名的檔案demo.apk和秘鑰庫demo.keystore.*/
(注:查看某個apk是否經過了簽名方法,jarsigner -verify demo.apk。最佳化:簽名後需要做對齊最佳化處理zipalign -v 4 yourprojectname-unaligned.apk yourprojectname.apk)
重新打包apk,使用java bin目錄裡的jarsigner進行簽名