AOP,Aspect Oriented Programming,面向切面编程。主要是对业务某个切面的处理,减小业务的耦合,不侵入代码的一种解决方案。主要的场景是日志,拦截器,埋点,性能监控等
它的具体操作是针对编译时和运行时,对class字节码的操作,将代码动态插入到指定位置,从而实现对逻辑的补充。
那么具体的问题就是
- 什么时候切入
- 切入到哪
- 怎么切入
Android 编译流程
什么时候切入,那么首先看下Android编译流程
这是基于Gradle编译的编译流程图,从以上流程图简单分析下打包流程
一、AAPT打包资源文件
res目录下的文件通过AAPT打包生成R.java、resources.arsc和res文件。resources.arsc是App的资源索引表,和R.java可以定位资源的内存地址
二、处理AIDL文件
生成aidl文件对应的Java文件
三、编译.class文件
- 通过Java Compiler编译R.java、Java接口文件、Java源文件,生成.class文件
- 如果配置了混淆,也会在生成.class文件的时候进行配置
四、生成.dex文件
通过dex命令,将.class文件和三方库的.class文件,生成classes.dex
五、打包生成APK
通过apkbuilder工具,将aapt生成的resources.arsc和res文件、assets文件和class.dex一起打包生成apk
六、签名
通过Jarsigner工具,对apk进行签名
七、对齐
通过zipalign工具,对签名后的apk进行对齐处理
一些区别
res/raw和assets目录的区别
相同点是都不会编译成二进制,而是原封不动的保存在apk中。
不同点如下
目录 | 访问 | 目录结构 |
---|---|---|
res/raw | 映射到R.java文件,通过R.id.xx访问 | 不可以 |
assets | 不会被映射到R.java文件,需要通过AssetManager | 可以再新建文件夹 |
Dalvik和ART虚拟机的区别
从Android5.0开始,Google开始用ART替代Dalvik
安装与运行
Dalvik每次运行都是通过JIT将字节码转换为机器码,会拖慢程序的运行速度,但是安装很快
ART会在第一次安装的时候,就会将字节码预编译成机器码,这样的话,首次安装会慢,但是运行效率会提高
占用空间
ART比Dalvik增加10%到20%,因为要预存字节码
电池
ART增加了电池续航,因为不用每次都转换字节码
ART其他优势
启动更快、运行更快、体验更好、反馈更及时
什么时候切入
从切入时机来看,可以分为静态织入和动态织入。静态织入是class未加载到虚拟机前。
植入时机 | 阶段 | 常见框架 |
---|---|---|
静态织入 | 源码阶段、class阶段、dex阶段 | APT,AspectJ、ASM、Javassit |
动态织入 | 运行时阶段 | java 动态代理,cglib、Javassit |