生成apk最懶惰的方法是:只要你運行過android項目,到工做目錄的bin文件夾下就能找到與項目同名的apk文件,這種apk默認是已經使用debug用戶簽名的。html
若是想要本身給apk簽名:android
1.簽名的意義
爲了保證每一個應用程序開發商合法ID,防止部分開放商可能經過使用相同的Package Name來混淆替換已經安裝的程序,咱們須要對咱們發佈的APK文件進行惟一簽名,保證咱們每次發佈的版本的一致性(如自動更新不會由於版本不一致而沒法安裝)。
2.簽名的步驟
a.建立key
b.使用步驟a中產生的key對apk簽名
3.具體操做
方法一: 命令行下對apk簽名(原理)
建立key,須要用到keytool.exe (位於jdk1.6.0_24\jre\bin目錄下),使用產生的key對apk簽名用到的是jarsigner.exe (位於jdk1.6.0_24\bin目錄下),把上兩個軟件所在的目錄添加到環境變量path後,打開cmd輸入
D:\>keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore/*說明:-genkey 產生密鑰 -alias demo.keystore 別名 demo.keystore -keyalg RSA 使用RSA算法對簽名加密 -validity 40000 有效期限4000天 -keystore demo.keystore */D:\>jarsigner -verbose -keystore demo.keystore -signedjar demo_signed.apk demo.apk demo.keystore/*說明:-verbose 輸出簽名的詳細信息 -keystore demo.keystore 密鑰庫位置 -signedjar demor_signed.apk demo.apk demo.keystore 正式簽名,三個參數中依次爲簽名後產生的文件demo_signed,要簽名的文件demo.apk和密鑰庫demo.keystore.*/
注意事項:android工程的bin目錄下的demo.apk默認是已經使用debug用戶簽名的,因此不能使用上述步驟對此文件再次簽名。正確步驟應該是:在工程點擊右鍵->Anroid Tools-Export Unsigned Application Package導出的apk採用上述步驟簽名。
方法二:使用Eclipse導出帶簽名的apk
Eclipse直接能導出帶簽名的最終apk,很是方便,推薦使用,步驟以下:
第一步:導出。算法
第二步:建立密鑰庫keystore,輸入密鑰庫導出位置和密碼,記住密碼,下次Use existing keystore會用到。windows
第三步:填寫密鑰庫信息,填寫一些apk文件的密碼,使用期限和組織單位的信息。eclipse
第四步:生成帶簽名的apk文件,到此就結束了。模塊化
第五步:若是下次發佈版本的時候,使用前面生成的keystore再簽名。函數
第六步:Next,Next,結束!
方法三:使用IntelliJ IDEA導出帶簽名的apk
方法步驟基本和Eclipse相同,大概操做路徑是:菜單Tools->Andrdoid->Export signed apk。
4.簽名以後,用zipalign(壓縮對齊)優化你的APK文件。
未簽名的apk不能使用,也不能優化。簽名以後的apk谷歌推薦使用zipalign.exe(位於android-sdk-windows\tools目錄下)工具對其優化:
D:\>zipalign -v 4 demo_signed.apk final.apk
如上,zipalign可以使apk文件中未壓縮的數據在4個字節邊界上對齊(4個字節是一個性能很好的值),這樣android系統就可使用mmap()(請自行查閱這個函數的用途)函數讀取文件,能夠在讀取資源上得到較高的性能,
PS:1.在4個字節邊界上對齊的意思就是,通常來講,是指編譯器吧4個字節做爲一個單位來進行讀取的結果,這樣的話,CPU可以對變量進行高效、快速的訪問(較以前不對齊)。
2.對齊的根源:android系統中的Davlik虛擬機使用本身專有的格式DEX,DEX的結構是緊湊的,爲了讓運行時的性能更好,能夠進一步用"對齊"進一步優化,可是大小通常會有所增長。
5.簽名對你的App的影響。
你不可能只作一個APP,你可能有一個宏偉的戰略工程,想要在生活,服務,遊戲,系統各個領域都想插足的話,你不可能只作一個APP,谷歌建議你把你全部的APP都使用同一個簽名證書。
使用你本身的同一個簽名證書,就沒有人可以覆蓋你的應用程序,即便包名相同,因此影響有:
1) App升級。 使用相同簽名的升級軟件能夠正常覆蓋老版本的軟件,不然系統比較發現新版本的簽名證書和老版本的簽名證書不一致,不會容許新版本安裝成功的。
2) App模塊化。android系統容許具備相同的App運行在同一個進程中,若是運行在同一個進程中,則他們至關於同一個App,可是你能夠單獨對他們升級更新,這是一種App級別的模塊化思路。
3) 容許代碼和數據共享。android中提供了一個基於簽名的Permission標籤。經過容許的設置,咱們能夠實現對不一樣App之間的訪問和共享,以下:
AndroidManifest.xml:<permission android:protectionLevel="normal" />
其中protectionLevel標籤有4種值:normal(缺省值),dangerous, signature,signatureOrSystem。簡單來講,normal是低風險的,全部的App不能訪問和共享此App。dangerous是高風險的,全部的App都能訪問和共享此App。signature是指具備相同簽名的App能夠訪問和共享此App。signatureOrSystem是指系統image中App和具備相同簽名的App能夠訪問和共享此App,谷歌建議不要使用這個選項,由於簽名就足夠了,通常這個許可會被用在在一個image中須要共享一些特定的功能的狀況下。工具
在程序代碼告一段落後,須要發佈程序,之後還有後續版本更新,用戶下載後自動提示更新。post
可是平時測試都是debug的方式安裝了,可是一個程序不多是一我的在作,因此生成的密鑰都是不同的,性能
這就形成用戶須要手動卸載當前一樣簽名的程序,而後才能安裝新版本的程序。
這就須要作到運用相同的簽名了。
兩步:
1:經過Java自帶的keytool命令,在命令行生成輸入
keytool -genkey -alias clientkey -validity 1 -keystore kclient.keystore
即可以生成kclient.keystore密鑰文件,(更詳細http://blog.csdn.net/xiaojunhu/article/details/8263687)
2:右擊eclipse中的項目android tools-->Export Signs....
a:
b:選擇項目
c:選擇剛生成的密鑰及輸入密鑰密碼
d:選密鑰別名及確認密碼
e:選擇APK生成地址
完成。
爲了進行程序簽名,必須有一個合適的密鑰。這個密鑰應有如下特徵:
若是沒有合適的key,則須要使用Keytool來生成一個。用Keytool生成一個key,可以使用keytool命令並傳入一些可選參數。