一、Android 簽名機(jī)制Android 簽名機(jī)制可劃分為 ROM 簽名機(jī)制與第三方 APK 簽名機(jī)制,在這里只討論 APK 簽名機(jī)制。 Android 系統(tǒng)在安裝 APK 的時(shí)候,首先會(huì)檢驗(yàn) APK 的簽名,如果發(fā)現(xiàn)簽名文件不存在或者校驗(yàn)簽名失敗,則會(huì)拒絕安裝,所以應(yīng)用程序在發(fā)布之前一定要進(jìn)行簽名。給 APK 簽名可以帶來(lái)以下好處:
二、簽名原理對(duì)一個(gè) APK 文件簽名之后,APK 文件根目錄下會(huì)增加 META-INF 目錄,該目錄下增加三個(gè)文件: 其中 .RSA 文件還可能是 .DSA 文件,RSA 與 SF 文件的文件名可以更改,但是它們的命名必須一樣。 MANIFEST.MF 中保存了 APK 里所有文件的 SHA1 校驗(yàn)值的 BASE64 編碼,格式如下(一個(gè)文件對(duì)應(yīng)一條記錄):
Name: res/anim/abc_fade_in.xml
SHA1-Digest: ohPEA4mboaFUu9LZMUwk7FmjbPI= SF 文件里保存了 MANIFEST.MF 文件的 SHA1 校驗(yàn)值的 BASE64 編碼,同時(shí)還保存了 MANIFEST.MF 中每一條記錄的 SHA1 檢驗(yàn)值 BASE64 編碼,格式如下:
SHA1-Digest-Manifest: ZRhh1HuaoEKMn6o21W1as0sMlaU= RSA 文件則包含了簽名的公鑰、簽名所有者等信息,還保存了用 SHA1withRSA 簽名算法對(duì)SF文件的簽名結(jié)果信息。 Android 系統(tǒng)就是根據(jù)這三個(gè)文件的內(nèi)容對(duì) APK 文件進(jìn)行簽名檢驗(yàn)的。 三、Android 簽名方法1、apksign、jarsinger一般的簽名過(guò)程可以由 apksign.jar 或者 jarsinger.jar 完成。apksign.jar 由 Android SDK 提供,使用方法如下: java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk 它接受一個(gè) PEM 公鑰文件,PK8 私鑰文件,對(duì) update.apk 進(jìn)行簽名,簽名后的文件保存到 update_signed.apk。 jarsinger 是由 JDK 提供,使用方法如下: jarsigner -verbose -keystore d:\\debug.keystore -signedjar update_signed.apk update.apk androiddebugkey -digestalg SHA1 -sigalg MD5withRSA -keypass android -storepass android 其中: -keystore 表示 keystore 文件的路徑
androiddebugkey 表示 keystore 中的一個(gè)別名
-digestalg 表示摘要算法
-sigalg 表示簽名算法
-keypass 表示別名密碼
-storepass 表示 keystore 密碼 經(jīng)過(guò)測(cè)試,我們發(fā)現(xiàn)以上兩個(gè)傳統(tǒng)的簽名工具存在以下缺點(diǎn): 1)、jarsigner 在對(duì)一個(gè)已經(jīng)有 META-INF 目錄的 APK 進(jìn)行簽名的時(shí)候,有可能會(huì)報(bào)錯(cuò):
jarsigner: 無(wú)法對(duì) jar 進(jìn)行簽名: java.util.zip.ZipException: invalid entry compressed size (expected 1368 but got 1379 bytes)
2)、如果 APK 中已經(jīng)有簽名文件且簽名文件中的 RSA(或 DSA )、SF 文件的命名不是 CERT 的時(shí)候,用這兩個(gè)簽名工具進(jìn)行簽名后,會(huì)出現(xiàn): META-INF 目錄下會(huì)有兩個(gè) RSA / SF文件,會(huì)導(dǎo)致 APK 在安裝的時(shí)候失敗。 3)、簽名花費(fèi)時(shí)間長(zhǎng)。這兩個(gè)簽名工具在生成簽名后的 APK 時(shí),是按 Zip 中一個(gè) entry 接一個(gè) entry 依次拷貝的,效率十分低。因?yàn)橛螒蝾?lèi)型 APK 類(lèi)文件數(shù)量一般比較多,所以這一缺陷在簽名游戲類(lèi)型 APK 時(shí),體現(xiàn)得尤為明顯。 2、極速簽名工具(ApkSinger)針對(duì) signapk.jar 與 jarsigner 在簽名過(guò)程的缺點(diǎn),我們開(kāi)發(fā)了新的簽名工具 ApkSinger.jar。主要是在保證簽名正確的基礎(chǔ)上: 1) 可以對(duì)已簽名 APK 或已存在 META-INF 目錄的 APK 進(jìn)行簽名。 2) 增加對(duì)目錄處理的支持。通常在打多個(gè)渠道包時(shí),需要對(duì)多個(gè) APK 進(jìn)行簽名,所以增加對(duì)目錄的簽名支持是有必要的。 3) 提高處理效率,優(yōu)化簽名時(shí)間。對(duì)目錄處理時(shí),優(yōu)勢(shì)猶為明顯! 命令行下運(yùn)行:java -jar ApkSigner.jar 查看版本號(hào)與使用方法:
NetEase ApkSigner1.2
Usage:
java -jar ApkSigner.jar [-appname test] -keystore keystorePath -alias alias [-pswd password] [-aliaspswd aliasPassword] apkPath(or directory)
選了幾個(gè)不同體積的APK包進(jìn)行測(cè)試,分別是:20M,144M,343M。分別建立文件夾 A、B、C, 分別放5個(gè)包(假設(shè)要打5個(gè)渠道包)。分別調(diào)用 jarsigner,signapk.jar, ApkSinger.jar 對(duì)各個(gè)文件夾里的APK進(jìn)行簽名,簽名速度結(jié)果對(duì)比如下: 可以看出,極速簽名工具(ApkSinger)的速度較其他的簽名工具是非常快的,可以極大地優(yōu)化打包流程,節(jié)省打包時(shí)間。工具下載鏈接:http://apk.aq.163.com/apkpack.do#download,另外,網(wǎng)易云加密 中也內(nèi)置了快速簽名工具以及多渠道打包的功能,歡迎提出反饋和建議。 APP架構(gòu)師 |
|
來(lái)自: tory_you > 《臨時(shí)文章》