a、Android系統簽名主要有ROM簽名和應用程序APK簽名兩種形式。ROM簽名是針對已經生成的Android系統ROM包進行簽名。應用程序APK簽名是針對開發者開發的應用程序APK進行簽名。
b、APK實際上是一個jar或者說是一個zip壓縮文件,META-INF目錄下存放的是壓縮包中所有文件的簽名信息,用來保證apk包的完整性和系統的安全。
c、重簽名:實際上就是刪除META-INF目錄(刪除已有簽名),使用自已數據證書再次重簽名。
注:APK如有簽名自校驗(代碼有校驗)需要修改其代碼,非今天文章內容。
2、工具與准備工作
1).工具
a.數字證書生成:keytool
JAVA自帶工具 如:JDK1.7
例:路徑 C:\Program Files\Java\jdk1.7.0_55\bin\keytool.exe
b.重新簽名:jarsigner
JAVA自帶工具 如:JDK1.7
例: 路徑 C:\Program Files\Java\jdk1.7.0_55\bin\jarsigner.exe
c.優化APK:zipalign
Android SDK自帶工具
例:路徑 C:\Program Files\adt-bundle-windows-x86_64-20140321\sdk\tools\zipalign.exe
2).准備工作
a.安裝JDK,配置環境變量
b.安裝Android SDK,配置環境變量
3、操作步驟
1)、本機 keystore數字證書
a、找現成的keystore文件
路徑 C:\Documents and Settings\Findyou\.android\debug.keystore
debug.keystore
Keystore name: “debug.keystore”
Keystore password: “android”
Key alias: “androiddebugkey”
Key password: “android”
CN: “CN=Android Debug,O=Android,C=US”
b、keytool生成keystore數字證書:
(1).[CMD中執行下列命令]
keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000
/*解釋:
keytool是工具名稱,-genkey意味著執行的是生成數字證書操作,-v表示將生成證書的詳細信息打印出來,顯示在dos窗口中;
-keystore debug.keystore 表示生成的數字證書的文件名為“ debug.keystore”;
-alias androiddebugkey 表示證書的別名為“ androiddebugkey ”,可以與Keystore一樣;
-keyalg RSA 表示生成密鑰文件所采用的算法為RSA;
-validity 10000 表示該數字證書的有效期為10000天,意味著10000天之後該證書將失效
**/
執行結果
輸入密鑰庫口令: android
再次輸入新口令: android
您的名字與姓氏是什麼?
[Unknown]: Android Debug
您的組織單位名稱是什麼?
[Unknown]: Android
您的組織名稱是什麼?
[Unknown]: Android
您所在的城市或區域名稱是什麼?
[Unknown]: ShenZhen
您所在的省/市/自治區名稱是什麼?
[Unknown]: GuangDong
該單位的雙字母國家/地區代碼是什麼? [Unknown]: CN
CN=Android Debug, OU=Android, O=Android, L=ShenZhen, ST=GuangDong, C=CN是否正確?
[否]:Y
正在為以下對象生成 2,048 位RSA密鑰對和自簽名證書 (SHA256withRSA) (有效期為 10,000 天):
CN=Android Debug, OU=Android, O=Android, L=ShenZhen, ST=GuangDong, C=CN
輸入 <androiddebugkey> 的密鑰口令
(如果和密鑰庫口令相同, 按回車): [回車]
[正在存儲debug.keystore]
(2). debug.keystore生成在CMD執行命令的目錄中
2)、刪除原APK簽名文件
(1).ThinkDrive.apk重命名為ThinkDrive.zip,解壓ThinkDrive.zip文件
(2).ThinkDrive重名名為ThinkDrive_temp
(3).ThinkDrive_temp文件夾,找到META-INF,刪除META-INF
(4).將ThinkDrive_temp整個文件夾用zip工具,重新打包成zip壓縮包,然後更改後綴為apk
注意:
a.進入ThinkDrive_sign文件夾內直接打包文件,不是對ThinkDrive_sign整個文件夾打包,否則會產生二級根目錄)
b.注意是ZIP壓縮,不是RAR
c.可以用jar來解包,壓縮包
解包: jar -xvf ThinkDrive.apk -->為apk文件
壓縮包 jar -cvf ../ThinkDrive.apk ./ -->進入文件夾打包,不會產生二級根目錄;apk生成在上一層,防止死循環
3)、APK重簽名
jarsigner -verbose -keystore debug.keystore -storepass android -keypass android -signedjar Thinkdrive_signed.apk Thinkdrive_temp.apk androiddebugkey
/*解釋: jarsigner是Java的簽名工具
-verbose參數表示:顯示出簽名詳細信息
-keystore表示使用當前目錄中的debug.keystore簽名證書文件。
-storepass 密鑰口令
-signedjar ThinkDrive_signed.apk表示簽名後生成的APK名稱,
ThinkDrive_temp.apk 表示未簽名的APK,
androiddebugkey表示debug.keystore的別名
*/
4)、優化APK
zipalign -v 4 ThinkDrive_signed.apk Target.apk
注:
zipalign優化的最根本目的是幫助操作系統更高效率的根據請求索引資源,將resource-handling code統一將Data structure alignment(數據結構對齊標准:DSA)限定為4-byte boundaries。
小結:通過以上四個步驟 ,最終得到的 Target.apk (名稱自己可以第四步生成時自修改) 為重簽名後的APK。
4、裝X技巧
偶爾手工敲敲代碼無所謂,需要簽名的APK一多,那你就廢了。你會說,網上下載現成的重簽名jar啊之類的,多沒意思,來自己整一個批處理。
1)、代碼: [重簽名.bat]
復制代碼
@ECHO OFF
REM key的名稱
SET KEYSTORE_NAME=debug.keystore
REM key的別名
SET KEYSTORE_ALIAS=androiddebugkey
REM key的密碼
SET KEYSTORE_STOREPASS=android
SET KEYSTORE_KEYPASS=android
REM 臨時文件名或臨時文件夾名
SET TEMP_PREFIX=temp_
REM 重簽名後apk文件名前綴
SET RE-SIGNED=Re-signed_
FOR %%I IN (*.apk) DO (
ECHO [重簽名 %%I]
ECHO [創建與APK同名的文件夾]
REM 創建文件夾,如果已存在則先刪除
RD /S /Q 【%%I】
MD 【%%I】\%TEMP_PREFIX%
REM 復制需要重新簽名的apk文件到臨時文件夾中
COPY %%I 【%%I】\%TEMP_PREFIX%
REM 復制key到APK同名文件夾中
COPY %KEYSTORE_NAME% 【%%I】
REM 進入臨時文件夾
CD 【%%I】\%TEMP_PREFIX%
REM 解壓APK文件
JAR -xvf %%I
REM 刪除復制到臨時文件夾中的APK文件
DEL %%I
REM 刪除MANIFEST
RD /S /Q META-INF
REM 重新壓縮成apk文件
ECHO [重新打包成APK]
JAR -cvf ../%TEMP_PREFIX%%%I ./
CD ..
ECHO [JARSIGNER %%I]
REM 對APK包重新簽名,JDK1.7需要增加參數
JARSIGNER -VERBOSE -KEYSTORE %KEYSTORE_NAME% -STOREPASS %KEYSTORE_STOREPASS% %TEMP_PREFIX%%%I %KEYSTORE_ALIAS% -KEYPASS %KEYSTORE_KEYPASS%
ECHO [刪除JARSIGNER臨時文件]
RD /S /Q %TEMP_PREFIX%
REM 刪除同名文件夾中復制的debug.keystore
DEL %KEYSTORE_NAME%
ECHO [ZIPALIGN %%I]
REM 使用android的zipalign工具對apk文件進行優化
ZIPALIGN -v 4 %TEMP_PREFIX%%%I %RE-SIGNED%%%I
REM 檢查apk文件是否被優化
ZIPALIGN -c -v 4 %RE-SIGNED%%%I
ECHO [刪除ZIPALIGN臨時文件]
REM 刪除優化前的APK文件,保留優化後的APK
DEL %TEMP_PREFIX%%%I
CD ..
ECHO [重簽名完成] %RE-SIGNED%%%I
ECHO.
)
PAUSE
@ECHO ON
復制代碼
2)、使用方法
(1).拷貝 xxxx.keystore 簽名文件至 "重簽名.bat"所在目錄中
(2).拷貝需要重簽名的APK文件至 " 重簽名.bat"所在目錄中
(3).雙擊運行"重簽名.bat" 腳本
注:如需重簽名多個APK,可全部拷貝至 " 重簽名.bat"所在目錄中,BAT會查找到當前目錄下所有APK,全部重簽名。