Android覆蓋升級以及apk簽名

1. 爲什麼要簽名


1) 發送者的身份認證
由於開發商可能通過使用相同的Package Name來混淆替換已經安裝的程序,以此保證簽名不同的包不被替換


2) 保證信息傳輸的完整性
簽名對於包中的每個文件進行處理,以此確保包中內容不被替換


3) 防止交易中的抵賴發生,Market對軟件的要求


2. 簽名的說明


1) 所有的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序


2) Android程序包使用的數字證書可以是自簽名的,不需要一個權威的數字證書機構簽名認證


3) 如果要正式發佈一個Android應用,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布


4) 數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。如果程序已經安裝在系統中,即使證書過期也不會影響程序的正常功能


5) 簽名後需使用zipalign優化程序


6) Android將數字證書用來標識應用程序的作者和在應用程序之間建立信任關係,而不是用來決定最終用戶可以安裝哪些應用程序


3. 簽名的方法


1) 用eclipse插件方式簽名


a) 調試簽名
eclipse插件默認賦予程序一個DEBUG權限的簽名,此簽名的程序不能發佈到market上,此簽名有效期爲一年,如果過期則導致你無法生成apk文件,此時你只要刪除debug keystore即可,系統又會爲你生成有效期爲一年的新簽名


b) 開發者生成密鑰並簽名
右鍵點擊項目名,在菜單中選擇Android Tools,然後選擇Export Signed Application Package…,即可通過eclipse自定義證書並簽名


c) 開發者導出未簽名的包
右鍵點擊項目名,在菜單中選擇Android Tools,然後選擇Export Signed Application Package…,即可導出未簽名的包,之後可通過命令行方式簽名


2) 用命令行方式簽名
使用標準的java工具keytool和jarsigner來生成證書和給程序簽名


a) 生成簽名
$ keytool -genkey -keystore keyfile -keyalg RSA -validity 10000 -alias yan
注:validity爲天數,keyfile爲生成key存放的文件,yan爲私鑰,RSA爲指定的加密算法(可用RSA或DSA)


b) 爲apk文件簽名
$ jarsigner -verbose -keystore keyfile -signedjar signed.apk base.apk yan
注:keyfile爲生成key存放的文件,signed.apk爲簽名後的apk,base.apk 爲未簽名的apk,yan爲私鑰


c) 看某個apk是否經過了簽名
$ jarsigner -verify my_application.apk


d) 優化(簽名後需要做對齊優化處理)
$ zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk


3) 在源碼中編譯的簽名


a) 使用源碼中的默認簽名
在源碼中編譯一般都使用默認簽名的,在某源碼目錄中用運行
$ mm showcommands能看到簽名命令
Android提供了簽名的程序signapk.jar,用法如下:
$ signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar
*.x509.pem爲x509格式公鑰,pk8爲私鑰
build/target/product/security目錄中有四組默認簽名可選:testkey platform shared media(具體見README.txt),應用程序中Android.mk中有一個LOCAL_CERTIFICATE字段,由它指定用哪個key簽名,未指定的默認用testkey.


b) 在源碼中自簽名
Android提供了一個腳本mkkey.sh(build/target/product/security/mkkey.sh),用於生成密鑰,生成後在應用程序中通過Android.mk中的LOCAL_CERTIFICATE字段指名用哪個簽名


c) mkkey.sh介紹


i. 生成公鑰
openssl genrsa -3 -out testkey.pem 2048
其中-3是算法的參數,2048是密鑰長度,testkey.pem是輸出的文件


ii. 轉成x509格式(含作者有效期等)
openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000 -subj ‘/C=US/ST=California/L=MountainView/O=Android/OU=Android/CN=Android/[email protected]


iii. 生成私鑰
openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt
把的格式轉換成PKCS #8,這裏指定了-nocryp,表示不加密,所以簽名時不用輸入密碼


4. 簽名的相關文件


1) apk包中籤名相關的文件在meta_INF目錄下
CERT.SF:生成每個文件相對的密鑰
MANIFEST.MF:數字簽名信息
xxx.SF:這是JAR文件的簽名文件,佔位符xxx標識了簽名者
xxx.DSA:對輸出文件的簽名和公鑰


2) 相關源碼
development/tools/jarutils/src/com.anroid.jarutils/SignedJarBuilder.java
frameworks/base/services/java/com/android/server/PackageManagerService.java
frameworks/base/core/java/android/content/pm/PackageManager.java
frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java
dalvik/libcore/security/src/main/java/java/security/Sign*
build/target/product/security/platform.*
build/tools/signapk/*


5. 簽名的相關問題
一般在安裝時提示出錯:INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES


1) 兩個應用,名字相同,簽名不同


2) 升級時前一版本簽名,後一版本沒簽名


3) 升級時前一版本爲DEBUG簽名,後一個爲自定義簽名


4) 升級時前一版本爲Android源碼中的籤














很多Android開發者不明白APK簽名有什麼作用。其實APK簽名用處主要有兩種:


  1. 使用特殊的key簽名可以獲取到一些不同的權限。


  2. APK如果使用一個key簽名,發佈時另一個key簽名的文件將無法安裝或覆蓋老的版本,這樣可以防止你已安裝的應用被惡意的第三方覆蓋或替換掉。


  目前google在Android系統方面的態度和策略也都是非盈利性質的,和Symbian的簽名有本質的區別,而我們使用Eclipse+ADT插件從開發環境安裝到手機中的APK文件已經包含了ADT插件的Debug簽名文件,所以沒有安裝,但是最終發行的版本需要自己的key去簽名。

發佈了8 篇原創文章 · 獲贊 17 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章