一、什麼是簽名?
若是這個問題不是放在Android開發中來問,若是是放在一個普通的版塊,我想你們都知道簽名的含義。可每每就是將一些生活中經常使用的術語放在計算機這種專業領域,你們就開始迷惑了。計算機所作的事情,或者說編程語言所作的事情,不正是在儘量地模擬現實嗎?因此,計算機中所說的簽名和生活中所說的簽名在本質上是同樣的,它所起到的做用也是一致的!html
讓咱們來看看,在現實生活中的簽名。好比下面這張圖片:
這是女星孫儷的簽名。簽名就意味着在紙上或別處寫下本身的名字,或者說在某處打上一個標記做爲你本身的一種特有的標識,當別人看到這個簽名的時候,他會知道這是和你有關的,而不是其它人。
二、爲何要給Android應用程序簽名?
若是隻能用一句簡單的話語來回答這個問題的話,我會說:「這是Android系統所要求的」。
Android系統要求每個Android應用程序必需要通過數字簽名纔可以安裝到系統中,也就是說若是一個Android應用程序沒有通過數字簽名,是沒有辦法安裝到系統中的!Android經過數字簽名來標識應用程序的做者和在應用程序之間創建信任關係,不是用來決定最終用戶能夠安裝哪些應用程序。這個數字簽名由應用程序的做者完成,並不須要權威的數字證書籤名機構認證,它只是用來讓應用程序包自我認證的。linux
三、爲何我開發的Android應用程序沒有作什麼簽名也能在模擬器和手機上運行?
你沒有給Android應用程序簽名並不表明Android應用程序沒有被簽名。爲了方便咱們開發調試程序,ADT會自動的使用debug密鑰爲應用程序簽名。debug密鑰?它在哪?debug密鑰是一個名爲debug.keystore的文件,它的位置:
系統盤符:/Documents and Settings/liufeng/.Android/debug.keystore
「liufeng」對應於你本身的windows操做系統用戶名,怎麼樣,是否是已經找到它了。這也就意味着,若是咱們想擁有本身的簽名,而不是讓ADT幫咱們簽名的話,咱們也要有一個屬於本身的密鑰文件(*.keystore)。android
四、Android應用程序簽名步驟
1)準備工做
apk的簽名工做能夠經過兩種方式來完成:
1)經過ADT提供的圖形化界面完成apk簽名;
2)徹底經過DOS命令來完成apk簽名
我比較喜歡第2)種方式,因此下面將講解如何經過命令的方式完成apk簽名。
給apk簽名一共要用到3個工具,或者說3個命令,分別是:keytool、jarsigner和zipalign,下面是對這3個工具的簡單介紹:
1)keytool:生成數字證書,即密鑰,也就是上面說到的擴展名爲.keystore的那類文件;
2)jarsigner:使用數字證書給apk文件簽名;
3)zipalign:對簽名後的apk進行優化,提升與Android系統交互的效率(Android SDK1.6版本開始包含此工具)
從這3個工具的做用也能夠看出,這3個工具的使用順序。一般咱們本身所開發的全部應用程序,都是使用一樣的簽名,即便用同一個數字證書,這就意味着:若是你是第一次作Android應用程序簽名,上面的3個工具都將用到;但若是你已經有數字證書了,之後再給其它apk簽名時,只須要用到jarsigner和zipalign就能夠完成。
爲了方便使用上面3個命令,首先須要將上面3個工具所在路徑添加到環境變量path中(我說的是爲了方便使用,沒有說必需要這麼作)。怎麼配置環境變量就不在此講解了,這裏須要說一下這3個工具默認所在的路徑:
1)keytool:該工具位於jdk安裝路徑的bin目錄下;
2)jarsigner:該工具位於jdk安裝路徑的bin目錄下;
3)zipalign:該工具位於Android-sdk-windows/tools/(實際操做中,是目錄:C:\Android\sdk\build-tools\xx(和SDK Platform-Tools相匹配的SDK Build-Tools版本)\zipalign)目錄下
不知道你們是否注意到keytool和jarsigner兩個工具是jdk自帶的,也就意味着生成數字證書和文件簽名不是Android的專利;另外從字面上理解jarsigner也能猜得出該工具主要是用來給jar文件簽名的。
2)生成未經簽名的apk文件
既然咱們要本身對apk進行簽名,就再也不須要ADT默認幫咱們簽名了。如何獲得一個未經簽名的apk文件呢?打開Eclipse,在Android工程名稱上點擊右鍵,依次選擇「Android Tools」 - 「Export Unsigned Application Package ...」,而後選擇一個存儲位置保存便可。這樣就獲得了一個未經簽名的apk文件。算法
生成未經簽名的apk文件遇到了問題,參考文章:編程
APK打包時,引用的appcompat_v7工程包報錯的解決辦法windows
Android APP打包時,出錯:"XXX" is not translated in "af" (Afrikaans), "am" (Amharic), "ar" (Arabic).....app
Illegal resource reference: @*android resources are private and not always present 解決方案
編程語言
3)使用keytool工具生成數字證書工具
先介紹cmd下的兩個命令:優化
跳轉到目錄C:\Program Files\Java\jdk1.8.0_45\bin:
> cd C:\Program Files\Java\jdk1.8.0_45\bin
查看目錄下內容
> dir
使用keytool工具生成數字證書
說明:
1)keytool是工具名稱,-genkey意味着執行的是生成數字證書操做,-v表示將生成證書的詳細信息打印出來,顯示在dos窗口中;
2)-keystore liufeng.keystore 表示生成的數字證書的文件名爲「liufeng.keystore」;
3)-alias liufeng.keystore 表示證書的別名爲「liufeng.keystore」,固然能夠不和上面的文件名同樣;
4)-keyalg RSA 表示生成密鑰文件所採用的算法爲RSA;
5)-validity 20000 表示該數字證書的有效期爲20000天,意味着20000天以後該證書將失效
在執行上面的命令生成數字證書文件時,會提示你輸入一些信息,包括證書的密碼,示例以下:
完成上述操做後,在 keytool 所在的目錄下會生成xxx.keystore 的數字證書。