Android簽名詳解(debug和release)


1. 為什么要簽名

1) 發送者的身份認證

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

2) 保證信息傳輸的完整性

簽名對於包中的每個文件進行處理,以此確保包中內容不被替換

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

2. 簽名的說明

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

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

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

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

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

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

3. 簽名的方法

有三種打包方式:命令行手動打包、ant自動編譯打包、eclipse+ADT編譯打包,打包步驟如下:

第一步 生成R.java類文件:

Eclipse中會自動生成R.java,ant和命令行使用android SDK提供的aapt.ext程序生成R.java。

第二步 將.aidl文件生成.java類文件:

Eclipse中自動生成,ant和命令行使用android SDK提供的aidl.exe生成.java文件。

第三步 編譯.java類文件生成class文件:

Eclipse中自動生成,ant和命令行使用jdk的javac編譯java類文件生成class文件。

第四步 將class文件打包生成classes.dex文件:

Eclipse中自動生成,ant和命令行使用android SDK提供的dx.bat命令行腳本生成classes.dex文件。

第五步 打包資源文件(包括res、assets、androidmanifest.xml等):

Eclipse中自動生成,ant和命令行使用Android SDK提供的aapt.exe生成資源包文件。

第六步 生成未簽名的apk安裝文件:

Eclipse中自動生成debug簽名文件存放在bin目錄中,ant和命令行使用android SDK提供的apkbuilder.bat命令腳本生成未簽名的apk安裝文件。

第七步 對未簽名的apk進行簽名生成簽名后的android文件:

Eclipse中使用Android Tools進行簽名,ant和命令行使用jdk的jarsigner對未簽名的包進行apk簽名。

 

3.1 用eclipse+ADT方式簽名

詳見:http://jojol-zhou.iteye.com/blog/719428

a) 調試簽名

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

b) 開發者生成密鑰並簽名

  右鍵點擊項目名,在菜單中選擇Android Tools,然后選擇Export Signed Application Package,即可通過eclipse自定義證書並簽名

c) 開發者導出未簽名的包

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

3.2 用命令行方式簽名

使用標准的java工具keytool和jarsigner來生成證書和給程序簽名。

詳見:http://jojol-zhou.iteye.com/blog/729254

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.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/emailAddress=android@android.com’

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源碼中的簽

5.1 查看默認簽名

  不同的機子上或不同的設備上,利用eclipse編譯出的apk簽名是不一樣的。eclipse都有一個默認的簽名。查看簽名路徑:

1)打開EclipseàWindowàAndoridàBuild,在這個Build界面,找到Default debug keysore這個編輯框,里面的值則為本台設備中Eclipse的keystore的默認路徑。

2)如果出現因簽名不同而導致應用程序未安裝,可以將原先的keystore替換掉當前設備上的keystore。並重新啟動Eclipse。否則只能完全卸載掉移動設備上的apk,重新安裝了。

5.2 無法覆蓋安裝

1、通過簽名的方式生成你的APK,而不是直接從Bin目錄底下去拷貝,每個Android可執行程序的APK都有自己的簽名,只要簽名一致,就可以覆蓋安裝,而不需要卸載;

2、數據庫表結構的變化(增加一個字段,減少一個字段,新表的建立)。正常升級數據庫的方法 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

3、sharepreferences的數據有改變,這個跟數據庫差不多,比如原來的sharepreferences保存的一數據是boolean,在后一版本把保存的數據改為string,問題就出現了。

5.3 導出簽名

1)打開cmd控制台,輸入命令:keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore,按照提示依次填寫內容,並記住密碼,后面會用到;

2)生成好keystore后,就可以導出簽名apk了。Eclipse中,右擊需要簽名的工程àandroid toolsàexport signed application package,location為生成的keystore所在的位置,密碼為創建keystore時設置的密碼,然后按照提示,next,最后finish,成功導出簽名apk。

