日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Android APK 快速簽名——優(yōu)化打包時(shí)間

 tory_you 2016-06-14

一、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)以下好處:

  • 應(yīng)用程序升級(jí)。

    如果想無(wú)縫升級(jí)一個(gè)應(yīng)用,Android 系統(tǒng)要求應(yīng)用程序的新版本與老版本具有相同的簽名與包名。若包名相同而簽名不同,系統(tǒng)會(huì)拒絕安裝新版應(yīng)用。

  • 應(yīng)用程序模塊化。

    Android 系統(tǒng)可以允許同一個(gè)證書(shū)簽名的多個(gè)應(yīng)用程序在一個(gè)進(jìn)程里運(yùn)行,系統(tǒng)實(shí)際把他們作為一個(gè)單個(gè)的應(yīng)用程序。此時(shí)就可以把我們的應(yīng)用程序以模塊的方式進(jìn)行部署,而用戶可以獨(dú)立的升級(jí)其中的一個(gè)模塊。

  • 代碼或數(shù)據(jù)共享。

    Android 提供了基于簽名的權(quán)限機(jī)制,一個(gè)應(yīng)用程序可以為另一個(gè)以相同證書(shū)簽名的應(yīng)用程序公開(kāi)自己的功能與數(shù)據(jù),同時(shí)其它具有不同簽名的應(yīng)用程序不可訪問(wèn)相應(yīng)的功能與數(shù)據(jù)。

  • 應(yīng)用程序的可認(rèn)定性。

    簽名信息中包含有開(kāi)發(fā)者信息,在一定程度上可以防止應(yīng)用被偽造。例如 網(wǎng)易云加密 對(duì) Android APK 加殼保護(hù)中使用的“校驗(yàn)簽名(防二次打包)”功能就是利用了這一點(diǎn)。

二、簽名原理

對(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=                    
                   Name: res/anim/abc_fade_out.xml                    SHA1-Digest: MTJWZc22b5LNeBboqBhxcQh5xHQ=                    

SF 文件里保存了 MANIFEST.MF 文件的 SHA1 校驗(yàn)值的 BASE64 編碼,同時(shí)還保存了 MANIFEST.MF 中每一條記錄的 SHA1 檢驗(yàn)值 BASE64 編碼,格式如下:

                   SHA1-Digest-Manifest: ZRhh1HuaoEKMn6o21W1as0sMlaU=                    
                   Name: res/anim/abc_fade_in.xml                    SHA1-Digest: wE1QEZhFkLBWMw4TRtxPdsiMRtA=                    
                   Name: res/anim/abc_fade_out.xml                    SHA1-Digest: MfCV1efdxSKtesRMF81I08Zyvvo=                    

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)                    


參數(shù)說(shuō)明
-appname待簽名的應(yīng)用程序名,可選,但建議不同的 APP 填上對(duì)應(yīng)的 app 名(可以為中文),有助于【加速】
-keystore后跟 .keystore 簽名文件/td>
-alias后跟簽名別名
-pswd后跟對(duì)應(yīng)簽名的密碼,可選,如果不填,則簽名的時(shí)候需要手動(dòng)輸入
-aliaspswd對(duì)應(yīng)別名 alias 的密碼,如果沒(méi)有則默認(rèn)使用 keystore Password

最后跟待簽名的 APK 路徑或者目錄路徑 ,如果跟的是目錄則是批量簽名。

選了幾個(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)師

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多