Android之apk文件簽名——keytool 和 jarsigner

一、生成密鑰庫
將位置定位在jdk的bin文件中,輸入以下命名行:

keytool -genkey -alias ChangeBackgroundWid get.keystore -keyalg RSA -validity 20000 -eystore ChangeBackgroundWidget.keystore

上面的命令中間不換行,按下“Enter”鍵,並根據提示填寫相關信息,詳細信息如下及圖1(validity為有效期,這裡有效期為20000天):
輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什麼?
[Unknown]:  mythlink
您的組織單位名稱是什麼?
[Unknown]:  www.mythlink.com
您的組織名稱是什麼?
[Unknown]:  www.mythlink.com
您所在的城市或區域名稱是什麼?
[Unknown]:  Shen Zhen
您所在的州或省份名稱是什麼?
[Unknown]:  Guang Dong
該單位的兩字母國傢代碼是什麼
[Unknown]:  CN
CN=mythlink, OU=www.mythlink.com, O=www.mythlink.com, L=Shen Zhen, ST=Guang Dong
, C=CN 正確嗎?
[否]:  Y
輸入<ChangeBackgroundWidget.keystore>的主密碼
(如果和 keystore 密碼相同,按回車):

 keytool

                                     圖1

二、可以生成簽名的apk文件

這裡輸入文件ChangeBackgroundWidget.apk,最終生成ChangeBackgroundWidget_signed.apk為Android簽名後的APK執行文件
輸入以下命令行:

jarsigner -verbose -keystore ChangeBackgroundWidget.keystore -signedjar ChangeBackgroundWidget_signed.apk ChangeBackgroundWidget.apk ChangeBackgroundWidget.keystore

上面的命令中間不換行,按“Enter”鍵,根據提示輸入密鑰庫的口令短語(即密碼),詳細信息如下及圖2:
輸入密鑰庫的口令短語:
正在添加: META-INF/MANIFEST.MF
正在添加: META-INF/CHANGEBA.SF
正在添加: META-INF/CHANGEBA.RSA
正在簽名: res/drawable/icon.png
正在簽名: res/drawable/icon_audio.png
正在簽名: res/drawable/icon_exit.png
正在簽名: res/drawable/icon_folder.png
正在簽名: res/drawable/icon_home.png
正在簽名: res/drawable/icon_img.png
正在簽名: res/drawable/icon_left.png
正在簽名: res/drawable/icon_mantou.png
正在簽名: res/drawable/icon_other.png
正在簽名: res/drawable/icon_pause.png
正在簽名: res/drawable/icon_play.png
正在簽名: res/drawable/icon_return.png
正在簽名: res/drawable/icon_right.png
正在簽名: res/drawable/icon_set.png
正在簽名: res/drawable/icon_text.png
正在簽名: res/drawable/icon_xin.png
正在簽名: res/layout/fileitem.xml
正在簽名: res/layout/filelist.xml
正在簽名: res/layout/main.xml
正在簽名: res/layout/widget.xml
正在簽名: res/xml/widget_info.xml
正在簽名: AndroidManifest.xml
正在簽名: resources.arsc
正在簽名: classes.dex

 jarsinger

                                          圖2

====================================================

在運行這種方式中,我碰到過幾種不同的問題:
問題一:jarsigner: 無法打開 jar 文件: ChangeBackgroundWidget.apk
我的解決方法是:將要進行簽名的APK放到對應的文件下,如我把要簽名的ChangeBackgroundWidget.apk放到JDK的bin文件裡。
問題二:jarsigner: 無法對 jar 進行簽名: java.util.zip.ZipException: invalid entry comp
ressed size (expected 1598 but got 1622 bytes)
這個問題,我還沒解決,在網上搜瞭下,找到瞭一種方法,但我實踐沒完全,所以不知道這個解決方法是否正確:
方法一:Android開發網提示這些問題主要是由於資源文件造成的,對於android開發來說應該檢查res文件夾中的文件,逐個排查。這個問題可以通過升級系統的JDK和JRE版本來解決。
方法二:這是因為默認給apk做瞭debug 簽名,所以無法做新的簽名這時就必須點工程右鍵->Android Tools ->Export Unsigned Application Package.
或者從AndroidManifest.xml的 Exporting上也是一樣的
然後再基於這個導出的unsigned apk做簽名,導出的時候最好將其目錄選在你之前產生keystore的那個目錄下,這樣操作起來就方便瞭。
==========================================
MS我找到瞭第二個問題的解決方法瞭。。。
首先右擊要簽名APK對應的項目,選中“Android Tools”右擴展欄中的“Export Unsigned Application Package…”,,如圖3

 export

                                                 圖3

在彈出的對話框中將這個未簽名的apk儲存在jdk的bin文件夾中,如圖4:

 save

                                                 圖4

然後在運行上面的步驟即可。

發佈留言