AOP,Aspect Oriented Programming,面向切面编程。主要是对业务某个切面的处理,减小业务的耦合,不侵入代码的一种解决方案。主要的场景是日志,拦截器,埋点,性能监控等
它的具体操作是针对编译时和运行时,对class字节码的操作,将代码动态插入到指定位置,从而实现对逻辑的补充。
那么具体的问题就是

  • 什么时候切入
  • 切入到哪
  • 怎么切入

Android 编译流程

什么时候切入,那么首先看下Android编译流程

android13编译打包 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

android13编译打包 android编译打包流程_字节码_02