Android執行文件apk的組成結構

fmms 12年前發布 | 53K 次閱讀 Android Android開發 移動開發

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 文件。整個過程可以如下圖所示:

Android執行文件apk的組成結構

 

 

 

整個過程的第一步,資源打包的工作,就是 aapt 這個工具完成的。

1.  在最后打包的 apk 中,所有的 xml 文件已經不是原來的文本文件了,是被 aapt parser 后,直接保存下來的 xml 數據結構,這樣做的一大好處就是:到手機中無需再次 parser xml 文件,直接讀到定義好的數據結構中就可以了。

2.        drawable 中的 png 圖片也被 aapt 給優化過了。

3.        所有的資源文件都被自動生成一個索引,并生成到 R.java 中。為什么這么做?我想一個是效率,另一個好處就是最大限度的在編譯過程中由編譯器給你找錯 ( 通過 string 來索引很難做到 )

 

其實這里,我們最關心的就是android對資源究竟做了些什么,還是看看 aapt 的代碼吧

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!