参考网址: 浅谈Android编译打包流程
一、基本概念
1、apk本质是一个压缩包,把后缀名改成zip,就可以看到apk文件的所有内容。
2、为什么不直接使用zip,答案:系统规定的不允许
3、apk如何加载: 通过应用管理器这个程序,扫描所有的apk文件,把它们标记为可加载的程序,当安装apk时,把它进行解压处理
4、apk解压后包含的文件:
文件名 | 备注 |
---|---|
lib | 所有的so动态链接库,不会被压缩处理 |
assets | 资源文件,不会被压缩处理 |
res | 资源文件,二进制的xml文件和图片资源文件 |
Android manifest.xml | 二进制xml文件 |
class.dex | java代码通过处理得到的 |
META-INF | 签名文件夹 |
resources.arsc | 资源索引表 |
二、打包流程
流程名 | 备注 |
---|---|
AAPT | 编译/打包资源文件,生成R.java和resources.arsc和res资源文件 |
aidl | 把aidl生成java文件 |
java compile | 把java文件编译成.class文件 |
dex | 把.class文件转换成dex文件 |
apk building | 打包生成.apk文件 |
jar signer | 对apk进行签名 |
zipalign | 对apk做对齐处理 |
备注:
R.java定义了各个资源ID变量 |
---|
resources.arsc是资源索引表 |
我们常用的findviewByid就是先在R.java中获取变量ID,然后在resources.arsc中查到对应的资源文件位置 |
assets和res/raw的资源会被原封不动的打包到apk中,不会被编译成二进制,其他资源文件会经过特殊处理,进行压缩,过滤等 |
assets和raw的区别: raw会在R.java中生成资源id,assets不会被映射到R.java,访问它需要使用assetManager |
res/values会被编译到resources.arsc中 |
通过dx工具把java 字节码转换为 dalvik字节码,压缩常量池,消除冗余信息等 |