Android开发高手课
张绍文
前微信高级工程师,Tinker负责人
立即订阅
12558 人已学习
课程目录
已完结 61 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 焦虑的移动开发者该如何破局?
免费
导读 (1讲)
导读 | 如何打造高质量的应用?
模块一 高质量开发 (25讲)
01 | 崩溃优化(上):关于“崩溃”那些事儿
02 | 崩溃优化(下):应用崩溃了,你应该如何去分析?
03 | 内存优化(上):4GB内存时代,再谈内存优化
04 | 内存优化(下):内存优化这件事,应该从哪里着手?
05 | 卡顿优化(上):你要掌握的卡顿分析方法
06 | 卡顿优化(下):如何监控应用卡顿?
06补充篇 | 卡顿优化:卡顿现场与卡顿分析
07 | 启动优化(上):从启动过程看启动速度优化
08 | 启动优化(下):优化启动速度的进阶方法
09 | I/O优化(上):开发工程师必备的I/O优化知识
10 | I/O优化(中):不同I/O方式的使用场景是什么?
11 | I/O优化(下):如何监控线上I/O操作?
12 | 存储优化(上):常见的数据存储方法有哪些?
13 | 存储优化(中):如何优化数据存储?
14 | 存储优化(下):数据库SQLite的使用和优化
15 | 网络优化(上):移动开发工程师必备的网络优化知识
16 | 网络优化(中):复杂多变的移动网络该如何优化?
17 | 网络优化(下):大数据下网络该如何监控?
18 | 耗电优化(上):从电量优化的演进看耗电分析
19 | 耗电优化(下):耗电的优化方法与线上监控
20 | UI 优化(上):UI 渲染的几个关键概念
21 | UI 优化(下):如何优化 UI 渲染?
22 | 包体积优化(上):如何减少安装包大小?
23 | 包体积优化(下):资源优化的进阶实践
24 | 想成为Android高手,你需要先搞定这三个问题
模块二 高效开发 (9讲)
25 | 如何提升组织与个人的研发效能?
26 | 关于编译,你需要了解什么?
27 | 编译插桩的三种方法:AspectJ、ASM、ReDex
28 | 大数据与AI,如何高效地测试?
29 | 从每月到每天,如何给版本发布提速?
30 | 数据评估(上):如何实现高可用的上报组件?
31 | 数据评估(下):什么是大数据平台?
32 | 线上疑难问题该如何排查和跟踪?
33 | 做一名有高度的移动开发工程师
模块三 架构演进 (9讲)
34 | 聊聊重构:优秀的架构都是演进而来的
35 | Native Hook 技术,天使还是魔鬼?
36 | 跨平台开发的现状与应用
37 | 移动开发新大陆:工作三年半,移动开发转型手游开发
38 | 移动开发新大陆:Android音视频开发
39 | 移动开发新大陆: 边缘智能计算的趋势
40 | 动态化实践,如何选择适合自己的方案?
41 | 聊聊Flutter,面对层出不穷的新技术该如何跟进?
42 | Android开发高手课学习心得
练习Sample跑起来 (8讲)
练习Sample跑起来 | 热点问题答疑第1期
练习Sample跑起来 | 热点问题答疑第2期
练习Sample跑起来 | 热点问题答疑第3期
练习Sample跑起来 | 热点问题答疑第4期
练习Sample跑起来 | ASM插桩强化练习
练习Sample跑起来 | 唯鹿同学的练习手记 第1辑
练习Sample跑起来 | 唯鹿同学的练习手记 第2辑
练习Sample跑起来 | 唯鹿同学的练习手记 第3辑
特别放送 (7讲)
Android JVM TI机制详解(内含福利彩蛋)
专栏学得苦?可能是方法没找对
专栏学得苦?可能你还需要一份配套学习书单
Native下如何获取调用栈?
聊聊Framework的学习方法
Android工程师的“面试指南”
程序员修炼之路 | 设计能力的提升途径
结束语 (1讲)
结束语 | 移动开发的今天和明天
Android开发高手课
登录|注册

27 | 编译插桩的三种方法:AspectJ、ASM、ReDex

张绍文 2019-02-21
只要简单回顾一下前面课程的内容你就会发现,在启动耗时分析、网络监控、耗电监控中已经不止一次用到编译插桩的技术了。那什么是编译插桩呢?顾名思义,所谓的编译插桩就是在代码编译期间修改已有的代码或者生成新代码。
如上图所示,请你回忆一下 Java 代码的编译流程,思考一下插桩究竟是在编译流程中的哪一步工作?除了我们之前使用的一些场景,它还有哪些常见的应用场景?在实际工作中,我们应该怎样更好地使用它?现在都有哪些常用的编译插桩方法?今天我们一起来解决这些问题。

编译插桩的基础知识

不知道你有没有注意到,在编译期间修改和生成代码其实是很常见的行为,无论是 Dagger、ButterKnife 这些 APT(Annotation Processing Tool)注解生成框架,还是新兴的 Kotlin 语言编译器,它们都用到了编译插桩的技术。
下面我们一起来看看还有哪些场景会用到编译插桩技术。
1. 编译插桩的应用场景
编译插桩技术非常有趣,同样也很有价值,掌握它之后,可以完成一些其他技术很难实现或无法完成的任务。学会这项技术以后,我们就可以随心所欲地操控代码,满足不同场景的需求。
代码生成。除了 Dagger、ButterKnife 这些常用的注解生成框架,Protocol Buffers、数据库 ORM 框架也都会在编译过程生成代码。代码生成隔离了复杂的内部实现,让开发更加简单高效,而且也减少了手工重复的劳动量,降低了出错的可能性。
代码监控。除了网络监控和耗电监控,我们可以利用编译插桩技术实现各种各样的性能监控。为什么不直接在源码中实现监控功能呢?首先我们不一定有第三方 SDK 的源码,其次某些调用点可能会非常分散,例如想监控代码中所有 new Thread() 调用,通过源码的方式并不那么容易实现。
代码修改。我们在这个场景拥有无限的发挥空间,例如某些第三方 SDK 库没有源码,我们可以给它内部的一个崩溃函数增加 try catch,或者说替换它的图片库等。我们也可以通过代码修改实现无痕埋点,就像网易的HubbleData、51 信用卡的埋点实践
代码分析。上一期我讲到持续集成,里面的自定义代码检查就可以使用编译插桩技术实现。例如检查代码中的 new Thread() 调用、检查代码中的一些敏感权限使用等。事实上,Findbugs 这些第三方的代码检查工具也同样使用的是编译插桩技术实现。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Android开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(17)

  • Eateeer
    看到这篇文章表示非常激动,这段时间自己也在尝试了解和使用编译插桩的相关技术,编译插桩涉及的东西很多,特别是 ASM 与 Transform 结合后产生的一些列化学反应,比如无埋点、增量编译、Instant Run 等,感觉像是打开了一个新世界的大门。

    给大家安利一个 IntelliJ 插件 - ASM Bytecode Outline,可以用来帮助编写字节码。

    再次感谢绍文大大的精彩文章!

    作者回复: 感谢分享,这个工具挺有用的,有时候我也会用

    2019-02-21
    10
  • Handongyang
    推荐使用ByteBuddy

    作者回复: 感谢分享,我也去了解一下ByteBuddy

    2019-02-24
    1
    5
  • 王大大
    推荐一个简单轻量的asm框架lancet,https://github.com/eleme/lancet,通过这个库实现业务代码的动态监测
    2019-03-28
    2
  • su
    这篇含金量是目前整个专栏最好的,谢谢

    作者回复: 需要课后补充知识以及实践

    2019-02-22
    2
  • 大土豆
    作为从Java后端转过来的老用户,aspectj是不二选择
    2019-05-06
    1
  • seven
    文哥牛逼!这篇至少要看个十几遍~玩溜asm估计要练习个几个月了

    作者回复: Asm还是挺多用途的

    2019-02-21
    1
  • 叶十七
    ByteBuddy封装度很高,使用最简单,比javaassist好用很多。
    2019-10-31
  • 廉颇未老 尚能饭
    我最近使用asm访问方法的注解,怎么都不能访问到呀,刚入门不久,有那个大佬指教一下呀。AnnotationVisitor
    2019-10-27
  • 。ZQN
    做了一个可视化埋点系统
    2019-10-21
  • Geek_28d7fe
    感谢分享,在github上的demo很专业,不是单纯的演示。感恩专业、用心
    2019-07-31
  • 李剑昆
    https://github.com/lijiankun24/Koala ASM 版本的 hugo ^_^。还有个问题想请教一下,使用插桩实现增量编译有什么思路或者方向吗?
    2019-07-17
  • itismelzp
    非常棒!但是我有个问题,就是asm插桩后的class行号就变了吧,这样堆栈信息就对不上了。。。
    2019-07-15
  • Dimple
    文章只是敲门砖,还得看看虚拟机,以及课后的这些链接,Android高手之路,任重道远
    2019-06-19
  • 孫小逗
    请问,AS3.1.3,安装ASM Bytecode Outline后,没有显示字节码是什么情况?

    作者回复: 没有显示字节码指的是?

    2019-03-19
  • X
    请问Systrace在Windows上是不是不支持,我试过在Mac上可以用的,但是Windows上就报错,Google了下好像很多人反馈这个但是没有解决方案!

    作者回复: Systrace应该是支持的,但是我也好久没使用过Windows了

    2019-03-16
  • splm
    嗯很不错啊。之前一直对插桩只有印象,但具体做什么还是不了解,但今天看了这篇文章,受益匪浅。原来插桩的技术,自己之前就用过了。

    这个是自己之前利用APT和JavaPoet写的一个开发工具,大家可以交流探讨一下。
    https://github.com/splm/WeBase
    也希望大家能多点几个星。

    作者回复: 非常好,赞赞赞

    2019-03-04
  • LD
    另外一个字节码处理工具javaasist也不错哦
    使用比asm简单,达到的效果和asm一致(直接插入代码,不像aspectj需要生成包装函数)

    作者回复: javassit效率比较低

    2019-02-21
收起评论
17
返回
顶部