这是我参与「第四届青训营 」笔记创作活动的第2天
本文延续上次所发布的文章继续进行Android 系统的介绍,建议在阅读上一篇后再阅读本文。
1.APK介绍
APK全称为AndroidPackage,即Android安装包(本质也是一个压缩包)。所以apk一般包含一个项目所有源码和资源,其安全性就变得至关重要。但是这个安装包存在“BUG”,因为对于懂一点反编译原理的人来说,apk的源码是透明的,而且不仅可以看到,对其进行修改和打包重新编译都轻而易举。那么对apk的加固就变得至关重要,我们会在后文讲到。
2.APK的构成
-
META-INF目录:包含两个签名文件(CERT.SF和CERT.RSA),以及一个manifest文件(MANIFEST.MF),用于校验和安全,只有我们有apk的签名时,安装包里才有这个文件,如果没有签名的apk,Android设备是不允许安装的
-
assets目录:记录一些资源文件,如文档,图片;可以使用AssetManager获取
-
res目录:包含那些没有被编译到resources.arsc的资源
-
lib目录:主要是存放C/C++代码编译成的so文件
-
resources.arsc文件:可执行文件,存储经aapt编译过的资源,包括项目工程中的res/values目录里的xml文件,它们都被编译成二进制格式,也包括一些路径,指向那些没有被编译的资源,比如layout文件和图片
-
classes.dex文件:项目中的java类都被编译到该dex文件,这个文件可以被Android的Dalvik/ART虚拟机解析。
-
AndroidManifest.xml:生命app中四大组件,以及权限,是一种二进制格式的manifest文件
3.APK的打包流程
a. 打包资源文件,生成R.java文件
b. 处理aidl文件,生成相应的Java文件
c. 编译项目源代码,生成class文件
d. 转换所有的class文件,生成classes.dex文件
e. 打包生成APK文件
f. 对APK文件进行签名
g. 对签名后的APK文件进行对齐处理