Android 資源、代碼打包 && 簽名過程&&資源查找過程

Android 資源、代碼打包 && 簽名過程
Android APK安裝過程
Android 多渠道打包

打包過程

在這裏插入圖片描述
大致流程

  1. 利用aapt打包res資源文件,生成R.java、resources.arsc和res(二進制 & 非二進制 raw和圖片保持原樣)
  2. 處理.aidl文件,生成對應的Java接口文件
  3. 利用Java SDK 的Compiler編譯R.java 、Java接口文件、Java源文件,生成對應的一個個.class文件
  4. 利用Android SDK的dx.bat將一個個的.class文件和三方庫中的.class文件處理生成classes.dex
  5. 利用apkbuilder將resources.arsc和res文件、assets文件、classes.dex一起打包生成apk
  6. 利用jarsigner或signapk對apk文件進行debug或release簽名
  7. 利用zipalign工具,將簽名後的apk進行對齊處理

android的打包大致可以分爲資源的打包和代碼的打包,以及簽名

資源打包過程

AssetManager用於管理Android應用程序的資源,主要分爲兩大類:

  • assets:該目錄下的文件會保存原始的文件打包到apk中,通過AssetManager來獲取這部分的資源
  • res:這部分文件包括animator、anim、color、drawable、layout、menu、raw、values、xml九種。res下的所有文件都將生成一個資源id,保存在R.java中,應用程序通過資源id來進行訪問。除了raw和drawable其他均爲xml格式,都將編譯成二進制的xml文件,同時生成一個resources.arsc文件作爲資源索引表,關聯R.java中常量對應的資源位置,一起打包進apk。
    PS:AndroidManifest.xml也一樣會編譯成二進制的xml文件打包進apk中

應用資源編譯和打包過程

  1. 解析AndroidManifest.xml;獲得包名,創建ResourceTable對象(該對象會保存所有資源信息)
  2. 添加被引用的資源包;至少包括應用本身的資源包和系統資源包(不同類型的資源,其id會是會有區分度的)
  3. 收集資源文件;aapt會創建一個AaptAssets對象來收集drawable、layout、values三種資源文件
  4. 將AaptAssets收集到的drawable、layout添加到上述的ResourceTable對象中
  5. 編譯values類資源
  6. 爲values的特殊資源分配id;比如android:orientation這個自定義的屬性、style、plurals、array等類型的資源
  7. 編譯xml資源文件;除了values類資源其他所有xml資源文件都將在這步編譯成二進制xml文件
  8. 生成資源符號;如R.string.start_in_process出現次序是3,則其資源符號爲0x7f050002,其中0x7f表示Package ID,05表示string的Type ID,0002則是次序。
  9. 生成資源索引表;所有資源文件都在ResourceTable對象中記錄,根據這個對象生成資源索引表
  10. 編譯AndroidManifest.xml文件;編譯成二進制的xml文件
  11. 生成R.java文件
  12. 打包APK

代碼打包過程

大致流程:

  1. 用Java SDK 將.java文件編譯成一個個的.class文件,Java的步驟(使用javac命令)
  2. 用Android SDK將多個.class文件編譯成一個.dex文件,Android的優化

簽名機制

數據摘要

消息摘要算法(Message Digest Algorithm)是一種能產生特殊輸出格式的算法,其原理是根據一定的運算規則對原始數據進行某種形式的信息提取,被提取出的信息就被稱作原始數據的消息摘要。
特點有:
1)無論輸入的消息有多長,計算出來的消息摘要的長度總是固定的。例如應用MD5算法摘要的消息有128個比特位,用SHA-1算法摘要的消息最終有160比特位的輸出。
2)一般來說(不考慮碰撞的情況下),只要輸入的原始數據不同,對其進行摘要以後產生的消息摘要也必不相同,即使原始數據稍有改變,輸出的消息摘要便完全不同。但是,相同的輸入必會產生相同的輸出。
3)具有不可逆性,即只能進行正向的信息摘要,而無法從摘要中恢復出任何的原始消息。

簽名文件和證書

數字簽名是爲了保障通信的可靠性,解決以下兩個問題
①要確定消息的來源確實是其申明的那個人?
②要保證信息在傳遞的過程中不被第三方篡改,即使被篡改了,也可以發覺出來?
解決方案:
發送方生成一對公私鑰,公鑰交給消息接收方。
發送方發送消息:對要發送的原始消息提取消息摘要。再用私鑰加密該摘要。
接收方收到消息:
a.對附加上的那段數字簽名,使用預先得到的公鑰解密。(確認消息來源)
b.對原始消息部分提取消息摘要,注意這裏使用的消息摘要算法要和發送方使用的一致(確認消息未被篡改)

數字證書主要是用來解決公鑰的安全發放問題。
數字證書內容包含

證書的發佈機構(Issuer)
證書的有效期(Validity)
消息發送方的公鑰
證書所有者(Subject)
數字簽名所使用的算法
數字簽名

數字簽名由有公信力的機構簽名。
發送方提交公鑰到有公信力的機構,接收方向公信力機構獲取公鑰(該過程也是數字簽名的,只不過公信力機構的公鑰設備出廠的時候就已經有了)

jarsign和signapk

jarsign+keystore 是 Java自帶的,可對jar進行簽名。keystore即私鑰
signapk + pk8,x509.pem 是專門對Android程序進行簽名的。
keystore和pk8,x509.pem可以互轉,二者沒有本質差別。

使用微信SDK等第三方SDK時,需要我們上傳MD5或者SHA1,這個就是私鑰keystore的摘要了。

在這裏插入圖片描述

那麼簽名都做了啥呢?
1、對Apk中的每個文件做一次算法(數據摘要+Base64編碼),保存到MANIFEST.MF文件中
2、對MANIFEST.MF整個文件做一次算法(數據摘要+Base64編碼),存放到CERT.SF文件的頭屬性中,在對MANIFEST.MF文件中各個屬性塊做一次算法(數據摘要+Base64編碼),存到到一個屬性塊中。
3、對CERT.SF文件做簽名,內容存檔到CERT.RSA中

最後

最終將資源打包部分經過編譯的res、不做處理的assets、資源索引文件resources.arsc以及代碼打包生成的classes.dex打包進apk中;META-INF則是簽名部分的產物。

Apk打包流程梳理


資源查找過程

Android資源有兩大類res和assets,這兩類資源獲取的時候分別通過Resources類和AssetMnager類來獲取,其中Resources通過資源ID來尋找(其實Resources也是通過資源ID+資源索引表定位到文件位置再通過AssetManager來獲取資源的),AssetManager通過文件名。

在這裏插入圖片描述

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