1).APK簽名的要點a.全部的應用程序都必須有數字證書 ,Android系統不會安裝一個沒有數字證書的應用程序;java
b.Android程序包使用的數字證書能夠是自簽名的,不須要一個權威的數字證書機構簽名認證;android
c.數字證書都是存在有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。若是程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能。 算法
d.Android使用標準的java工具 Keytool 、Jarsigner 來生成數字證書,並給應用程序包簽名。windows
2).APK簽名的好處 安全
a、應用程序升級: 若是想升級應用程序,簽名證書要相同,包名稱要相同!b、應用程序模塊化:Android 系統能夠容許同一個證書籤名的多個應用程序在一個進程裏運行,系統實際把他們做爲一個單個的應用程序,此時就能夠把咱們的應用程序以模塊的方式進行部署,而用戶能夠獨立的升級其中的一個模塊。數據結構
c、代碼或者數據共享:Android 提供了基於簽名的權限機制,那麼一個應用程序就可 覺得另外一個以相同證書籤名的應用程序公開本身的功能。以同一個證書對多個應用程序進行 簽名,利用基於簽名的權限檢查,你就能夠在應用程序間以安全的方式共享代碼和數據了。3).APK重簽名原理
a、Android系統簽名主要有ROM簽名和應用程序APK簽名兩種形式。ROM簽名是針對已經生成的Android系統ROM包進行簽名。應用程序APK簽名是針對開發者開發的應用程序APK進行簽名。模塊化
b、APK其實是一個jar或者說是一個zip壓縮文件,META-INF目錄下存放的是壓縮包中全部文件的簽名信息,用來保證apk包的完整性和系統的安全。工具
c、重簽名:實際上就是刪除META-INF目錄(刪除已有簽名),使用自已數據證書再次重簽名。優化
注:APK若有簽名自校驗(代碼有校驗)須要修改其代碼,非今天文章內容。 spa
1).工具a.數字證書生成:keytool
JAVA自帶工具 如:JDK1.7例:路徑 C:\Program Files\Java\jdk1.7.0_55\bin\keytool.exeb.從新簽名:jarsignerJAVA自帶工具 如:JDK1.7例: 路徑 C:\Program Files\Java\jdk1.7.0_55\bin\jarsigner.exec.優化APK:zipalignAndroid SDK自帶工具例:路徑 C:\Program Files\adt-bundle-windows-x86_64-20140321\sdk\tools\zipalign.exe
2).準備工做
a.安裝JDK,配置環境變量
b.安裝Android SDK,配置環境變量
1)、本機keystore數字證書
a、找現成的keystore文件
路徑 C:\Documents and Settings\Findyou\.android\debug.keystore
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天以後該證書將失效**/
(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壓縮,不是RARc.能夠用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。
偶爾手工敲敲代碼無所謂,須要簽名的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,所有重簽名。
執行結果圖:
1)、重簽名安裝失敗(證書問題)
檢查:是否JDK1.7,若是JDK1.7簽名問題,JARSIGNER須要增長兩個參數。
-digestalg SHA1 -sigalg MD5withRSA
2)、安裝成功,運行失敗
檢查:a.首先須要排除重簽名問題(再重籤一遍安裝)
b.重籤再裝仍有問題,檢查是否程序有自簽名檢查,若有簽名檢查較爲複雜。大致講解一下思路,反編譯代碼爲JAVA找到簽名檢查代碼,分析邏輯,用apktool反編譯,修改對應smail代碼,再從新打包,簽名。