Android執行文件apk的組成結構
APK 是 Android PacKage 的縮寫,即 Android 安裝包。將 APK 文件直接傳到 Android 模擬器或 Android 手機中執行即可安裝。 APK 文件其實是 zip 格式,但后綴名被修改為 apk ,在 windows 上可以通過 winrar 等程序直接解壓查看。
解壓 apk 后,一般的可看到的目錄結構如下:
文件或目錄 |
作用 |
META-INF/ |
也就是一個 manifest ,從 java jar 文件引入的描述包信息的目錄 |
res/ |
存放資源文件的目錄 |
libs/ |
如果存在的話,存放的是 ndk 編出來的 so 庫 |
AndroidManifest.xml |
程序全局配置文件 |
classes.dex |
最終生成的 dalvik 字節碼 |
resources.ars |
編譯后的二進制資源文件 |
這里資源文件時相對比較重要的, sdk 文檔 ( 中文指南 ) 上有相關的詳細介紹:
目錄 Directory |
資源類型 Resource Types |
res/anim/ |
Define pre-determined animations. 定義的是預置的動畫對象。一般是逐幀動畫 (Frame animations) 或補間動畫( Tween animations )。而實際使用上,都是一些淡入淡出、縮放和移動等的補間動畫居多。 |
res/color |
Define a color resources that changes based on the View state. 定義一些 android view 狀態變化時,使用的顏色值。這通常是綁定到一個界面元素上的,比如一個 button 被按下,彈起或 disable 時的顏色。 |
res/drawable/ res/drawable-hdpi res/drawable-land-hdpi res/drawable/mdpi res/drawable/ldpi res/drawable/port … |
Define various graphics with bitmaps or XML. 定義要被用到的位圖資源文件。這些位圖資源可以是 bitmap ,也可以是用 xml 描述的 bitmap 。 注意:文件后綴為 9.png 是一種特殊的位圖,一般是通過 draw9patch 生成的,是一種可自動伸縮的位圖資源。 Drawable 的其他目錄形勢, land 是橫屏的, port 是豎屏的; hdpi 是高分辨率的, ldpi 是低分辨率的, hdpi 是高分辨率的。這里可以放置為特定情況下的界面優化資源。 |
res/layout/ |
Define the layout for your application UI. 定義的 UI layout ,被 aapt parser 后,可由 android 直接 render 成 view 界面。 這里也有橫豎屏和 dpi 之分。 |
res/values/ |
可以被編譯成很多種類型的資源的 XML 文件。 注意 : 不像其他的 res/ 文件夾,它可以保存任意數量的文件,這些文件保存了要創建資源的描述,而不是資源本身。 XML 元素類型控制這些資源應該放在 R 類的什么地方。 盡管這個文件夾里的文件可以任意命名,不過下面使一些比較典型的文件(文件命名的慣例是將元素類型包含在該名稱之中): array.xml 定義數組 colors.xml 定義 color drawable 和 顏色的字符串值 (color string values) 。使用 Resource.getDrawable() 和 Resources.getColor() 分別獲得這些資源。 dimens.xml 定義 尺寸值 (dimension value) 。使用 Resources.getDimension() 獲得這些資源。 strings.xml 定義 字符串 (string) 值。使用 Resources.getString() 或者 Resources.getText() 獲取這些資源。 getText() 會保留在 UI 字符串上應用的豐富的文本樣式。 styles.xml 定義 樣式 (style) 對象。 多國語言,由 values-xxx 的后綴組成。比如簡體中文 :res/values-zh-rCN |
res/xml/ |
任意的 XML 文件,在運行時可以通過調用 Resources.getXML() 讀取。 |
res/raw/ |
直接復制到設備中的任意文件。它們無需編譯,添加到你的應用程序編譯產生的壓縮文件中。要使用這些資源,可以調用 Resources.openRawResource() ,參數是資源的 ID ,即 R.raw.somefilename 。 |
Android 應用程序的生成過程,輸入就是我們在 eclipse 或源碼中監理的工程及其下面的源文件。輸出就是處理后的 apk 文件。整個過程可以如下圖所示:
整個過程的第一步,資源打包的工作,就是 aapt 這個工具完成的。
1. 在最后打包的 apk 中,所有的 xml 文件已經不是原來的文本文件了,是被 aapt parser 后,直接保存下來的 xml 數據結構,這樣做的一大好處就是:到手機中無需再次 parser xml 文件,直接讀到定義好的數據結構中就可以了。
2. drawable 中的 png 圖片也被 aapt 給優化過了。
3. 所有的資源文件都被自動生成一個索引,并生成到 R.java 中。為什么這么做?我想一個是效率,另一個好處就是最大限度的在編譯過程中由編譯器給你找錯 ( 通過 string 來索引很難做到 ) 。
其實這里,我們最關心的就是android對資源究竟做了些什么,還是看看 aapt 的代碼吧