文章目录
- APK文件结构
- APK打包流程
- APK安装流程
APK文件结构
先用一些压缩软件打开任意一个apk,如图:
Assets中的文件资源是不会变的静态文件,如图片资源文件、JSON配置文件等等。
Res也是存放资源的文件夹,但是res中的资源都是程序运行所需要的一些文件,
与代码以及程序运行相关。即assets中,我们可以随意创建文件夹、文件等等,
但是res文件夹的内容尽量不要动
Lib文件夹代表的是当前app所用的到的so文件,so文件就是利用底层c,
c++代码实现的一些逻辑(依赖库)。即一个apk的代码不止用到java也会用到c与c++。
Meta-inf文件夹就是证书签名文件,主要的作用是校验apk内容有没有被修改。
AndroidManifest.xml是整个程序的配置文件,简单的理解为程序的自我介绍,
包括当前apk需要一些什么权限与开发者签名等等。可以改动其内容,
但是建议不要修改其文件名。
Classes.dex是应用程序的可执行文件,有的apk内会有多个dex文件,
是因为当前的方法数超过65535进行了分包处理。假如未超过,
则只有一个dex文件。Android的所有代码都集中在此。
我们可以通过反编译工具将其转化为jar包,在通过相关工具(如jd-gui)查看其代码。
Resources.arsc是资源索引表,用来描述具有ID值的资源的配置信息。
APK打包流程
第一层,
基本的资源(AAPT处理)+APP源码+DIDL文件(java的一个接口处理)
最终通过java的编译器编译都成为了java(即class文件)
第二层,
Java的.class字节码与第三方库都搞到一起放到dex(.dex文件)了
第三层,
Dex文件 + 其他资源(assert文件夹内静态资源) + 最开始的一些资源(Res文件夹中的)
通过apk打包器生成一个原生的apk(安装包)。
Assert可以看作是“动态的”即自己可以随意增文件/夹
但是res(包含java代码的)是“静态的”,最好不要动。
此时的安装包还差一个签名,可以简单的理解为许可证。
第四层,
将最初的apk与Debug(签名需要支持的一个jar包(内涵公钥与私钥))
都传到Jarsigner中生成一个签名后的apk。
第五层,
使用zipalign对签名后的apk进行处理
主要的过程是将一些资源进行压缩对齐,对齐方便硬件打开的加载速度。
APK安装流程
点击apk会调起一个界面,询问是否安装,这个过程实际是调用了一个组件
~Copy Apk到/data/app/包名下,
~然后通过资源管理器去解析apk之中的资源文件。
在解析AndroidManifest.xml
~在/data/data/下创建一个存放应用数据的一个文件夹
将上边解析得到的数据存放至此
~把dex(源码)进行优化后存储到/data/dalvik-cache/中
Dex文件是dalvik虚拟机的可执行文件,
其大小约为原始apk文件大小的四分之一
~将AndroidManifest.xml解析出四大组件信息注册到手机
~最后发送一条广播。
总体过程:
Copy APK,解析Apk并将数据存放,安装AndroidManifest.xml获取其安装信息。
同时会分配Linux的用户id以及用户组的ID,以获取到在系统中运行的一些权限。
小结: