目錄
- 一、概述
- 二、打包流程
- 1、打包資源文件,生成R.java文件
- 2、處理aidl文件,生成相應的Java文件
- 3、編譯項目源代碼,生成class文件
- 4、轉換所有的class文件,生成classes.dex文件
- 5、打包生成APK文件
- 6、對APK文件進行簽名
- 7、對簽名后的APK文件進行對齊處理
一、概述
今天主要講一下Android程序的生成步驟,即Android打包成APK的流程。
通常情況下,在開發過程中打包APK是一件很簡單的事,主要可以通過兩種方式:
- 用Eclipse或者Android Studio集成開發環境直接生成APK;
- 使用Ant工具在命令行方式下打包APK。
不過不管哪種方式,打包APK的本質過程都是一樣的。
APK文件:
其實就是一個壓縮包,當你解壓以后會發現它內部主要就是資源文件
和classes.dex
,這個classes.dex就是Android系統Dalvik虛擬機的可執行文件。
APK打包的流程圖:
二、打包流程
1、打包資源文件,生成R.java文件
打包資源的工具是aapt(The Android Asset Packaing Tool),位于android-sdk/platform-tools目錄
下。在這個過程中,項目中的AndroidManifest.xml文件
和布局文件XML
都會編譯,然后生成相應的R.java
。
2、處理aidl文件,生成相應的Java文件
這一過程中使用到的工具是aidl
(Android Interface Definition Language),即Android接口描述語言
。位于android-sdk/platform-tools目錄
下。aidl工具解析接口定義文件然后生成相應的Java代碼接口供程序調用。
如果在項目沒有使用到aidl文件,則可以跳過這一步。
3、編譯項目源代碼,生成class文件
項目中所有的Java代碼,包括R.java
和.aidl文件
,都會變Java編譯器(javac)編譯成.class文件
,生成的class文件位于工程中的bin/classes目錄
下。
4、轉換所有的class文件,生成classes.dex文件
dx工具
生成可供Android系統Dalvik虛擬機執行的classes.dex文件
,該工具位于android-sdk/platform-tools 目錄
下。
任何第三方的libraries
和.class文件
都會被轉換成.dex文件
。
dx工具
的主要工作是將Java字節碼轉成成Dalvik字節碼
、壓縮常量池
、消除冗余信息
等。
5、打包生成APK文件
所有沒有編譯的資源(如images等)
、編譯過的資源和.dex文件
都會被apkbuilder工具
打包到最終的.apk文件
中。
打包的工具apkbuilder
位于 android-sdk/tools目錄
下。apkbuilder為一個腳本文件,實際調用的是android-sdk/tools/lib/sdklib.jar文件
中的com.android.sdklib.build.ApkbuilderMain類
。
6、對APK文件進行簽名
一旦APK文件生成,它必須被簽名才能被安裝在設備上。
在開發過程中,主要用到的就是兩種簽名的keystore。一種是用于調試的debug.keystore
,它主要用于調試,在Eclipse或者Android Studio中直接run以后跑在手機上的就是使用的debug.keystore。另一種就是用于發布正式版本的keystore
。
7、對簽名后的APK文件進行對齊處理
如果你發布的apk是正式版的話,就必須對APK進行對齊處理,用到的工具是zipalign,它位于android-sdk/tools目錄
下。
對齊的主要過程是將APK包中所有的資源文件距離文件起始偏移為4字節整數倍,這樣通過內存映射訪問apk文件時的速度會更快。
對齊的作用就是減少運行時內存的使用。