1. 程式人生 > >Android 打包過程

Android 打包過程

1.概況

  • Android APK是如何來的呢?
    懷著這個問題去查資料,發現了下邊這張圖。
  • 由android的專案經過編譯和打包,形成了:

    1. .dex 檔案
    2. resources.arsc
    3. uncompiled resources
    4. AndroidManifest.xml

    解壓了一個普通的apk檔案,解壓出來的檔案如下:



    classes.dex 是.dex檔案。
    resources.arsc是resources resources檔案。
    AndroidManifest.xml是AndroidManifest.xml檔案。
    res是uncompiled resources。
    META-INF是簽名資料夾。

  • META-INF其中有三個檔案:



    MANIFEST.MF檔案
    版本號以及每一個檔案的雜湊值(BASE64)。包括資原始檔。這個是對每個檔案的整體進行SHA1(hash)。

Manifest-Version: 1.0
Built-By: Generated-by-ADT
Created-By: Android Gradle 2.2.0
Name: res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png
SHA1-Digest: I9s6aQ5VyOLrNo4odqSij549Oyo=
Name: res/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png
SHA1-Digest: D6dilO+UMcglambujyMOhNbLZuY=
……

CERT.SF
這個是對每個檔案的頭3行進行SHA1 hash。

Signature-Version: 1.0
X-Android-APK-Signed: 2
SHA1-Digest-Manifest: QxOfCCAuQtZnHh0YRNnoxmiHT80=
Created-By: 1.0 (Android)
Name: res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png
SHA1-Digest: I9s6aQ5VyOLrNo4odqSij549Oyo=
Name: res/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png
SHA1-Digest: D6dilO+UMcglambujyMOhNbLZuY=
……

CERT.RSA
這個檔案儲存了簽名和公鑰證書。

2. 具體打包過程

2.1 aapt階段

  • 使用aapt來打包res資原始檔,生成R.java、resources.arsc和res檔案(二進位制 & 非二進位制如res/raw和pic保持原樣)

  • res目錄有9種目錄
    --animator。這類資源以XML檔案儲存在res/animator目錄下,用來描述屬性動畫。
    --anim。這類資源以XML檔案儲存在res/anim目錄下,用來描述補間動畫。
    --color。這類資源以XML檔案儲存在res/color目錄下,用描述物件顏色狀態選擇子。
    --drawable。這類資源以XML或者Bitmap檔案儲存在res/drawable目錄下,用來描述可繪製物件。例如,我們可以在裡面放置一些圖片(.png, .9.png, .jpg, .gif),來作為程式介面檢視的背景圖。注意,儲存在這個目錄中的Bitmap檔案在打包的過程中,可能會被優化的。例如,一個不需要多於256色的真彩色PNG檔案可能會被轉換成一個只有8位調色盤的PNG面板,這樣就可以無損地壓縮圖片,以減少圖片所佔用的記憶體資源。
    --layout。這類資源以XML檔案儲存在res/layout目錄下,用來描述應用程式介面佈局。
    --menu。這類資源以XML檔案儲存在res/menu目錄下,用來描述應用程式選單。
    --raw。這類資源以任意格式的檔案儲存在res/raw目錄下,它們和assets類資源一樣,都是原裝不動地打包在apk檔案中的,不過它們會被賦予資源ID,這樣我們就可以在程式中通過ID來訪問它們。例如,假設在res/raw目錄下有一個名稱為filename的檔案,並且它在編譯的過程,被賦予的資源ID為R.raw.filename,那麼就可以使用以下程式碼來訪問它:

Resources res = getResources();  
InputStream is = res .openRawResource(R.raw.filename);  

--values。這類資源以XML檔案儲存在res/values目錄下,用來描述一些簡單值,例如,陣列、顏色、尺寸、字串和樣式值等,一般來說,這六種不同的值分別儲存在名稱為arrays.xml、colors.xml、dimens.xml、strings.xml和styles.xml檔案中。
--xml。這類資源以XML檔案儲存在res/xml目錄下,一般就是用來描述應用程式的配置資訊。

  • R.java檔案



    這就是R.java的原始碼,裡面擁有很多個靜態內部類,比如layout,string等。
    每當有這種資源新增時,就在R.java檔案中新增一條靜態內部類裡的靜態常量類成員,且所有成員都是int型別。



    裡面的資源可以有兩種方法引用:
    1.在java程式中引用資源按照java的語法來引用即:R.resource_type.resource_

    name注意:resource_name不需要檔案的字尾名
    2.在XML檔案中引用資源格式:@[package:]type/name

  • resources.arsc檔案
    resources.arsc這個檔案記錄了所有的應用程式資源目錄的資訊,包括每一個資源名稱、型別、值、ID以及所配置的維度資訊。我們可以將這個resources.arsc檔案想象成是一個資源索引表,這個資源索引表在給定資源ID和裝置配置資訊的情況下,能夠在應用程式的資源目錄中快速地找到最匹配的資源。

2.2 aidl階段

  • AIDL (Android Interface Definition Language), Android介面定義語言,Android提供的IPC (Inter Process Communication,程序間通訊)的一種獨特實現。
    這個階段處理.aidl檔案,生成對應的Java介面檔案。

2.3 Java Compiler階段

  • 通過Java Compiler編譯R.java、Java介面檔案、Java原始檔,生成.class檔案。

2.4 dex階段

  • 通過dex命令,將.class檔案和第三方庫中的.class檔案處理生成classes.dex。

2.5 apkbuilder階段

  • 將classes.dex、resources.arsc、res資料夾(res/raw資源被原裝不動地打包進APK之外,其它的資源都會被編譯或者處理)、Other Resources(assets資料夾)、AndroidManifest.xml打包成apk檔案。
    注意
    res/raw和assets的相同點:
    1.兩者目錄下的檔案在打包後會原封不動的儲存在apk包中,不會被編譯成二進位制。
    res/raw和assets的不同點:
    1.res/raw中的檔案會被對映到R.java檔案中,訪問的時候直接使用資源ID即R.id.filename;assets資料夾下的檔案不會被對映到R.java中,訪問的時候需要AssetManager類。
    2.res/raw不可以有目錄結構,而assets則可以有目錄結構,也就是assets目錄下可以再建立資料夾

2.6 Jarsigner階段

  • 對apk進行簽名,可以進行Debug和Release 簽名。

2.7 zipalign階段

  • release mode 下使用 aipalign進行align,即對簽名後的apk進行對齊處理。
    Zipalign是一個android平臺上整理APK檔案的工具,它對apk中未壓縮的資料進行4位元組對齊,對齊後就可以使用mmap函式讀取檔案,可以像讀取記憶體一樣對普通檔案進行操作。如果沒有4位元組對齊,就必須顯式的讀取,這樣比較緩慢並且會耗費額外的記憶體。
    在 Android SDK 中包含一個名為 “zipalign” 的工具,它能夠對打包後的 app 進行優化。 其位於 SDK 的 build-tools 目錄下, 例如: D:\Develop\Android\sdk\build-tools\23.0.2\zipalign.exe

相關推薦

Android 打包過程

1.概況Android APK是如何來的呢?懷著這個問題去查資料,發現了下邊這張圖。由android的專案經過編譯和打包,形成了:.dex 檔案resources.arscuncompiled resourcesAndroidManifest.xml解壓了一個普通的apk檔案,解壓出來的檔案如下:classe

Egretwing環境下Android打包過程

第一步,建立環境變數ANDROID_HOME,指向android sdk 第二步,填寫SDK地址,gradle地址(c:\Users\使用者\.gradle\wrapper\dists\gradle-2.x-all\xxx\gradle-2.x\bin),as suppor

Android系統的鏡像文件的打包過程

校驗 資源文件 就會 userdata cp -rf same man only pen 在前面一篇文章中,我們分析了Android模塊的編譯過程。當Android系統的所有模塊都編譯好之後,我們就可以對編譯出來的模塊文件進行打包了。打包結果是獲得一系列的鏡像文件,例如s

轉自老羅 Android應用程式資源的編譯和打包過程分析

原文地址   http://blog.csdn.net/luoshengyang/article/details/8744683 轉載自老羅,轉載請說明   我們知道,在一個APK檔案中,除了有程式碼檔案之外,還有很多資原始檔。這些資原始檔是通過An

dcloud HTML5+的Android離線打包過程填坑記錄

寫在前面 Android離線打包的原因: 1.即時通訊 2.即時通訊所需要的訊息推送與離線推送 軟體所需 hbuilder+android studio hbuilder注意事項 1.工程檔案npm run build打包的dist檔案單獨提出來為一個獨立的檔

