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. 定义的是预置的动画对象。一般是逐帧动画 (Frame animations) 或补间动画( Tween animations )。而实际使用上,都是一些淡入淡出、缩放和移动等的补间动画居多。 |
res/color | Define a color resources that changes based on the View state. 定义一些 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. 定义要被用到的位图资源文件。这些位图资源可以是 bitmap ,也可以是用 xml 描述的 bitmap 。 注意:文件后缀为 9.png 是一种特殊的位图,一般是通过 draw9patch 生成的,是一种可自动伸缩的位图资源。 Drawable 的其他目录形势, land 是横屏的, port 是竖屏的; hdpi 是高分辨率的, ldpi 是低分辨率的, hdpi 是高分辨率的。这里可以放置为特定情况下的界面优化资源。 |
res/layout/ | Define the layout for your application UI. 定义的 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 的代码吧
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. 定义的是预置的动画对象。一般是逐帧动画 (Frame animations) 或补间动画( Tween animations )。而实际使用上,都是一些淡入淡出、缩放和移动等的补间动画居多。 |
res/color | Define a color resources that changes based on the View state. 定义一些 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. 定义要被用到的位图资源文件。这些位图资源可以是 bitmap ,也可以是用 xml 描述的 bitmap 。 注意:文件后缀为 9.png 是一种特殊的位图,一般是通过 draw9patch 生成的,是一种可自动伸缩的位图资源。 Drawable 的其他目录形势, land 是横屏的, port 是竖屏的; hdpi 是高分辨率的, ldpi 是低分辨率的, hdpi 是高分辨率的。这里可以放置为特定情况下的界面优化资源。 |
res/layout/ | Define the layout for your application UI. 定义的 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 的代码吧