詳見:http://blog.csdn.net/yiwanxinyuefml/article/details/6765129

5.4 debug簽名和release簽名的區別

1)debug簽名的應用程序不能在Android Market上架銷售,它會強制你使用自己的簽名;Debug模式下簽名用的證書(默認是Eclipse/ADT和Ant編譯)自從它創建之日起,1年后就會失效

2)debug.keystore在不同的機器上所生成的可能都不一樣,就意味着如果你換了機器進行apk版本升級,那么將會出現上面那種程序不能覆蓋安裝的問題,相當於軟件不具備升級功能!

6. Zipalign簡單優化

6.1 為什么要優化

  Android SDK中包含一個“zipalign”的工具,它能夠對打包的應用程序進行優化。在你的應用程序上運行zipalign,使得在運行時Android與應用程序間的交互更加有效率。因此,這種方式能夠讓應用程序和整個系統運行得更快。我們強烈推薦在新的和已經發布的程序上使用zipalign工具來得到優化后的版本——即使你的程序是在老版本的Android平台下開發的。

6.2 如何有助於性能改善

  在Android中,每個應用程序中儲存的數據文件都會被多個進程訪問;安裝程序會讀取應用程序的manifest文件來處理與之相關的權限問題;Home應用程序會讀取資源文件來獲取應用程序的名和圖標;系統服務會因為很多種原因讀取資源(例如,顯示應用程序的Notification);此外,就是應用程序自身用到資源文件。

  在Android中,當資源文件通過內存映射對齊到4字節邊界時,訪問資源文件的代碼才是有效率的。但是,如果資源本身沒有進行對齊處理(未使用zipalign工具),它就必須回到老路上,顯式地讀取它們——這個過程將會比較緩慢且會花費額外的內存。

  對於應用程序開發者來說,這種顯式讀取方式是相當便利的。它允許使用一些不同的開發方法,包括正常流程中不包含對齊的資源,因此,這種讀取方式具有很大的便利性(本段的原始意思請參考原文)。

  遺憾的是,對於用戶來說,這個情況恰恰是相反的——從未對齊的apk中讀取資源比較慢且花費較多內存。最好的情況是,Home程序和未對齊的程序啟動得比對齊后的慢(這也是唯一可見的效果)。最壞的情況是,安裝一些未對齊資源的應用程序會增加內存壓力,並因此造成系統反復地啟動和殺死進程。最終,用戶放棄使用如此慢又耗電的設備。

 

6.3 如何優化

1)使用ADT:

如果你使用導出向導的話,Eclipse中的ADT插件(從Ver.0.9.3開始)就能自動對齊Release程序包。

使用向導,右擊工程屬性,選擇Android ToolsàExport Signed Application Package。當然,你還可以通過AndroidManifest.xml編輯器的第一頁做到。

2)使用Ant:

Ant編譯腳本(從Android 1.6開始)可以對齊程序包。老平台的版本不能通過Ant編譯腳本進行對齊,必須手動對齊。

從Android 1.6開始,Debug模式下編譯時,Ant自動對齊和簽名程序包。

Release模式下,如果有足夠的信息簽名程序包的話,Ant才會執行對齊操作,因為對齊處理發生在簽名之后。為了能夠簽名程序包,進而執行對齊操作,Ant必須知道keystore的位置以及build.properties中key的名字。相應的屬性名為key.store和key.alias。如果這些屬性為空,簽名工具會在編譯過程中提示輸入store/key的密碼,然后腳本會執行簽名及apk文件的對齊。如果這些屬性都沒有,Release程序包不會進行簽名,自然也就不會進行對齊了。

3)手動:

為了能夠手動對齊程序包,Android 1.6及以后的SDK的tools/文件夾下都有zipalign工具。你可以使用它來對齊任何版本下的程序包。你必須在簽名apk文件后進行,使用以下命令:zipalign -v 4 source.apk destination.apk

4)驗證對齊:

zipalign -c -v 4 application.apk


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM