Android 程序簽名打包
在上一章,我們創(chuàng)建了自己的 Android 工程,并成功的在模擬器中運(yùn)行起來(lái)。同時(shí)提到,工程目錄中有一個(gè) bin 目錄,運(yùn)行之后我們可以在此目錄下找到我們的 apk。那么不難想到,我們?cè)邳c(diǎn)“Run”之后,系統(tǒng)會(huì)編譯我們的代碼,并結(jié)合配置文件打出一個(gè) apk。
眾所周知 apk 是 Android 系統(tǒng)的安裝包,在我們編寫(xiě)完代碼,打包成 apk 之后,就可以將 apk 發(fā)布到應(yīng)用市場(chǎng),用戶(hù)下載 apk 后就可以安裝運(yùn)行了。這一切看似簡(jiǎn)單但暗藏玄機(jī),我們的 apk 一旦到了紛繁復(fù)雜的市場(chǎng),就需要考慮很多問(wèn)題。
比如如何將你發(fā)布的應(yīng)用和其他開(kāi)發(fā)者發(fā)布的應(yīng)用區(qū)分開(kāi);如何確認(rèn)用戶(hù)下載的 apk 就是官方發(fā)布的而不是個(gè)人開(kāi)發(fā)者;如何安全的完成應(yīng)用升級(jí)等等一系列的問(wèn)題。這些問(wèn)題有些涉及商業(yè),有些涉及系統(tǒng)安全,對(duì)于市場(chǎng)穩(wěn)定性而言都是至關(guān)重要的,解決這些問(wèn)題的,就是本章主角:Android 程序簽名打包。大家可能對(duì)這個(gè)技術(shù)比較陌生,接下來(lái)我們從 what、why、how 這三個(gè)角度讓大家對(duì)簽名打包有一個(gè)清晰的認(rèn)識(shí)。
1. 什么是簽名
現(xiàn)在你寫(xiě)了一本書(shū)并簽上自己的大名,將它出版之后放到各大書(shū)店,理想狀態(tài)就是讀者通過(guò)書(shū)名就能找到它。但是市面上的書(shū)不計(jì)其數(shù),難免會(huì)有書(shū)名雷同,亦或是你的書(shū)大賣(mài),市面上出現(xiàn)了盜版、翻版,這時(shí)候光靠書(shū)名已經(jīng)沒(méi)辦法辨別,你的簽名就能發(fā)揮作用了。今后如果你要出續(xù)集,同樣,為了避免讀者買(mǎi)到的是續(xù)集而不是同名的其他書(shū),也需要在找到書(shū)名之后再次確認(rèn)一下你的簽名,兩者一致才能認(rèn)定這就是續(xù)集。
這一章提到的簽名和現(xiàn)實(shí)中的簽名非常類(lèi)似,只不過(guò)在這里我們稱(chēng)為“數(shù)字簽名”。
在 Android 系統(tǒng)中,所有安裝到系統(tǒng)的App都必有一個(gè)數(shù)字證書(shū),此數(shù)字證書(shū)用于標(biāo)識(shí)應(yīng)用程序的作者和應(yīng)用程序之間的信任關(guān)系。Android 使用 Java 的數(shù)字證書(shū)相關(guān)的機(jī)制來(lái)給 apk 加蓋數(shù)字證書(shū),數(shù)字證書(shū)的私鑰由開(kāi)發(fā)者持有。
Android 使用證書(shū)作為標(biāo)識(shí)應(yīng)用程序作者的一種方式,和 Https 不同,Android 證書(shū)不需要由證書(shū)認(rèn)證中心簽名,開(kāi)發(fā)者直接使用自制簽名證書(shū)。所以我們?cè)诖虬?apk 的時(shí)候,必須對(duì) apk 用自己的證書(shū)做一次簽名打包,用于在市場(chǎng)上唯一標(biāo)識(shí)發(fā)布者的身份。一般 Android 有兩種簽名:
- 調(diào)試模式的簽名: Android sdk 為應(yīng)用自動(dòng)生成一個(gè)簽名證書(shū),調(diào)試模式下簽名的應(yīng)用不能對(duì)外發(fā)布,因?yàn)橛蓸?gòu)建工具創(chuàng)建的證書(shū)是不安全的,應(yīng)用商店不接受調(diào)試證書(shū)簽名的 apk;
- 公布模式下簽名: 需要生成自己的證書(shū),可用于發(fā)布。
2. 為什么要做簽名打包
關(guān)于簽名打包的原因,上面已經(jīng)提到過(guò)一些,主要是用于標(biāo)識(shí)開(kāi)發(fā)者的身份。這里再針對(duì)具體的應(yīng)用場(chǎng)景闡述幾個(gè)引入簽名的優(yōu)勢(shì):
- 應(yīng)用程序升級(jí): 在應(yīng)用程序發(fā)布更新時(shí),如果用戶(hù)已有此 App,并且簽名和待升級(jí)的 apk 簽名一致,那么用戶(hù)可以無(wú)縫的升級(jí)到新版本。如果簽名不一致,那么不會(huì)發(fā)生升級(jí),此時(shí)相當(dāng)于用戶(hù)安裝了兩個(gè)完全獨(dú)立的 App。
- 應(yīng)用程序模塊化: Android 允許相同證書(shū)簽名的應(yīng)用程序運(yùn)行在相同的進(jìn)程中,此時(shí)系統(tǒng)會(huì)將它們作為單個(gè)應(yīng)用程序處理。此時(shí)每個(gè)應(yīng)用程序可以以模塊化部署,在升級(jí)時(shí)可以獨(dú)立地升級(jí)其中的某一個(gè)模塊。
- 代碼、數(shù)據(jù)的授權(quán)共享: Android 提供了以簽名為基礎(chǔ)的權(quán)限機(jī)制,因此一個(gè)應(yīng)用可以暴露功能給另一個(gè)用相同證書(shū)簽名的應(yīng)用使用,這樣就可以在相同簽名的應(yīng)用程序之間共享代碼和數(shù)據(jù)。
3. 如何簽名打包
簽名打包的方式有很多,這里介紹一種最簡(jiǎn)單的方式,直接使用Eclipse就可以為我們的 App 簽名打包。
- 在 Eclipse 中選擇“File” -> “Export”,選擇“Android” -> “Export Android Application”;
- 這時(shí)候提示我們創(chuàng)建一個(gè)密鑰庫(kù) keystore,選擇 Create new keystore,然后指定一個(gè)保存證書(shū)的目錄并設(shè)置證書(shū)密碼;
- 接著填寫(xiě)密鑰庫(kù)信息,填寫(xiě)證書(shū)文件的密碼,使用期限和組織單位的信息,這樣一個(gè)證書(shū)就生成好了。
- 回到第一步,在 Export 的時(shí)候選擇“Use existing keystore”,然后選擇剛剛創(chuàng)建的證書(shū),并輸入密碼,一路 next,搞定!
再看看 Eclipse 的 bin 目錄,就會(huì)出現(xiàn)剛剛我們用自己的證書(shū)簽名的 apk,待我們后面學(xué)習(xí) Android 功能開(kāi)發(fā)之后,你就可以用這種方式簽名打包自己的 apk 進(jìn)行發(fā)布了。
4. 小結(jié)
經(jīng)過(guò)前面兩章的學(xué)習(xí),現(xiàn)在你已經(jīng)可以完成一個(gè) Android 項(xiàng)目的創(chuàng)建、運(yùn)行、簽名打包,剩下的也就是最重要—— Android 項(xiàng)目開(kāi)發(fā)。接下來(lái)我們就正式進(jìn)入 Android 基礎(chǔ)知識(shí),一步步進(jìn)入 Android 的世界。