APK结构介绍

前言

HI,欢迎来到裴智飞的《每周一博》。今天是一月第一周,也是2019年的第一周,今天我给大家介绍下APK的结构。

APK其实就是个压缩文件,我们把后缀改成ZIP之后解压就可以看到里面的内容主要有如下部分:

APK结构介绍_第1张图片

1.AndroidManifest.xml
该文件是每个应用都必须包含的,它描述了应用的名字,版本,权限,引用的库文件等等信息。APK中的AndroidManifest.xml是二进制文件,直接打开是乱码,需要反编译。

2.META-INF目录
META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。打包时会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。这就保证了apk包里的文件不能被随意替换。比如拿到一个apk包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩,替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系统的安全。

3.classes.dex文件
classes.dex是java源码编译后生成的java字节码文件。安卓的虚拟机解析的是dex文件而不是class。dex文件中各个类能够共享数据,在一定程度上降低了冗余,也使得文件结构更加经凑,节省体积。

4.resources.arsc
resources.arsc是编译后的二进制资源文件,它是一个映射表,映射着资源和id,通过R文件中的id就可以找到对应的资源。

5.res目录
res目录存放资源文件,包括图片,字符串等等,像layout,drawable中的xml文件也都是经过编译的,直接打开是乱码,需要使用apktools才能查看。

6.lib目录
lib目录下存放的是一些so文件,如果代码中没有so就没有该目录。

7.assets目录
assets目录下是一些配置文件,也可以是资源,这里的xml文件不会经过编译,如果代码中没有assets也不会有该目录。

编译APK主要有如下几步:

  1. 根据资源文件和AndroidManifest.xml生成R.java文件
  2. 编译AIDL,生成对应的java文件,没有则跳过
  3. 编译工程源码(主项目和库),同时上边生成的R文件和AIDL生成的Java文件也会被编译生成相应的class文件
  4. 将class文件打包生成dex文件
  5. 将资源文件打包,生成初始的apk
  6. 将生成的dex文件加入到apk中生成未签名的包
  7. 对apk进行签名
  8. 将签名后的apk进行对齐处理,目的是减少程序运行时对内存的占用

这里有几个图可以帮助理解下。

APK结构介绍_第2张图片
粗略打包图
APK结构介绍_第3张图片
详细打包图

本文介绍了APK的基本结构,下周会介绍APK的具体打包过程,感谢大家的阅读,我们下周再见。

你可能感兴趣的:(APK结构介绍)