第二章注解深入浅出

  • 三、插桩
    • 3.1 什么是插桩
    • 3.2 字节码操作框架
    • 3.3 ASM 的使用

三、插桩

3.1 什么是插桩

QQ 空间曾经发布的《热修复解决方案》中利用 Javaassist 库实现向类的构造函数中插入一段代码解决 CLASS_ISPREVERIFIED 问题。包括了 Instant Run 的实现以及参照 Instant Run 实现的热修复美团 Robus 等都利用到了插桩技术。

插桩就是将一段代码插入或者替换原本的代码。字节码插桩顾名思义就是在我们编写的源码编译成字节码(Class)后,在 Android 下生成 dex 之前修改 Class 文件,修改或者增强原有代码逻辑的操作。



我们需要查看方法执行耗时,如果每一个方法都需要自己手动去加入这些内容,当不需要时也需要一个个删去相应的代码。一个、两个方法还好,如果由 10 个、20 个得多麻烦!所以可以利用注解来标记需要插桩的方法,结合编译后操作字节码来帮助我们自动插入,当不需要时关掉插桩即可。这种 AOP 思想让我们只需关注插桩代码本身。

AOP:Aspect Oriented Programming,面向切面编程,通过预编译方式和运行期间动态代码实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容,是函数式编程的一种衍生范型。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

OOP:Object Oriented Programming,面向对象程序设计,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事务特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。

3.2 字节码操作框架

上面我们提到 QQ 空间使用了 Javaassist 来进行字节码插桩,除了 Javaassist 之外还有一个应用更为广泛的 ASM 框架同样也是字节码操作框架,Instant Run 包括 AspectJ 就是借助 ASM 来实现各自的功能。

我们非常熟悉的 JSON 格式数据是基于文本的,我们只需要知道它的规则就能够轻松的生成、修改 JSON 数据。同样的 Class 字节码也有其自己的规则(格式)。操作 JSON 可以借助 GSON 来非常方便的生成、修改 JSON 数据。而字节码 Class,同样可以借助 Javaassist/ASM 来实现对其修改。


字节码操作框架的作用在于生成或者修改 Class 文件,因此在 Android 中字节码框架本身是不需要打包进入 APK 的,只有其生成/修改之后的 Class 才需要打包进入 APK 中。它的工作时机在上图 Android 打包流程中的生成 Class 之后,打包 dex 之前。

3.3 ASM 的使用

ASM 可以直接从 jcenter() 仓库中引入,我们可以进入 https://bintray.com/ 进行搜索:


点击 图片第二个红框,可以看到最新的正式版本为:8.0.1


点击版本号查看引入:


所以,在 AS 中加入:

dependencies {testImplementation 'org.ow2.asm:asm:8.0.1'testImplementation 'org.ow2.asm:asm-commons:8.0.1'
}

需要注意的是,使用 testImplementation 引入,这表示只能在 Java 的单元测试中使用这个框架,对 Android 中的依赖关系没有任何影响。

AS 中使用 gradle 的 Android 工程会自动创建 Java 单元测试与 Android 单元测试,测试代码分别在 test 与 androidTest。

详细的插桩细节参考以下两个文章:
关于java字节码框架ASM的学习
Java ASM 技术简介

