APK是Android PacKage的縮寫(xiě),即Android安裝包。將APK文件直接傳到Android模擬器或Android手機(jī)中執(zhí)行即可安裝。APK文件其實(shí)是zip格式,但后綴名被修改為apk,在windows上可以通過(guò)winrar等程序直接解壓查看。
解壓apk后,一般的可看到的目錄結(jié)構(gòu)如下:
文件或目錄
作用
META-INF/
也就是一個(gè)manifest,從java jar文件引入的描述包信息的目錄
res/
存放資源文件的目錄
libs/
如果存在的話,存放的是ndk編出來(lái)的so庫(kù)
AndroidManifest.xml
程序全局配置文件
classes.dex
最終生成的dalvik字節(jié)碼
resources.ars
編譯后的二進(jìn)制資源文件
這里資源文件時(shí)相對(duì)比較重要的,sdk 文檔(中文指南)上有相關(guān)的詳細(xì)介紹:
目錄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.
定義的是預(yù)置的動(dòng)畫(huà)對(duì)象。一般是逐幀動(dòng)畫(huà)(Frame animations)或補(bǔ)間動(dòng)畫(huà)(Tween animations)。而實(shí)際使用上,都是一些淡入淡出、縮放和移動(dòng)等的補(bǔ)間動(dòng)畫(huà)居多。
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狀態(tài)變化時(shí),使用的顏色值。這通常是綁定到一個(gè)界面元素上的,比如一個(gè)button被按下,彈起或disable時(shí)的顏色。
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是一種特殊的位圖,一般是通過(guò)draw9patch生成的,是一種可自動(dòng)伸縮的位圖資源。
Drawable的其他目錄形勢(shì),land是橫屏的,port是豎屏的;hdpi是高分辨率的,ldpi是低分辨率的,hdpi是高分辨率的。這里可以放置為特定情況下的界面優(yōu)化資源。
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/文件夾,它可以保存任意數(shù)量的文件,這些文件保存了要?jiǎng)?chuàng)建資源的描述,而不是資源本身。XML元素類型控制這些資源應(yīng)該放在R類的什么地方。
盡管這個(gè)文件夾里的文件可以任意命名,不過(guò)下面使一些比較典型的文件(文件命名的慣例是將元素類型包含在該名稱之中):
array.xml 定義數(shù)組
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()會(huì)保留在UI字符串上應(yīng)用的豐富的文本樣式。
styles.xml 定義
樣式(style)對(duì)象。
多國(guó)語(yǔ)言,由values-xxx的后綴組成。比如簡(jiǎn)體中文:res/values-zh-rCN
res/xml/
任意的XML文件,在運(yùn)行時(shí)可以通過(guò)調(diào)用
Resources.getXML()讀取。
res/raw/
直接復(fù)制到設(shè)備中的任意文件。它們無(wú)需編譯,添加到你的應(yīng)用程序編譯產(chǎn)生的壓縮文件中。要使用這些資源,可以調(diào)用
Resources.openRawResource(),參數(shù)是資源的ID,即R.raw.somefilename。
Android應(yīng)用程序的生成過(guò)程,輸入就是我們?cè)趀clipse或源碼中監(jiān)理的工程及其下面的源文件。輸出就是處理后的apk文件。整個(gè)過(guò)程可以如下圖所示:
整個(gè)過(guò)程的第一步,資源打包的工作,就是aapt這個(gè)工具完成的。
1. 在最后打包的apk中,所有的xml文件已經(jīng)不是原來(lái)的文本文件了,是被aapt parser后,直接保存下來(lái)的xml數(shù)據(jù)結(jié)構(gòu),這樣做的一大好處就是:到手機(jī)中無(wú)需再次parser xml文件,直接讀到定義好的數(shù)據(jù)結(jié)構(gòu)中就可以了。
2. drawable中的png圖片也被aapt給優(yōu)化過(guò)了。
3. 所有的資源文件都被自動(dòng)生成一個(gè)索引,并生成到R.java中。為什么這么做?我想一個(gè)是效率,另一個(gè)好處就是最大限度的在編譯過(guò)程中由編譯器給你找錯(cuò)(通過(guò)string來(lái)索引很難做到)。
其實(shí)這里,我們最關(guān)心的就是android對(duì)資源究竟做了些什么,還是看看aapt的代碼吧