1. 程式人生 > >新 Android程式簽名詳解、打包、釋出到Google play步驟

新 Android程式簽名詳解、打包、釋出到Google play步驟

下文在載轉載文章的基礎,Buaaroid進行了修改和完善,故發為原創,特此說明。

- - -- - - - -- - - - - -- - -- - - - - -- - - - -- - - - - 

本文主要講解Android應用程式簽名相關的理論知識,包括:什麼是簽名、為什麼要給應用程式簽名、如何給應用程式簽名等。

1、什麼是簽名?
      如果這個問題不是放在Android開發中來問,如果是放在一個普通的版塊,我想大家都知道簽名的含義。可往往就是將一些生活中常用的術語放在計算機這種專業領域,大家就開始迷惑了。計算機所做的事情,或者說程式語言所做的事情,不正是在儘可能地模擬現實嗎?所以,計算機中所說的簽名和生活中所說的簽名在本質上是一樣的,它所起到的作用也是一致的!


      讓我們來看看,在現實生活中的簽名。比如下面這張圖片:

這是女星孫儷的簽名。簽名就意味著在紙上或別處寫下自己的名字,或者說在某處打上一個標記作為你自己的一種特有的標識,當別人看到這個簽名的時候,他會知道這是和你有關的,而不是其它人。

2、為什麼要給Android應用程式簽名?
      如果只能用一句簡單的話語來回答這個問題的話,我會說:“這是Android系統所要求的”。
      Android系統要求每一個Android應用程式必須要經過數字簽名才能夠安裝到系統中,也就是說如果一個Android應用程式沒有經過數字簽名,是沒有辦法安裝到系統中的!Android通過數字簽名來標識應用程式的作者和在應用程式之間建立信任關係,不是用來決定終端使用者可以安裝哪些應用程式。這個數字簽名由應用程式的作者完成,並不需要權威的數字證書籤名機構認證,它只是用來讓應用程式包自我認證的。

3、為什麼我開發的Android應用程式沒有做什麼簽名也能在模擬器和手機上執行?
      你沒有給Android應用程式簽名並不代表Android應用程式沒有被簽名。為了方便我們開發除錯程式,ADT會自動的使用debug金鑰為應用程式簽名。debug金鑰?它在哪?debug金鑰是一個名為debug.keystore的檔案,它的位置:
            系統碟符:/Documents and Settings/liufeng/.Android/debug.keystore
liufeng”對應於你自己的windows作業系統使用者名稱,怎麼樣,是不是已經找到它了。這也就意味著,如果我們想擁有自己的簽名,而不是讓ADT幫我們簽名的話,我們也要有一個屬於自己的金鑰檔案(*.keystore)。


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檔案遇到了問題,參考文章:

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

先介紹cmd下的兩個命令:

跳轉到目錄C:\Program Files\Java\jdk1.8.0_45\bin:

 >  cd C:\Program Files\Java\jdk1.8.0_45\bin

檢視目錄下內容 

> dir

使用keytool工具生成數字證書

      > keytool -genkey -v -keystore liufeng.keystore -alias liufeng.keystore -keyalg RSA -validity 20000
說明:
      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 的數字證書。

4)使用jarsigner工具為Android應用程式簽名
      > jarsigner -verbose -keystore liufeng.keystore-signedjar notepad_signed.apk notepad.apk liufeng.keystore
說明:
      1)jarsigner是工具名稱,-verbose表示將簽名過程中的詳細資訊打印出來,顯示在dos視窗中;
      2)-keystore liufeng.keystore 表示簽名所使用的數字證書所在位置,這裡沒有寫路徑,表示在當前目錄下;
      3)-signedjar notepad_signed.apk notepad.apk 表示給notepad.apk(未簽名的apk拷貝到C:\Program Files\Java\jdk1.8.0_45\bin工具目錄下)檔案簽名,簽名後的檔名稱為notepad_signed.apk;

      4)最後面的liufeng.keystore 表示證書的別名,對應於生成數字證書時-alias引數後面的名稱

該步驟,apk簽名操作後,產生了如下警告:


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

  未簽名的apk不能使用,也不能優化。簽名之後的apk谷歌推薦使用zipalign.exe(位於android-sdk-windows\tools目錄下)工具對其優化:

       > zipalign -v notepad_signed.apk notepad_signed_aligned.apk


說明:

      1)zipalign是工具名稱,-v 表示在DOS視窗打印出詳細的優化資訊;

      2)4<align>欄位: alignment in bytes, e.g. '4' provides 32-bit alignment

