Android 數位簽章學習筆記

來源:互聯網
上載者:User

在Android系統中,所有安裝到系統的應用程式都必有一個數位憑證,此數位憑證用於標識應用程式的作者和在應用程式之間建立信任關係,如果一個permission的protectionLevel為signature,那麼就只有那些跟該permission所在的程式擁有同一個數位憑證的應用程式才能取得該許可權。Android使用Java的數位憑證相關的機制來給apk加蓋數位憑證,要理解android的數位憑證,需要先瞭解以下數位憑證的概念和java的數位憑證機制。Android系統要求每一個安裝進系統的應用程式都是經過數位憑證簽名的,數位憑證的私密金鑰則儲存在程式開發人員的手中。Android將數位憑證用來標識應用程式的作者和在應用程式之間建立信任關係,不是用來決定終端使用者可以安裝哪些應用程式。這個數位憑證並不需要權威的數位憑證簽名機構認證,它只是用來讓應用程式套件組合自我認證的。

同一個開發人員的多個程式儘可能使用同一個數位憑證,這可以帶來以下好處。

(1)有利於程式升級,當新版程式和舊版程式的數位憑證相同時,Android系統才會認為這兩個程式是同一個程式的不同版本。如果新版程式和舊版程式的數位憑證不相同,則Android系統認為他們是不同的程式,併產生衝突,會要求新程式更改包名。

(2)有利於程式的模組化設計和開發。Android系統允許擁有同一個數位簽章的程式運行在一個進程中,Android程式會將他們視為同一個程式。所以開發人員可以將自己的程式分模組開發,而使用者只需要在需要的時候下載適當的模組。

(3)可以通過許可權(permission)的方式在多個程式間共用資料和代碼。Android提供了基於數位憑證的許可權賦予機制,應用程式可以和其他的程式共用概功能或者資料給那那些與自己擁有相同數位憑證的程式。如果某個許可權(permission)的protectionLevel是signature,則這個許可權就只能授予那些跟該許可權所在的包擁有同一個數位憑證的程式。

在簽名時,需要考慮數字認證的有效期間

(1)數位憑證的有效期間要包含程式的預計生命週期,一旦數位憑證失效,持有改數位憑證的程式將不能正常升級。

(2)如果多個程式使用同一個數位憑證,則該數位憑證的有效期間要包含所有程式的預計生命週期。

(3)Android Market強制要求所有應用程式數位憑證的有效期間要持續到2033年10月22日以後。

Android數位憑證包含以下幾個要點:

              (1)所有的應用程式都必須有數位憑證,Android系統不會安裝一個沒有數位憑證的應用程式

              (2)Android程式包使用的數位憑證可以是自簽名的,不需要一個權威的數位憑證機構簽名認證

              (3)如果要正式發布一個Android ,必須使用一個合適的私密金鑰產生的數位憑證來給程式簽名,而不能使用adt外掛程式或者ant工具產生的調試認證來發布。

              (4)數位憑證都是有有效期間的,Android只是在應用程式安裝的時候才會檢查認證的有效期間。如果程式已經安裝在系統中,即使認證到期也不會影響程式的正常功能。

              (5)Android使用標準的java工具 Keytool and Jarsigner 來產生數位憑證,並給應用程式套件組合簽名。

              (6)使用zipalign最佳化程式。

Android系統不會安裝運行任何一款未經數位簽章的apk程式,無論是在模擬器上還是在實際的物理裝置上。Android的開發工具(ADT外掛程式和Ant)都可以協助開發人員給apk程式簽名,它們都有兩種模式:偵錯模式(debug mode)和發布模式(release mode)。

在偵錯模式下,android的開發工具會在每次編譯時間使用調試用的數位憑證給程式簽名,開發人員無須關心。

當要發布程式時,開發人員就需要使用自己的數位憑證給apk包簽名,可以有兩種方法。

(1)在命令列下使用JDK中的和Keytool(用於產生數位憑證)和Jarsigner(用於使用數位憑證簽名)來給apk包簽名。

(2)使用ADT Export Wizard進行簽名(如果沒有數位憑證可能需要產生數位憑證)。

使用Keytool和Jarsigner給程式簽名

命令:keytool -genkey -v -keystore android.keystore -alias android -keyalg RSA -validity 20000

