分享

Android执行文件apk的组成结构

 My镜像站 2012-01-17

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 的代码吧

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多