Android應用程序簽名詳解

1、什么是簽名?

如果這個問題不是放在Android開發(fā)中來問,如果是放在一個普通的版塊,我想大家都知道簽名的含義??赏褪菍⒁恍┥钪谐S玫男g(shù)語放在計算機這種專業(yè)領(lǐng)域,大家就開始迷惑了。計算機所做的事情,或者說編程語言所做的事情,不正是在盡可能地模擬現(xiàn)實嗎?所以,計算機中所說的簽名和生活中所說的簽名在本質(zhì)上是一樣的,它所起到的作用也是一致的!

2、為什么要給Android應用程序簽名?

如果只能用一句簡單的話語來回答這個問題的話,我會說:“這是Android系統(tǒng)所要求的”。
Android系統(tǒng)要求每一個Android應用程序必須要經(jīng)過數(shù)字簽名才能夠安裝到系統(tǒng)中,也就是說如果一個Android應用程序沒有經(jīng)過數(shù)字簽名,是沒有辦法安裝到系統(tǒng)中的!Android通過數(shù)字簽名來標識應用程序的作者和在應用程序之間建立信任關(guān)系,不是用來決定最終用戶可以安裝哪些應用程序。這個數(shù)字簽名由應用程序的作者完成,并不需要權(quán)威的數(shù)字證書簽名機構(gòu)認證,它只是用來讓應用程序包自我認證的。

3、為什么我開發(fā)的Android應用程序沒有做什么簽名也能在模擬器和手機上運行?

你沒有給Android應用程序簽名并不代表Android應用程序沒有被簽名。為了方便我們開發(fā)調(diào)試程序,ADT會自動的使用debug密鑰為應用程序簽名。debug密鑰?它在哪?debug密鑰是一個名為debug.keystore的文件,它的位置:
系統(tǒng)盤符:/Documents and Settings/liufeng/.android/debug.keystore
“l(fā)iufeng”對應于你自己的windows操作系統(tǒng)用戶名,怎么樣,是不是已經(jīng)找到它了。這也就意味著,如果我們想擁有自己的簽名,而不是讓ADT幫我們簽名的話,我們也要有一個屬于自己的密鑰文件(*.keystore)。

4、Android應用程序簽名步驟

1)準備工作

apk的簽名工作可以通過兩種方式來完成:
1)通過ADT提供的圖形化界面完成apk簽名;
2)完全通過DOS命令來完成apk簽名
我比較喜歡第2)種方式,所以下面將講解如何通過命令的方式完成apk簽名。
給apk簽名一共要用到3個工具,或者說3個命令,分別是:keytool、jarsigner和zipalign,下面是對這3個工具的簡單介紹:
1)keytool:生成數(shù)字證書,即密鑰,也就是上面說到的擴展名為.keystore的那類文件;
2)jarsigner:使用數(shù)字證書給apk文件簽名;
3)zipalign:對簽名后的apk進行優(yōu)化,提高與Android系統(tǒng)交互的效率(Android SDK1.6版本開始包含此工具)
從這3個工具的作用也可以看出,這3個工具的使用順序。通常我們自己所開發(fā)的所有應用程序,都是使用同樣的簽名,即使用同一個數(shù)字證書,這就意味著:如果你是第一次做Android應用程序簽名,上面的3個工具都將用到;但如果你已經(jīng)有數(shù)字證書了,以后再給其它apk簽名時,只需要用到j(luò)arsigner和zipalign就可以完成。
為了方便使用上面3個命令,首先需要將上面3個工具所在路徑添加到環(huán)境變量path中(我說的是為了方便使用,沒有說必須要這么做)。怎么配置環(huán)境變量就不在此講解了,這里需要說一下這3個工具默認所在的路徑:
1)keytool:該工具位于jdk安裝路徑的bin目錄下;
2)jarsigner:該工具位于jdk安裝路徑的bin目錄下;
3)zipalign:該工具位于android-sdk-windows/tools/目錄下
不知道大家是否注意到keytool和jarsigner兩個工具是jdk自帶的,也就意味著生成數(shù)字證書和文件簽名不是Android的專利;另外從字面上理解jarsigner也能猜得出該工具主要是用來給jar文件簽名的。

2)生成未經(jīng)簽名的apk文件

既然我們要自己對apk進行簽名,就不再需要ADT默認幫我們簽名了。如何得到一個未經(jīng)簽名的apk文件呢?打開Eclipse,在Android工程名稱上點擊右鍵,依次選擇“Android Tools” - “Export Unsigned Application Package ...”,然后選擇一個存儲位置保存即可。這樣就得到了一個未經(jīng)簽名的apk文件。

