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