第二章注解深入浅出(三、插桩)相关推荐

  1. java 可插拔注解_servlet3.1规范翻译:第8章 注解和可插拔性

    servlet3.1规范翻译:第8章 注解和可插拔性 . 这是Servlet3.0的新特性之一:这是Servlet3.0的新特性之一: 通过Annotation(注解)配置Servlet之前版本的Se ...

  2. php运算符实验报告,第二章,第三章实验报告(示例代码)

    C程序设计实验报告(第二次) 姓名:熊毅 实验地点:家 实验时间:2020.03.10 实验项目:字符与ASCII码:运算符与表达式的应用:顺序结构应用程序:数学函数:鸡兔同笼:确定坐标 一.实验目的 ...

  3. 第二章(第三部分) 出发之前

    突然一抹沙被吹到魂凌的脸上,魂凌醒了. "噗!"魂凌吐了进入嘴里的沙粒. "什么人啊?走路不带眼镜的!"魂凌起来拍了拍身上的沙子,看看胸口,发现项链竟然不见了! ...

  4. Java EE入门教程系列第二章JSP(三)——JSP指令与动作组件

    2.3 指令与动作组件 2.3.1 page指令 page指令的基本语法为: <%@ page 属性1="属性1的值" 属性2="属性2的值"···%&g ...

  5. 计算机网络 华南理工大学期末重点 第二章 物理层 谢希仁

    计算机网络 华南理工大学期末重点 第二章 物理层 <计算机网络(第七版)>谢希仁 前言 笔者是自动化专业,以下是大二上学期期末时,整理的一些复习笔记,既一些常考点,这是第二章<物理层 ...

  6. java ast 添加注解_基于AST的组件化自动插桩方案

    本文将带你实现一个一百多行代码实现的自动化插桩方案,解决组件化子模块的初始化和路由器的自动注册,支持多种类型的插桩.支持前插后插.支持插入代码的优先级设置.我们将使用编辑器的API来操作AST实现代码 ...

  7. 计算机插补,第三章计算机数控装置的插补原理.doc

    第三章 计算机数控装置的插补原理 3.1 概述 3.1.1插补的基本概念 是指在轮廓控制系统中,根据给定的进给速度和轮廓线形的要求等"有限信息",在已知数据点之间插入中间点的方法, ...

  8. 《Python核心编程 》笔记-第二章+第三章

    第二章 快速入门 print语句中使用字符串格式操作符,实现字符替换功能. print "%s is %d" %("one",1) %s.%d.%f分别用字符串 ...

  9. 《算法导论》学习总结 — 2.第一章 第二章 第三章

    上一篇:http://www.cnblogs.com/tanky_woo/archive/2011/04/09/2010263.html 前三章基本没什么内容,所以合在一起总结. 第一章: 讲了算法( ...

  10. python数据结构题目_《数据结构与算法Python语言描述》习题第二章第三题(python版)...

    ADT Rational: #定义有理数的抽象数据类型 Rational(self, int num, int den) #构造有理数num/den +(self, Rational r2) #求出本 ...

最新文章

  1. 从这篇YouTube论文,剖析强化学习在工业级场景推荐系统中的应用
  2. iis重启的几种方法
  3. 二分图带权最大匹配费用流_你真的会写二分检索吗?
  4. Cortex-M3 动态加载一(地址无关代码实现)
  5. jeecg集成实现websocket
  6. 韩松、朱俊彦等人提出GAN压缩法:算力消耗不到1/9,现已开源
  7. 开源 serverless 产品原理剖析 - Kubeless 1
  8. 【VMware虚拟机】【克隆问题】在VMware 9.0下克隆CentOS6.5虚拟机无法识别eth网卡
  9. 浅谈Oracle执行计划
  10. 三次hermite插值多项式例题_分段三次Hermite插值及其与三次样条的比较
  11. JavaScript入门思维导图
  12. 在pycharm中使用pyqt5时clicked().后面connect不自动补全问题解决办法
  13. java炫酷龙卷风源码,龙卷风's Blog
  14. 服务器遇到DDOS攻击怎么办?
  15. 【RDMA】技术详解(四):RDMA之Verbs和编程步骤
  16. 题目连接:http://acm.zznu.edu.cn/problem.php?id=1329
  17. word中本页有空白,一回车自动换下一页,解决办法如下
  18. pytorch报错:PicklingError: Can’t pickle <function at 0x000001EA6923EAF0>: attribute lookup on main fai
  19. 【ML】Markov Chain Monte Carlo(MCMC)---Slice sampler(切片采样)和Hierarchical Models(层次模型)
  20. Froala富文本编辑器

热门文章

  1. win10开机密码忘记怎么办|win10登陆密码忘记解决方法
  2. H3C Comware V7新增的RBAC
  3. 计算机网络第二章学习通题目及答案
  4. mysql 网吧管理系统设计_网吧管理系统开题报告.doc
  5. STC 32位8051单片机开发实例教程 二 I/O工作模式及其配置
  6. oracle 怎么清空数据表,oracle怎么清空表数据,oracle清空数据库
  7. AT24C04、AT24C08、AT24C16系列EEPROM芯片单片机读写驱动程序
  8. java 聊天室系统实训总结_关于JAVA聊天室编写的总结
  9. 104规约使用总结(一)——格式介绍
  10. MovieLens 数据集补充版爬虫代码解析