APK打包原理
前言
HI,欢迎来到裴智飞的《每周一博》。今天是一月第一周,也是2019年的第一周,今天我给大家介绍下APK的打包原理。
APK其实就是个压缩文件,我们把后缀改成ZIP之后解压就可以看到里面的内容主要有如下部分:
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也不会有该目录。
那么我们