apk

什么是APK

APK是安卓手机app的文件格式,实质上就是一个ZIP的压缩包。通过将apk文件的后缀名修改为zip就可以看到文件的内部结构。

内部结构

APK的组成

1.assets文件夹:

资源目录,用于存放资源文件。asset目录下的资源文件不会再R.java文件下自动生成ID,所以读取asset目录下的文件必须指定文件路径。通过AssetManager类可以访问这些文件。

2.lib文件夹:

so库的存放位置即native库文件,一般由C/C++编写。有4种不同类型,ARM,ARM-v7a,MIPS,X86,分别根据CPU型号的不同来划分。不同的CPU架构对应着不同的目录,每个目录中可以放很多对应版本的so库。目前市场上的移动终端大多是基于ARM或者ARM-v7a架构。

lib目录结构:

3.res文件夹:

res是resource的缩写,用于存放资源文件。这个目录下的资源文件会映射到R.java文件下生产ID。访问时可以直接使用ID。res文件夹下包含多个文件夹,其中

anim文件夹用于存放动画文件
drawable文件夹用于存放图像资源
layout文件夹用于存放布局文件
values文件夹用于存放特征值
colors.xml用于存放颜色文件
dimens.xml定义尺寸值
string.xml定义字符串的值
style.xml定义样式对象
xml文件夹存放任意xml文件,在运行时可以通过Resources.getXML()读取
raw是可以直接复制到设备中的任意文件,无需编译

4.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哈希值。

5.AndroidManifest.xml文件

Android应用程序的配置文件。在开发应用程序时,需要把代码中的每一个Activity,Service,Provider和Receiver在AndroidManifest.xml中注册才能启动对应的组件。这个文件中还包含一些权限声明以及使用的SDK版本信息等。

6.classes.dex

传统的Java程序,首先先把Java文件编译成class文件,字节码都保存在class文件中,Java虚拟机可以通过解释执行这些class文件。而Dalvik虚拟机是在Java虚拟机进行了优化,执行的是Dalvik字节码,而这些Dalvik字节码是由Java字节码转换而来,一般情况下,Android应用在打包是通过AndroidSDK的de工具将Java字节码转换为Dalvik字节码。dx工具可以对多个class文件进行合并,重组,优化,可以达到减小体积,缩短运行时间的目的。

7.resources.arsc文件

用来记录资源文件和资源ID之间的映射关系,用来根据资源ID寻找资源。Android的开发是分模块的,res目录专门用来存放资源文件,当在代码中需要调用资源文件时,只需要调用findviewbyid()就可以得到资源文件,每当在res文件夹下放一个文件,app就会自动生成对应的ID保存在.R文件,我们调用这个ID就可以,但是只要这个ID还不够。.R文件只是抱着编译程序不会报错,实际上在程序运行时,系统要根据ID去寻找对应的资源路径,而resources.arsc文件就是用来记录这些ID和资源文件位置对应关系的文件。