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
来索引很难做到
)
。
其实这里,我们最关心的就是android对资源究竟做了些什么,还是看看
aapt
的代码吧