1. 產生Android APK包簽署憑證
1). 在doc中切換到jdk的bin目錄
cd C:\Program Files\Java\jdk1.6.0_18\bin
2). 運行下面的命令
keytool –genkey –alias android123.keystore –keyalg RSA –validity 20000 –keystore android123.keystore
/*解釋:keytool工具是Java JDK內建的認證工具
-genkey參數表示:要產生一個認證(著作權、身份識別的安全性憑證)
-alias參數表示:認證有別名,-alias mine.keystore表示認證別名為:mine
-keyalg RSA表示加密類型,RSA表示需要加密,以防止別人盜取
-validity 20000表示有效時間20000天( K3
-keystore mine123.keystore表示要產生的認證名稱為mine123
*/
輸入完斷行符號後螢幕顯示:
輸入keystore密碼:[密碼不回顯](一般建議使用20位,最好記下來後面還要用)
再次輸入新密碼:[密碼不回顯]
您的名字與姓氏是什嗎?
[Unknown]:lili
您的組織單位名稱是什嗎?
[Unknown]:snoopy
您的組織名稱是什嗎?
[Unknown]:snoopy team
您所在的城市或地區名稱是什嗎?
[Unknown]:beijing
您所在的州或省份名稱是什嗎?
[Unknown]:beijing
該單位的兩字母國家代碼是什麼
[Unknown]:CN
CN=lili, U=snoopy, O=snoopy team, L=beijing, ST=beijing, C=CN正確嗎?
[否]:Y
輸入< mine.keystore>的主密碼
(如果和keystore密碼相同,按斷行符號):
查看C:\Program Files\Java\jdk1.6.0_18\bin,產生了以後簽名用的認證Key:mine123.keystore
這裡,大家如果試過在eclipse中產生一個簽名檔案時,它的大小也是2kb,同時產生過程中,還是會讓填寫別名的。
2. 刪除之前的簽名檔案
1). 用解壓工具解壓縮apk檔案(如:解壓到D:\Sign\PhoneBook)
壓縮包內容解析:
該檔案是每個應用都必須定義和包含的,它描述了應用的名字、版本、許可權、引用的庫檔案等等資訊[ , ],如要把apk上傳到Google Market上,也要對這個xml做一些配置。在apk中的AndroidManifest.xml是經過壓縮的,可以通過AXMLPrinter2工具[ , ]解開,具體命令為:java -jar AXMLPrinter2.jar AndroidManifest.xml
META-INF目錄下存放的是簽名資訊,用來保證apk包的完整性和系統的安全。在eclipse編譯產生一個apk包時,會對所有要打包的檔案做一個校正計算,並把計算結果放在META-INF目錄下。這就保證了apk包裡的檔案不能被隨意替換。比如拿到一個apk包後,如果想要替換裡面的一幅圖片,一段代碼, 或一段著作權資訊,想直接解壓縮、替換再重新打包,基本是不可能的。如此一來就給病毒感染和惡意修改增加了難度,有助於保護系統的安全。
res目錄存放資源檔。包括圖片,字串等等。
lib目錄下的子目錄armeabi存放的是一些so檔案。這個地方多講幾句,都是在開發過程中摸索出來的。eclipse在打包的時候會根據檔案名稱的命名規則(lib****.so)去打包so檔案,開頭和結尾必須分別為“lib”和“.so”,否則是不會打包到apk檔案中的。其他非eclipse開發環境沒有測試過。如果你是用SDK和NDK開發的話,這部分很重要,甚至可以通過把一些不是so檔案的檔案通過改名打包到apk中,具體能幹些什麼那就看你想幹什麼了,呵呵呵!
assets目錄可以存放一些設定檔,這些檔案的內容在程式運行過程中可以通過相關的API獲得。具體的方法可以參考SDK中的例子:在sdk的 \SDK\1.6\android-sdk-windows-1.6_r1\platforms\android-1.6\samples\ApiDemos 例子中,有個com.example..android.apis.content 的例子,在這個例子中他把一個text檔案放到工程的asset目錄下,然後把這個txt當作普通檔案處理。處理的過程在ReadAsset.java中。同理,asset也可以放置其他檔案。
classes.dex是java源碼編譯後產生的java位元組碼檔案。但由於Android使用的dalvik虛擬機器與標準的java虛擬機器是不相容的,dex檔案與class檔案相比,不論是檔案結構還是opcode都不一樣。目前常見的java反編譯工具都不能處理dex檔案。Android模擬器中提供了一個dex檔案的反編譯工具,dexdump。用法為首先啟動Android模擬器,把要查看的dex檔案用adb push上傳的模擬器中,然後通過adb shell登入,找到要查看的dex檔案,執行dexdump
xxx.dex。另,有人介紹到Dedexer是目前在網上能找到的唯一一個反編譯dex檔案的開源工具,需要自己編譯原始碼。
編譯後的二進位資源檔 ”
2). 找到下面的目錄META-INF,刪除目錄META-INF
3). 將PhoneBook整個檔案夾用zip工具,重新打包成zip壓縮包,然後更改尾碼為apk (注意:產生的PhoneBook.zip中沒有二級根目錄)
3. 重新簽名APK檔案
1). 將認證複製到與需要重新簽名的apk檔案相同的目錄下(如:複製到D:\Sign)
2). 在doc中切換到需要重新前面的apk檔案的目錄下
cd D:\Sign
3). 運行下面的命令
jarsigner –verbose –keystore mine123.keystore –signedjar PhoneBook_signed.apk PhoneBook.apk mine.keystore
/*解釋:hjarsigner是Java的簽名工具
-verbose參數表示:顯示出簽名詳細資料
-keystore表示使用目前的目錄中的mine123.keystore簽署憑證檔案。
-signedjar PhoneBook_signed.apk表示簽名後產生的APK名稱,PhoneBook.apk表示未簽名的APK Android軟體, mine.keystore表示別名
*/
輸入完斷行符號後螢幕如顯示:
查看D:\Sign目錄,已產生重新簽名後的PhoneBook_signed.apk檔案
另外,有時候會發現這種方式打出的APK包在某些地方用不了,文章《簡單修改APK和重新簽名》提供了一個更為便捷的方案。
參考資料:
重新簽名APK檔案