ionic 打包簽名android APK 過程

1. 編譯打包安卓APK ionic cordova build android --release --prod 2. 生成簽名 keystore keytool -genkey -v -keystore app.keystore -alias app.keystore -keyalg

(轉)android Apk打包過程概述_android是如何打包apk的

最近看了老羅分析android資源管理和apk打包流程的部落格,參考其他一些資料,做了一下整理,脫離繁瑣的打包細節和資料結構,從整體上概述了apk打包的整個流程。 流程概述: 1、打包資原始檔,生成R.java檔案 2、處理aidl檔案,生成相應java

android apk編譯打包過程

       Android安裝包的字尾都是.apk, apk是Android Package的縮寫。 解壓apk檔案後包含AndroidManifest.xml、assets目錄、classes.dex(還可能有 classes2.dex,classes3.dex...cl

關於ionic混合開發App打包過程詳解-android

哈嘍,大家好,最近OA上線,需要打包apk,學習了一下ionic打包的過程,在網上看的大多都是ionic build android,我的天啊,給我大安卓就這麼一行命令就搞定了嗎?怎麼可能,我是好奇寶寶,下面我就把我學到的分享給大家,針對於ionic打包apk壓縮和優化、加密的一套命令。寶寶準備好了

Android應用程式資源的編譯和打包過程分析

   我們知道,在一個APK檔案中,除了有程式碼檔案之外,還有很多資原始檔。這些資原始檔是通過Android資源打包工具aapt(Android Asset Package Tool)打包到APK檔案裡面的。在打包之前,大部分文字格式的XML資原始檔還會被編譯

android Apk打包過程概述_android是如何打包apk的

最近看了老羅分析android資源管理和apk打包流程的部落格,參考其他一些資料,做了一下整理,脫離繁瑣的打包細節和資料結構,從整體上概述了apk打包的整個流程。流程概述:1、打包資原始檔,生成R.java檔案2、處理aidl檔案,生成相應java 檔案3、編譯工程原始碼,生成相應class 檔案4、轉換所有

android中system.img的打包過程

這裡需要對file_contexts進行一下說明,該檔案是對selinux檔案系統的說明,一般在原來映象檔案的root目錄下可以找到,如果自己修改/增加/刪除了執行檔案,可能需要對檔案進行修改。具體的內容比較複雜,需要selinux的知識,這裡不說了。

Android系統映象檔案的打包過程分析

       在前面一篇文章中,我們分析了Android模組的編譯過程。當Android系統的所有模組都編譯好之後,我們就可以對編譯出來的模組檔案進行打包了。打包結果是獲得一系列的映象檔案,例如system.img、boot.img、ramdisk.img、userdata.

linux 平臺中 android中system.img的打包過程

我們來看一個製作system.img的命令例項: $ ./make_ext4fs -s -T 1421464178 -S file_contexts -l 1073741824 -a system system.img system/ 引數說明: // -s

ionic android 編譯打包過程中遇到的一些問題及解決方案

操作環境 ionic framework 3.9.2、 cordova (Cordova CLI) 8.1.2、ionic (Io

Android安裝過程出現問題

logs man develop 我們 tex manage sdk word 控制臺 Android安裝過程出現問題 一、Eclipse 中 Emulator Control 不能用問題 在官方文檔中發現問題所在(官方文檔說明),在最後一行“The Emulator Co

ANDROID打包錯誤ERROR:EXECUTION FAILED FOR TASK ´:APP:LINTVITALRELEASE´.

follow ring car 疑問 sdk tools error: while 改善 來自:http://dditblog.com/itshare_657.html 今天修改之前的項目之後、準備打包的時候、一起打包不了、一直提示有問題、錯誤是一些什麽Strings.x

Android啟動過程

runtime art -c 創建 runt 啟動分析 service inter 建立 1、背景知識 Init進程是

Android打包版本號設置

androi 如何 and dir uid directory 包名 roi bsp 之前沒有設置過打包的命名,每次打包都是默認的"app realease.apk",之後手動修改名字來顯示出它是一個新版本。 晚上學習了如何配置打包名稱,很簡單,修改build.gradle

react-native android打包

ima lan fault inf ble 當前 div release size 步驟 1.生成密鑰 2.修改android/app/build.gradle 文件 3.修改android/gradle.properties 4.cd android &&am