Android应用是用高级编程语言“Java”编写的,它利用Android SDK编译代码,并且把所有资源文件和数据统一打包成APK(Application Package)文件,其实APK没大家想象中的那么神奇,它只是一个压缩包,和我们日常见的ZIP,RAR的压缩文件没什么不同,我们可以用压缩软件打开一个APK。下面我们用360压缩打开APK,看看APK中有何玄机~
    
   
    在上图中,我们可以看到,我们用360压缩打开的APK拥有“assets,lib,META-INF,res”目录和“AndroidManifest.xml,classes.dex,resources.arsc”文件。下文,我们来讲解下这些文件(文件夹)是干什么的。
    
   
| 
         Assets | 
         存放需要打包到 | 
| 
         Lib | 
         程序依赖的 | 
| 
         META-INF | 存放应用程序签名和证书的目录 | 
| 
         Res | 存放应用程序的资源 | 
| AndroidManifest.xml | 应用程序的配置文件 | 
| Classes.dex | 
         Dex | 
| Resources.arsc | 资源配置文件 | 
    1)assets
    
     目录:
    
    
     存放需要打包到
    
    APK
    
     的静态文件,该目录与
    
    
     res
    
    
     目录不同之处在于
    
    
     ,assets
    
    
     目录支持任意深度的子目录,我们的开发者可以根据自己的需求来任意部署文件夹的架构,而且
    
    
     res
    
    
     目录下的文件会在
    
    
     .R
    
    
     文件中生成与其对应的资源
    
    
     ID
    
    
     ,,
    
    
     assets
    
    
     不会自动生成对应的
    
    
     id
    
    
     ,访问的时候需要
    
    
     AssetManager
    
    
     类,
    
   
    2)Lib
    
     目录:该目录用来存放应用程序所依赖的
    
    
     native
    
    
     库文件,
    
    
     native
    
    
     库一般是用
    
    
     C/C++
    
    
     进行编写的,这里的
    
    
     lib
    
    
     库可能包含
    
    
     4
    
    
     种不同类型,根据
    
    
     CPU
    
    
     型号的不同,我们大体可以分为
    
    
     ARM
    
    
     ,
    
    
     ARM-v7a
    
    
     ,
    
    
     MIPS
    
    
     ,
    
    
     X86
    
    
     ,分别对应着
    
    
     ARM
    
    
     架构,
    
    
     ARM-V7
    
    
     架构,
    
    
     MIPS
    
    
     架构和
    
    
     X86
    
    
     架构,这些
    
    
     so
    
    
     库在
    
    
     apk
    
    
     包中构成如下图:
    
   
    
   
    
     其中,不同的
    
    CPU
    
     架构对应着不同的目录,每个目录中可以存放非常多的对应版本的
    
    
     so
    
    
     库,而且这个目录的结构固定,用户只能按照这个目录来存放自己的
    
    
     so
    
    
     库。目前市场上使用的移动终端大多是基于
    
    
     ARM
    
    
     或者
    
    
     ARM-v7a
    
    
     架构的。从厂家上来分是有三种,
    
    
     arm
    
    
     ,
    
    
     x86
    
    
     ,
    
    
     MIPS
    
    
     ,
    
    
     arm
    
    
     系列是绝大多数手机上使用的,
    
    
     x86
    
    
     主要是运用在平板上,而
    
    
     MIPS
    
    
     ,我基本上就没见过。
    
   
    1)Res
    
     目录:
    
    
     res
    
    
     是
    
    
     resource
    
    
     的缩写,这个目录存放的东西是资源文件,存放这个文件夹下的所有文件都会和上文所说的,映射到
    
    
     Android
    
    
     工程中的
    
    
     .R
    
    
     文件中,生成对应的资源
    
    
     ID
    
    
     ,访问的时候直接使用资源
    
    
     ID
    
    
     ,即
    
    
     R.ID.FILENAME
    
    
     ,
    
    
     res
    
    
     文件夹下可以包含多个文件夹;
    
    
     anim
    
    
     是存放动画文件的;
    
    
     drawable
    
    
     目录存放图形资源;
    
    
     layout
    
    
     目录存放布局文件;
    
    
     values
    
    
     目录存放一些特征值;
    
    
     colors.xml
    
    
     存放
    
    
     color
    
    
     的颜色值等等
    
   
    2)META-INF
    
     目录:保存应用程序的签名信息,签名信息可以验证
    
    
     APK
    
    
     文件的完整性。当
    
    
     AndroidSDK
    
    
     在打包
    
    
     APK
    
    
     文件时会计算
    
    
     APK
    
    
     包中的所有文件信息的完整性,并且把这些完整性保存到
    
    
     META-INF
    
    
     文件夹下,应用程序在安装的时候首先会更具
    
    
     META-INF
    
    
     文件夹教研
    
    
     APK
    
    
     的完整性。通过这种手段,我们就可以在一定程度上保证
    
    
     APK
    
    
     中的每一个文件不被篡改。以此来确保我们的
    
    
     APK
    
    
     应用程序不被恶意修改或者被病毒文件感染,这有利于确保
    
    
     Android
    
    
     应用的完整性和系统的安全性。
    
    
     META-INF
    
    
     目录中包含的文件有
    
    
     CERT.RSA
    
    
     ,
    
    
     CERT.DSA
    
    
     ,
    
    
     CERT.SF
    
    
     和
    
    
     MANIFEST.MF
    
    
     。其中
    
    
     CERT.RSA
    
    
     是开发者利用私钥对
    
    
     APK
    
    
     进行签名的签名文件,
    
    
     CERT.SF
    
    
     和
    
    
     MANIFEST.MF
    
    
     记录了文件中文件的
    
    
     SHA-1
    
    
     哈希值。
    
   
    3)AndroidManifest.xml
    
     :这是
    
    
     Android
    
    
     应用程序的配置文件,是一个用来描述
    
    
     Android
    
    
     应用“整体咨询”的设定文件,简单的说,这相对于
    
    
     Android
    
    
     应用向
    
    
     Android
    
    
     系统的“自我介绍”配置文件,
    
    
     Android
    
    
     系统可以根据
    
    
     Androidmanifest.xml
    
    
     文件来完整的了解这个
    
    
     APK
    
    
     应用程序的咨询。不难想到,每个
    
    
     Android
    
    
     应用程序都必须包含一个
    
    
     Androidmanifest.xml
    
    
     文件
    
    
     ,
    
    
     并且它的名字是固定的,是禁止修改的。
    
   
    4)classes.dex
    
     :传统的
    
    
     Java
    
    
     程序,首先先把文件编译成
    
    
     class
    
    
     文件,字节码都保存在了
    
    
     class
    
    
     文件中,
    
    
     Java
    
    
     虚拟机可以通过解释且执行这些
    
    
     class
    
    
     文件。然而
    
    
     Dalvik
    
    
     虚拟机是在
    
    
     Java
    
    
     虚拟机进行了优化,执行的是
    
    
     Dalvik
    
    
     字节码,而这些
    
    
     Dalvik
    
    
     字节码就是由
    
    
     Java
    
    
     字节码转换而来的。一般来说,
    
    
     Android
    
    
     应用在打包的时候通过
    
    
     AndroidSDK
    
    
     中的
    
    
     dx
    
    
     工具将
    
    
     Java
    
    
     字节码转换为
    
    
     Dalvik
    
    
     字节码。
    
    
     Dx
    
    
     工具可以对多个
    
    
     class
    
    
     文件进行合并,重组和优化,通过这些操作,可以达到减小体积,缩短运行时间的目的。
    
   
    5)Resources.arsc
    
     :用来记录资源文件和资源
    
    
     ID
    
    
     之间的映射关系,用来根据资源
    
    
     ID
    
    
     寻找资源。
    
    
     Android
    
    
     的开发是分模块的,
    
    
     res
    
    
     目录专门用来存放资源文件,当在代码中需要调用资源文件时,只需要调用方法“
    
    
     findviewbyid()
    
    
     ”就可以得到资源文件,每当在
    
    
     res
    
    
     文件夹下放一个文件,
    
    
     aapt
    
    
     就会自动生成对应的
    
    
     ID
    
    
     保存在
    
    
     .R
    
    
     文件,我们调用这个
    
    
     ID
    
    
     就可以,但是只有这个
    
    
     ID
    
    
     还不够,
    
    
     .R
    
    
     文件只是保证编译程序不报错,实际上在程序运行时,系统要根据
    
    
     ID
    
    
     去寻找对应的资源路径,而
    
    
     resources.arsc
    
    
     文件就是用来记录这些
    
    
     ID
    
    
     和资源文件位置对应关系的文件。
    
   
 
