Android APK的存储结构

来源:互联网 发布:淘宝高达模型店 编辑:程序博客网 时间:2024/06/05 16:07

应用程序最终都是以一个APK方式发布。首先看看apk的编译流程。
apk编译流程
apk本身是一个zip文件,这就像jar包一样,都是一个zip文件,因此我们可以使用unzip解压出来。具体包含一下文件目录。

  1. AndroidManifest.xml:该文件与开发的时候文件基本上相同,不同的是这个是一个二进制的XML文件。查看该文件可以使用AXMLPrint.jar工具包,可以转换成正常的XML文件。
  2. META-INF:该文件与普通的jar包中的META-INF文件类似。
  3. res:该目录包含了开发过程中res目录下除了values以外的所以内容,一般包含各种layout和drawable,layout的内容都是以二进制XML保存,而所有的文件drawable图像都是为经过压缩过的原始图像文件。
  4. class.dex该文件该文件真正类似于java Class文件,它是进过dex脚本优化而生成的dex文件格式,这种格式能过被android系统快速加载和读取,并且占用更少的内存。
  5. resources.arsc 该文件是一种二进制格式的文件,与二进制的XML文件完全不同。aapt在对资源文件进行编译时,会为每个资源分配唯一的id值,程序根据这些id值读取特定的资源,而resources.arsc文件正式包含了所有id值的一个数据集合,在该文件中,如果某个id对应的资源时String或者某个数值,那么该文件会直接包含相应的值,如果id对应的是某个layout或者drawable,那么该文件会会存入对应资源的路径地址。
    APK程序在执行时,并不是直接从apk中读取程序文件,可以这样认为APK是一种具有安装格式的文件,安装后是另一个样子。
    与安装后相关的目录:
    /data/app:当安装完成一个apk时,系统首先会把该文件复制到该目录下,如果是系统程序,一般放在system/app下
    /data/dalvik-cache:系统在安装时APK程序时,会把该APK中包含的class.dex解压放到该目录,为的是当用户启动该程序时,能够快速读出该类文件,改目录文件的命名格式为“apk路径+class.dex”其中路径中的子目录符号使用@代替,比如
system@app@GoogleTTS@GoogleTTS.apk@classes.dex

任何程序都可以读写该目录,就是为了动态加载提供可能。比如安装某个APK,该APK往往所谓的插件程序,本身不能独立执行,而仅仅是为其他程序提供一些实现类,然后在该目录下找到对应的dex文件,再调用系统的Dex ClassLoader,即可实现动态加载。
/data/data:每个应用程序都有自己的数据目录,目录名称为应用的程序包名,所有的数据目录都在该目录下。
并不是说程序安装好后,data/app或者system/app目录下的原始文件删除就可以了,事实上,当程序运行时,所需要的资源文件都要在原始文件读取。加载资源时,首先加载resources.arsc,然后根据id值找到指定的资源。

原创粉丝点击