3)使用keytool工具生成數(shù)字證書

keytool -genkey -v -keystore liufeng.keystore -alias liufeng.keystore -keyalg RSA -validity 20000
說明:
1)keytool是工具名稱,-genkey意味著執(zhí)行的是生成數(shù)字證書操作,-v表示將生成證書的詳細信息打印出來,顯示在dos窗口中;
2)-keystore liufeng.keystore 表示生成的數(shù)字證書的文件名為“l(fā)iufeng.keystore”;
3)-alias liufeng.keystore 表示證書的別名為“l(fā)iufeng.keystore”,當然可以不和上面的文件名一樣;
4)-keyalg RSA 表示生成密鑰文件所采用的算法為RSA;
5)-validity 20000 表示該數(shù)字證書的有效期為20000天,意味著20000天之后該證書將失效
在執(zhí)行上面的命令生成數(shù)字證書文件時,會提示你輸入一些信息,包括證書的密碼,示例如下:


image.png
4)使用jarsigner工具為Android應用程序簽名

jarsigner -verbose -keystore liufeng.keystore -signedjar notepad_signed.apk notepad.apk liufeng.keystore
說明:
1)jarsigner是工具名稱,-verbose表示將簽名過程中的詳細信息打印出來,顯示在dos窗口中;
2)-keystore liufeng.keystore 表示簽名所使用的數(shù)字證書所在位置,這里沒有寫路徑,表示在當前目錄下;
3)-signedjar notepad_signed.apk notepad.apk 表示給notepad.apk文件簽名,簽名后的文件名稱為notepad_signed.apk;
4)最后面的liufeng.keystore 表示證書的別名,對應于生成數(shù)字證書時-alias參數(shù)后面的名稱

5)使用zipalign工具優(yōu)化已簽名的apk(非必須但建議這么做)

zipalign -v 4 notepad_signed.apk notepad_signed_aligned.apk
說明:
1)zipalign是工具名稱,-v表示在DOS窗口打印出詳細的優(yōu)化信息;
2)notepad_signed.apk notepad_signed_aligned.apk 表示對已簽名文件notepad_signed.apk進行優(yōu)化,優(yōu)化后的文件名為notepad_signed_aligned.apk

說明:如果你以前的程序是采用默認簽名的方式(即debug簽名),一旦換了新的簽名應用將不能覆蓋安裝,必須將原先的程序卸載掉,才能安裝上。因為程序覆蓋安裝主要檢查兩點:
1)兩個程序的入口Activity是否相同。兩個程序如果包名不一樣,即使其它所有代碼完全一樣,也不會被視為同一個程序的不同版本;
2)兩個程序所采用的簽名是否相同。如果兩個程序所采用的簽名不同,即使包名相同,也不會被視為同一個程序的不同版本,不能覆蓋安裝。
另外,可能有人可能會認為反正debug簽名的應用程序也能安裝使用,那也沒有必要自己簽名了嘛。千萬不要這樣想,debug簽名的應用程序有這樣兩個限制,或者說風險:
1)debug簽名的應用程序不能在Android Market上架銷售,它會強制你使用自己的簽名;
2)debug.keystore在不同的機器上所生成的可能都不一樣,就意味著如果你換了機器進行apk版本升級,那么將會出現(xiàn)上面那種程序不能覆蓋安裝的問題。不要小視這個問題,如果你開發(fā)的程序只有你自己使用,當然無所謂,卸載再安裝就可以了。但要是你的軟件有很多使用客戶,這就是大問題了,就相當于軟件不具備升級功能!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 參考什么是 Android 簽名機制,Bluebox Security 發(fā)現(xiàn)的漏洞有何威脅? Android應用程...
    合肥黑閱讀 2,151評論 1 16
  • ??Android系統(tǒng)由于其開源的屬性,市場上針對開源代碼定制的ROM參差不齊,在系統(tǒng)層面的安全防范和易損性都不一...
    道書簡閱讀 9,703評論 0 23
  • 為什么要簽名 簡單來說,Android系統(tǒng)要求這個做。Android系統(tǒng)要求每一個Android應用程序必須要經(jīng)過...
    發(fā)發(fā)呆喲閱讀 2,815評論 0 1
  • 一、前言 Android 簽名。 在說道Android簽名之前,我們需要了解的幾個知識點 1、數(shù)據(jù)摘要(數(shù)據(jù)指紋)...
    福later閱讀 21,744評論 0 13
  • 為了保證每個應用程序開發(fā)商合法ID,防止部分開放商可能通過使用相同的Package Name來混淆替換已經(jīng)安裝的程...
    Sunny君907閱讀 477評論 0 1

友情鏈接更多精彩內(nèi)容