Android apk 簽名總結

簽名介紹

什麼是簽名?

在現實生活中,簽名就相當與合同上的簽字和蓋章。只有簽名之後,才具有一定的效力。如果沒有簽名,“合同”就沒有對象,也就沒有法律效力了。


爲什麼要簽名?

Android系統要求每一個應用程序必須經過數字簽名才能安裝到系統中,也就是說沒有經過簽名的app,是沒有辦法安裝到你的android機器上的。 
Android通過數字簽名來標誌應用程序和開發者之間的聯繫,它是對應用程序自我認證的一個方式。 
說白了,就是爲了標誌一個APP的所屬,區分APP。


簽名的好處:

  • 程序升級帶來方便。 
    只有相同簽名和相同包名的程序才能覆蓋安裝。
  • 應用程序模塊化。 
    android系統允許擁有同一個數字簽名的程序運行在一個進程中,android程序會將他們視爲同一個程序,所以可以將程序分模塊開發,用戶只需在需要的時候下載相應的模塊即可。
  • 數據共享 
    android提供了基於數字證書的權限賦予機制,應用程序可以喝其他程序共享一些數據給擁有相同簽名的程序。

(最後兩點好處,筆者暫時沒有接觸到。)


如何簽名打包

對APK進行簽名,有兩種方式,分別是 1. 通過ADT提供的圖形化界面簽名打包2. 通過DOS命令來簽名打包

首先需要說明的一下就是:我們一般調試程序,使用的都是debug簽名(debug.keystore)

圖片名稱

一般我們開發應用程序的時候,都是多人協作的,每個人的機器的debug的簽名都是不一樣的,所以經常會遇到你寫的程序提交之後,同事更新了之後就不能正常的運行。比如百度地圖的相關代碼邏輯,是與簽名有很大聯繫的。使用debug簽名會導致,某些代碼只能在你自己的機器上運行,這樣就太LOW了。

所以一般都是共用一release簽名 
最終發佈apk版本的時候,用的就是release版的簽名,也就是正式版的簽名。


下面,筆者對這兩種方式都自己講解一下:

通過圖形化界面簽名打包

項目右鍵,你會看到:Android Tools

圖片名稱

Export Signed Application Package 
表示導出帶有簽名的apk文件。 
Export Unsigned Application Package 
表示導出不帶有簽名的apk文件

我們選擇第一項,然後next,

圖片名稱

此時你可以選擇使用已經存在的keystore,也可以自己創建一個keystore。 
我們選擇創建一個:

圖片名稱

next之後,

圖片名稱

在此界面需要填寫一些簽名的信息,比如:別名,簽名密碼,使用期限,組織信息等。

再次下一步,就是生成帶有簽名的apk文件了。

圖片名稱

經過上面的一系列的步驟,就打包出來一個帶有簽名的apk文件。

下次再發布版本的時候,就可以使用已經生成的簽名打包了。

圖片名稱

next之後,如果你的簽名文件密碼是正確,會自動把你設置的別名列出來:

圖片名稱

然後輸入你的簽名的密碼,下一步,下一步就行了。


通過命令的方式簽名打包

在使用命令的方式生成簽名打包之前,我們先看一下debug.kestore都包括哪些信息。 
使用如下命令,可以查看簽名的信息:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">keytool <span class="hljs-attribute" style="box-sizing: border-box;">-list</span> <span class="hljs-attribute" style="box-sizing: border-box;">-v</span> <span class="hljs-attribute" style="box-sizing: border-box;">-keystore</span> debug<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>keystore</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

圖片名稱

debug簽名的口令是: android

可以看到debug.keystore中包含的信息,與我們用圖形化界面創建簽名填寫的信息基本對應。

我們對工程進行簽名打包需要用到兩個工具:keytooljarsigner

  • keytool:用於生成數字簽名。 
    keytool不僅可以用來查看簽名信息,也可以用來生成一個簽名,該工具位於jdk的bin目錄下。

圖片名稱

生成簽名的命令如下:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">keytool <span class="hljs-attribute" style="box-sizing: border-box;">-genkey</span> <span class="hljs-attribute" style="box-sizing: border-box;">-v</span> <span class="hljs-attribute" style="box-sizing: border-box;">-keystore</span> xxx<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>keystore <span class="hljs-attribute" style="box-sizing: border-box;">-alias</span> xxx <span class="hljs-attribute" style="box-sizing: border-box;">-keyalg</span> RSA <span class="hljs-attribute" style="box-sizing: border-box;">-validity</span> xxx</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
  1. -getkey 表示生成數字簽名 -v表示將簽名的信息顯示在dos窗口中
  2. -keystore xxx 表示要生成簽名的名稱
  3. -alias xxx 表示簽名的別名
  4. -keyalg RSA 表示生成密鑰採用的是RSA算法
  5. -validity xxx 表示簽名的有效期

執行這條命令之後,會提示你輸入一些信息:

圖片名稱

  • jarsigner: 使用簽名給apk文件簽名。該用具也位於jdk的bin目錄中。 
    使用命令編譯出一個apk文件,很繁瑣,得不償失。我們使用圖形化界面來打包出一個不帶簽名的apk。

圖片名稱

使用如下命令對此apk進行簽名

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">jarsigner -verbose -keystore xxx<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.keystore</span> -signedjar xxx<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.apk</span> xxx<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.apk</span> xxx</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
  1. -verbose 表示將簽名過程中的信息輸出到dos上顯示。
  2. -keystore xxx 表示所使用簽名的地址
  3. -signedjar xxx1 xxx2 表示將xxx2簽名成xxx1,xxx1是經過簽名的apk文件名稱(注意順序)
  4. 最後一個xxx表示簽名的別名。(沒有命令貌似不能執行)

這裏寫圖片描述

執行此命令之後,稍微等待一會,就會提示你打包成功。

筆者在研究簽名打包的過程中,在網上看到還有一個步驟,就是使用zipalign命令對apk進行優化。

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">zipalign -v <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> xxx<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.apk</span> xxx_aligned<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.apk</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

命令的意思就是把xxx.apk優化成爲xxx_aligned.apk。針對項目比較龐大的時候,使用此命令有較大的明顯,比較小的項目優化效果不是很明顯。

此命令解釋如下(網絡):

<code class="hljs scss has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">zipalign能夠是apk文件未壓縮的數據在4個字節邊界上對齊,這樣android系統就可以使用<span class="hljs-function" style="box-sizing: border-box;">mmap()</span>函數讀取文件,可以在讀取資源文件上獲取較高的性能。</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

總結

  • 簽名不同的相同包結構的apk不能覆蓋安裝,在手機上安裝的時候,會提示你簽名衝突。在eclipse等開發工具上運行的時候,會做如下提示:

圖片名稱 
- 未經過簽名的apk不能安裝到手機上。在經過Export Unsigned Application Package步驟之後,eclipse就會給你提示:在發佈程序之前,需要對程序簽名處理

圖片名稱

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章