Android簽名詳解(debug和release)
4. 簽名的相關(guān)文件
1) apk包中簽名相關(guān)的文件在meta_INF目錄下
CERT.SF:生成每個(gè)文件相對的密鑰
MANIFEST.MF:數字簽名信息
xxx.SF:這是JAR文件的簽名文件,占位符xxx標識了簽名者
xxx.DSA:對輸出文件的簽名和公鑰
2) 相關(guān)源碼
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. 簽名的相關(guān)問(wèn)題
一般在安裝時(shí)提示出錯:INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
1) 兩個(gè)應用,名字相同,簽名不同
2) 升級時(shí)前一版本簽名,后一版本沒(méi)簽名
3) 升級時(shí)前一版本為DEBUG簽名,后一個(gè)為自定義簽名
4) 升級時(shí)前一版本為Android源碼中的簽
5.1 查看默認簽名
不同的機子上或不同的設備上,利用eclipse編譯出的apk簽名是不一樣的。eclipse都有一個(gè)默認的簽名。查看簽名路徑:
1)打開(kāi)EclipseàWindowàAndoridàBuild,在這個(gè)Build界面,找到Default debug keysore這個(gè)編輯框,里面的值則為本臺設備中Eclipse的keystore的默認路徑。
2)如果出現因簽名不同而導致應用程序未安裝,可以將原先的keystore替換掉當前設備上的keystore。并重新啟動(dòng)Eclipse。否則只能完全卸載掉移動(dòng)設備上的apk,重新安裝了。
5.2 無(wú)法覆蓋安裝
1、通過(guò)簽名的方式生成你的APK,而不是直接從Bin目錄底下去拷貝,每個(gè)Android可執行程序的APK都有自己的簽名,只要簽名一致,就可以覆蓋安裝,而不需要卸載;
2、數據庫表結構的變化(增加一個(gè)字段,減少一個(gè)字段,新表的建立)。正常升級數據庫的方法 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
3、sharepreferences的數據有改變,這個(gè)跟數據庫差不多,比如原來(lái)的sharepreferences保存的一數據是boolean,在后一版本把保存的數據改為string,問(wèn)題就出現了。
5.3 導出簽名
1)打開(kāi)cmd控制臺,輸入命令:keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore,按照提示依次填寫(xiě)內容,并記住密碼,后面會(huì )用到;
2)生成好keystore后,就可以導出簽名apk了。Eclipse中,右擊需要簽名的工程àandroid toolsàexport signed application package,location為生成的keystore所在的位置,密碼為創(chuàng )建keystore時(shí)設置的密碼,然后按照提示,next,最后finish,成功導出簽名apk。
詳見(jiàn):http://blog.csdn.net/yiwanxinyuefml/article/details/6765129
5.4 debug簽名和release簽名的區別
1)debug簽名的應用程序不能在A(yíng)ndroid Market上架銷(xiāo)售,它會(huì )強制你使用自己的簽名;Debug模式下簽名用的證書(shū)(默認是Eclipse/ADT和Ant編譯)自從它創(chuàng )建之日起,1年后就會(huì )失效。
2)debug.keystore在不同的機器上所生成的可能都不一樣,就意味著(zhù)如果你換了機器進(jìn)行apk版本升級,那么將會(huì )出現上面那種程序不能覆蓋安裝的問(wèn)題,相當于軟件不具備升級功能!
6. Zipalign簡(jiǎn)單優(yōu)化
6.1 為什么要優(yōu)化
Android SDK中包含一個(gè)“zipalign”的工具,它能夠對打包的應用程序進(jìn)行優(yōu)化。在你的應用程序上運行zipalign,使得在運行時(shí)Android與應用程序間的交互更加有效率。因此,這種方式能夠讓?xiě)贸绦蚝驼麄€(gè)系統運行得更快。我們強烈推薦在新的和已經(jīng)發(fā)布的程序上使用zipalign工具來(lái)得到優(yōu)化后的版本——即使你的程序是在老版本的Android平臺下開(kāi)發(fā)的。
6.2 如何有助于性能改善
在A(yíng)ndroid中,每個(gè)應用程序中儲存的數據文件都會(huì )被多個(gè)進(jìn)程訪(fǎng)問(wèn);安裝程序會(huì )讀取應用程序的manifest文件來(lái)處理與之相關(guān)的權限問(wèn)題;Home應用程序會(huì )讀取資源文件來(lái)獲取應用程序的名和圖標;系統服務(wù)會(huì )因為很多種原因讀取資源(例如,顯示應用程序的Notification);此外,就是應用程序自身用到資源文件。
在A(yíng)ndroid中,當資源文件通過(guò)內存映射對齊到4字節邊界時(shí),訪(fǎng)問(wèn)資源文件的代碼才是有效率的。但是,如果資源本身沒(méi)有進(jìn)行對齊處理(未使用zipalign工具),它就必須回到老路上,顯式地讀取它們——這個(gè)過(guò)程將會(huì )比較緩慢且會(huì )花費額外的內存。
對于應用程序開(kāi)發(fā)者來(lái)說(shuō),這種顯式讀取方式是相當便利的。它允許使用一些不同的開(kāi)發(fā)方法,包括正常流程中不包含對齊的資源,因此,這種讀取方式具有很大的便利性(本段的原始意思請參考原文)。
遺憾的是,對于用戶(hù)來(lái)說(shuō),這個(gè)情況恰恰是相反的——從未對齊的apk中讀取資源比較慢且花費較多內存。最好的情況是,Home程序和未對齊的程序啟動(dòng)得比對齊后的慢(這也是唯一可見(jiàn)的效果)。最壞的情況是,安裝一些未對齊資源的應用程序會(huì )增加內存壓力,并因此造成系統反復地啟動(dòng)和殺死進(jìn)程。最終,用戶(hù)放棄使用如此慢又耗電的設備。
6.3 如何優(yōu)化
1)使用ADT:
如果你使用導出向導的話(huà),Eclipse中的ADT插件(從Ver.0.9.3開(kāi)始)就能自動(dòng)對齊Release程序包。
使用向導,右擊工程屬性,選擇Android ToolsàExport Signed Application Package。當然,你還可以通過(guò)AndroidManifest.xml編輯器的第一頁(yè)做到。
2)使用Ant:
Ant編譯腳本(從Android 1.6開(kāi)始)可以對齊程序包。老平臺的版本不能通過(guò)Ant編譯腳本進(jìn)行對齊,必須手動(dòng)對齊。
從Android 1.6開(kāi)始,Debug模式下編譯時(shí),Ant自動(dòng)對齊和簽名程序包。
Release模式下,如果有足夠的信息簽名程序包的話(huà),Ant才會(huì )執行對齊操作,因為對齊處理發(fā)生在簽名之后。為了能夠簽名程序包,進(jìn)而執行對齊操作,Ant必須知道keystore的位置以及build.properties中key的名字。相應的屬性名為key.store和key.alias。如果這些屬性為空,簽名工具會(huì )在編譯過(guò)程中提示輸入store/key的密碼,然后腳本會(huì )執行簽名及apk文件的對齊。如果這些屬性都沒(méi)有,Release程序包不會(huì )進(jìn)行簽名,自然也就不會(huì )進(jìn)行對齊了。
評論