該命令中,-keystore ophone.keystore 表示產生的認證,可以加上路徑(預設在使用者主目錄下);-alias ophone 表示認證的別名是ophone;-keyalg RSA 表示採用的RSA演算法;-validity 20000表示認證的有效期間是20000天。

此時,我們會在互用主目錄下看到ophone.keystore,即我們剛剛建立的認證。

接著對程式進行簽名:

jarsigner用法: [選項] jar 檔案別名
       jarsigner -verify [選項] jar 檔案

執行:jarsigner -verbose -keystore android.keystore -signedjar android123_signed.apk android123.apk android 就可以產生簽名的apk檔案,這裡輸入檔案android123.apk,最終產生android123_signed.apk為Android簽名後的APK執行檔案。下面提示輸入的密碼和keytool輸入的一樣就行了。(不過在我的JDK目錄下沒有找到jarsigner這個程式,不知道是怎麼回事)

使用ADT Export Wizard進行簽名

應用程式(apk)簽名,在EC中,按右鍵應用程式工程,選擇

選擇認證的存放路徑,填寫相關資料,完成,即可產生被簽名的apk檔案。如所示:

如所示,我們可以看到也可以在這裡選擇”Create new keystore“來建立一個認證。輸入密碼,點擊下一步,填寫相關資訊,如所示。

使用zipalign最佳化APK

根據官方文檔的描述,Android系統中Application的資料都儲存在它的APK檔案中,同時可以被多個進程訪問,安裝的過程包括如下幾個步驟:

  • Installer通過每個apk的manifest檔案擷取與當前應用程式相關聯的permissions資訊
  • Home application讀取當前APK的Name和Icon等資訊。
  • System server將讀取一些與Application運行相關資訊,例如:擷取和處理Application的notifications請求等。
  • 最後,APK所包含的內容不僅限於當前Application所使用,而且可以被其它的Application調用,提高系統資源的可複用性。

zipalign最佳化的最根本目的是協助作業系統更高效率的根據請求索引資源,將resource-handling code統一將Data structure alignment(數 據結構對齊標準:DSA)限定為4-byte boundaries。如果不採取對齊的標 准,處理器無法準確和快速的在記憶體位址中定位相關資源。目前的系統中使用fallback mechanism機制處理那些沒有應用DSA標準的應用程式,這的確大大的方便了普通開發人員無需關注繁瑣的記憶體操作問題。但是相反,對於這樣的應用程式 將給普通使用者帶來一定的麻煩,不但影響程式的啟動並執行效率,而且使系統的整體執行效率下降和佔用大量不必要的記憶體資源,甚至消耗一定的電池資源 (battery life)。

命令列方式手動最佳化

  • 利用tools檔案夾下的zipalign工具。首先調出cmd命令列,然後執行:zipalign -v 4 source.apk androidres.apk。這個方法不受API Level的限制,可以對任何版本的APK執行Align最佳化。
  • 同時可以利用zipalign工具檢查當前APK是否已經執行過Align最佳化。命令:zipalign -c -v 4 androidres.apk

使用ADT自動最佳化:

  • 從 ADT 0.9.3版本開始,可以通過export wizard自動對發布的application packages執行align操作。設定方法:滑鼠右鍵點擊Project,然後選擇”Android Tools” > “Export Signed Application Package…”。

綜上所述,可以使用Keytool、Jarsigner、zipalign 給程式簽名並最佳化程式,這樣就需要三個不同的工具:

keytool -genkey -v -keystore android.keystore -alias android -keyalg RSA -validity 20000

jarsigner -verbose -keystore android.keystore -signedjar android123_signed.apk android123.apk android

zipalign -v 4 android123_signed.apk android123_signed_aligned.apk

當然,也可以通過ADT外掛程式中Export Signed Application Package…來執行,圖形介面更為簡單、形象、直觀。

參考:blog.csdn.net/zgfee/archive/2009/11/11/4796831.aspx

         Android SDK:androidappdocs.appspot.com/guide/publishing/app-signing.html

         android123.com.cn/androidkaifa/173.html

         yarin.javaeye.com/blog/549280

         androidres.com/index.php/2009/10/18/use-zipalign-to-optimize-your-application-packages/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.