APK基础
APK文件格式
任意一个APK文件包含以下文件夹
assets
assets文件用来存放需要打包到Android应用程序的静态资源文件,例如图片资源文件、json配置文件、渠道配置文件、二进制数据文件、HTML5离线资源文件等。
assets目录支持任意深度的子目录,同时该目录下面的文件不会生成资源ID。
res
res也是存放资源目录的。但是它不支持任意深度的子目录,它里面存放的东西都是关于应用程序的资源(图标图片等),不能乱放乱改(需要符合它的规则)
lib
lib文件夹代表的是当前app所用得到的so文件,so文件就是利用底层的c,c++代码实现的。(也就是程序的依赖库)
META-INF
META-INF文件就是所用到的证书签名文件。
MANIFEST.MF(摘要文件):程序遍历apk包中的所有文件,对非文件夹非签名文件的文件,逐个用SHA1生成摘要信息,再用Base64进行编码。如果APK包的文件被修改,在APK安装校验时,被修改的文件与MAINFEST.MF的校验信息不通,程序将无法正常安装。
CERT.SF(对摘要文件的签名文件):对于生成的MAINFEST.MF的文件利用SHA1-RSA算法对开发者的私钥进行签名。在安装时只有公共密钥才能对其解密。解密之后将其与未加密的摘要信息进行对比,如果相符则文件没有被修改。
CERT.RSA:保存公钥、加密算法等信息。
AndriodManifest.xml
这个是安卓应用程序的配置文件,它像一个目录一样,对apk进行了统一处理,包括指定索引等,记录版本等信息。其中Android应用的四大组件(Activity,Service,BroadcastReceiver和ContentProvider)均在此配置和声明。
class.dex
应用程序的可执行文件。可以看到此APP有多个dex,是因为当前的方法数超过65535,进行了分包处理。如果未超过,则只有一个dex。Android的所有代码都集中与此。可以通过反编译工具讲dex
转化为jar
包,再通过jd-gui
查看其代码。
resources.arsc
该文件主要是资源索引表,用来描述具有id值的资源的配置信息。
APK打包流程
三个基本的东西:
APP资源文件(application resource),APP相关源码(application resource code),Aidl files(实现跨进程通讯AIDL的文件。其本质是安卓底层的一个接口)
流程:
APP资源文件通过工具AAPT
生成了R.JAVA
和Complied reousrces
。
APP相关源码加上R.JAVA
,java interface
通过java Compiler
工具生成为.class Files.
.class files在第三方文件库的加成下通过dex编译器
生成dex文件。
Complied resoueces
和 other resources
再加上dex文件通过工具apkbuilder
生成.apk的安卓文件。
.apk安装包生成出来也不能直接用,需要工具Jarsigner
加上签名需要的一个jar包keystore
进行签名,拿到许可证,生成签了名的apk。
最后在通过工具aipalign
压缩一下进行处理,就生成一个完整的apk文件。
APK安装流程
涉及到的目录
- system/app:系统自带的应用程序,获得adb root权限才能删除。
- data/app:用户程序安装的目录。安装时把apk文件复制到此处。
- data/data:存放应用程序的数据。
- data/dalvik-cache:将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一。)
安装流程
在点击安装后流程可以分为两步:
拷贝apk和解析apk。
拷贝apk:
- 复制APK 到/data/app/包名/目录下解压并扫描数据包。
- 在 /data/data/目录下拷贝数据文件。
解析apk:
- 对dex文件进行优化操作,保存在/data/dalvik-cache/里面。
- 通过androidManifet.xml解析出四大组件。
卸载流程
删除安装过程中在上述三个目录下创建的文件及目录。
APK虚拟机
除了JAVA虚拟机之外,需要区分的是不同安卓版本,虚拟机不一样。
在Android5.0以下,使用的是DALVIK
虚拟机,安卓5.0版本及以上就使用的
ART
虚拟机。
DALVIK
Dalvik虚拟机它的本质是在/system/bin/dexopt
.dex=>dexopt=>.odex dalvi加载执行的是odex文件。
AOT
AOT虚拟机本质是/system/bin/dex2oat
其系统启动在于以下三个目录:
/system/app
,/data/app
,/system/framewok
。
.dex=>dex2oat>.oat art加载执行的是oat文件。