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. Tween animations are saved in res/anim/ and accessed from the R.anim class. Frame animations are saved in res/drawable/ and accessed from the R.drawable class. 定義的是預置的動畫對象。一般是逐幀動畫 (Frame animations) 或補間動畫( Tween animations )。而實際使用上,都是一些淡入淡出、縮放和移動等的補間動畫居多。 |
res/color |
Define a color resources that changes based on the View state. Saved in res/color/ and accessed from the R.color class 定義一些 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. Saved in res/drawable/ and accessed from the R.drawable class. 定義要被用到的位元影像資源檔。這些位元影像資源可以是 bitmap ,也可以是用 xml 描述的 bitmap 。 注意:檔案尾碼為 9.png 是一種特殊的位元影像,一般是通過 draw9patch 產生的,是一種可自動調整的位元影像資源。 Drawable 的其他目錄形勢, land 是橫屏的, port 是豎屏的; hdpi 是高解析度的, ldpi 是低解析度的, hdpi 是高解析度的。這裡可以放置為特定情況下的介面最佳化資源。 |
res/layout/ |
Define the layout for your application UI. Saved in res/layout/ and accessed from the R.layout class. 定義的 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 來索引很難做到 ) 。