如上,zipalign能夠使apk檔案中未壓縮的資料在4個位元組邊界上對齊(4個位元組是一個性能很好的值),這樣android系統就可以使用mmap()(請自行查閱這個函式的用途)函式讀取檔案,可以在讀取資源上獲得較高的效能,
  PS:1.在4個位元組邊界上對齊的意思就是,一般來說,是指編譯器吧4個位元組作為一個單位來進行讀取的結果,這樣的話,CPU能夠對變數進行高效、快速的訪問(較之前不對齊)。
          2.對齊的根源:android系統中的Davlik虛擬機器使用自己專有的格式DEX,DEX的結構是緊湊的,為了讓執行時的效能更好,可以進一步用"對齊"進一步優化,但是大小一般會有所增加。

      3)notepad_signed.apk notepad_signed_aligned.apk 表示對已簽名檔案notepad_signed.apk進行優化,優化後的檔名為notepad_signed_aligned.apk

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

 》》》》》》》》》》》》》》》》》》》》》 》》》》》》》》》》》》》》》》》》》

Eclipse-ADT圖形工具生成簽名的apk

(1).Eclipse - 右鍵目標工程 - Android Tools - Export Signed Application Package...


(2).預設為右鍵選中的工程,所以直接點選 Next


(3).選擇你自己的keystone(如我自己的apkroid.keystore),並輸入你自己定義的keystore keyword,然後Next


(4).你的Keystore的別名,選擇:Key alias selection(我自己將apkroid.keystore的別名定義為zshu.keystore,兩者的密碼一樣


(5).最後是生成apk的資訊預覽,和apk的目標位置選擇,Finish即可。


《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《

 》》》》》》》》》》》》》》》》》關於應用程式在Google Market 現在稱為 Google Play上釋出的步驟《《《《《《《《《《《《《《《《《《《《

    寫了一段時間的android應用了,只是在自己手機上面安裝。

上週申請了android developer,需要一次性25美元的程式開發註冊費用。費用需要用google checkout,所以還要先申請google checkout。國內的信用卡一般都支援VISA,可以以香港地址作為付款地址註冊成功。註冊成功後,還可以向google購買一部用於開發的手機。

這樣就可以進入android market釋出主頁了。這是我釋出第一個應用後的截圖:

image

簽名前需要了解的

首先需要知道,android market釋出應用程式,沒有人為的稽核過程,如果符合要求,只要提交,將立刻生效。

應用程式需要經過簽名(sign)才可以釋出,簽名的主要作用是,讓別人知道這個程式是你通過哪個android開發者帳號釋出的。

簽名將生成一個二進位制的私鑰檔案(private key)。其實如果使用windows+eclipse adt開發,在使用者目錄下:

.android\debug.keystore

路徑下的檔案,就已經是一個私鑰了,只不過這是debug用的私鑰。即,android不能安裝沒有簽名的APK,如果通過debug方式(開發者通過usb連線)安裝APK,實際上生成的APK是使用debug簽名的。使用debug私鑰簽名的APK檔案無法釋出到android market。

公鑰和私鑰,是非對稱金鑰體系中的概念。在這裡的基本原理是使用者可通過自己的私鑰加密資料(應用程式中的指紋部分),資料可以通過公鑰解碼看到,主要目的是確保資訊來源不被篡改。

生成私鑰檔案的步驟

簽名很簡單,使用的工具在JDK的bin目錄下,keytool.exe。命令如下:

keytool.exe -genkey -v -keystore 私鑰的檔名 -alias 自己起個別名 -keyalg RSA -validity 10000

這裡面除了漢字部分,都可以不動。執行該命令,會有互動的提示,類似下面:

image

這樣就會生成一個私鑰檔案,該檔案要妥善保管,防止被別人冒用。

其實生成私鑰也可以使用eclipse adt外掛,介面和下面簽名應用程式的介面是同一個。

使用私鑰檔案簽名應用程式

使用eclipse adt可以很方便的生成帶簽名的應用程式。

image

然後:

image

這裡要選擇剛才生成的私鑰檔案,並輸入正確的生成私鑰的密碼。

然後:

image

輸入別名的密碼。

再下一步,就簡單了,選擇生成檔案的路徑即可。

image

釋出應用程式

主要是上傳應用程式檔案,相關檔案,比如螢幕截圖,還有就是程式的文字描述等。

image

這部分上傳檔案就不說了,主要是螢幕截圖,遇到點兒小麻煩,這裡只支援兩種尺寸的圖片,我的nexus one 480×800居然沒有,只好用480×854的格式,需要用軟體為截圖修改一下尺寸(多了一點兒空白)。否則上傳後會提示錯誤。

image

這部分,可能需要增加比如中文預研的介紹,但是沒有簡體中文,用的是繁體中文語言。

image

最後,勾選同意google的要求。釋出即可。

馬上就可以在android market上看到自己釋出的應用。

image