Android 开发高手课
张绍文
前微信高级工程师,Tinker 负责人
52722 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 62 讲
导读 (1讲)
模块一 高质量开发 (25讲)
Android 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

练习Sample跑起来 | ASM插桩强化练习

需要处理new和InvokeSpecial指令的成对出现情况
通过修改字节码实现替换new Thread为自定义类
需要注意局部变量的使用和栈顶遗留数据的处理
使用AdviceAdapter来实现方法的前后插桩
替换项目中的所有的new Thread
通过ASM插桩统计方法耗时
GMTC门票还有剩余,给自己一个进阶的机会
送出价值4800元的GMTC门票一张给@唯鹿
强化练习的代码链接提供
最后留给你一个思考题,如何给某个方法增加一个try catch呢?
在处理字节码时需要考虑多种可能出现的情况
通过两个例子的练习,加深对ASM使用的理解
ASM Bytecode Outline插件可以快速展示当前编辑类的字节码表示
通过理论 + 实践的方式尽可能掌握插桩的精髓
上一期讲了编译插桩的三种方法:AspectJ、ASM、ReDex,以及它们的应用场景
福利彩蛋
ASM插桩强化练习

该思维导图由 AI 生成,仅供参考

你好,我是孙鹏飞。
专栏上一期,绍文讲了编译插桩的三种方法:AspectJ、ASM、ReDex,以及它们的应用场景。学完以后你是不是有些动心,想赶快把它们应用到实际工作中去。但我也还了解到,不少同学其实接触插桩并不多,在工作中更是很少使用。由于这项技术太重要了,可以实现很多功能,所以我还是希望你通过理论 + 实践的方式尽可能掌握它。因此今天我给你安排了一期“强化训练”,希望你可以趁热打铁,保持学习的连贯性,把上一期的理论知识,应用到今天插桩的练习上。
为了尽量降低上手的难度,我尽量给出详细的操作步骤,相信你只要照着做,并结合专栏上期内容的学习,你一定可以掌握插桩的精髓。

ASM 插桩强化练习

在上一期里,Eateeer 同学留言说得非常好,提到了一个工具,我也在使用这个工具帮助自己理解 ASM。安装“ASM Bytecode Outline”也非常简单,只需要在 Android Studio 中的 Plugin 搜索即可。
ASM Bytecode Outline 插件可以快速展示当前编辑类的字节码表示,也可以展示出生成这个类的 ASM 代码,你可以在 Android Studio 源码编译框内右键选择“Show Bytecode Outline“来查看,反编译后的字节码在右侧展示。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何通过ASM插桩来实现方法耗时统计和替换项目中的线程。作者首先介绍了使用ASM Bytecode Outline插件来展示当前编辑类的字节码表示,并详细讲解了如何通过ASM实现统计每个方法的耗时和替换项目中的线程。在实践中,读者可以通过这些方法来加深对ASM使用的理解,并且需要注意处理字节码时可能出现的各种情况。文章还提供了一个思考题,即如何给某个方法增加一个try catch。通过这篇文章,读者可以快速了解ASM插桩的强化练习,以及在实践中需要注意的细节和技术特点。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Android 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • 唯鹿
    感谢老师的认可与鼓励,我会继续坚持学习与分享!🙏

    作者回复: 你是最棒的!

    2019-02-23
    30
  • Neil
    这个插件是不是在AS3.3上失效了啊

    作者回复: 3.3应该是没问题的

    2019-03-11
    4
    2
  • 肥牛大猛
    请问在写Transform的过程中,如何debug代码呢?初期对ASM不熟悉,在写的过程中如果能debug最好了

    作者回复: 可以debug的,在前一篇文章里面有一个参考链接

    2019-03-01
    2
    1
  • blithe
    为什么是使用发射的方式,替换了transformClassesWithDexBuilderForDebug,而不是直接在plugin中直接加入进去一个

    作者回复: 因为要拿到原来transform的一些输入和输出,不过gradle 3.6 之后慢慢都换回task了

    2019-12-12
  • 王大大
    @splm 我的方法是在本地建repo,然后在项目中classpath引进去,然后在apply进去,但是修改了代码调试需要重新uploadArchives,就很麻烦,有什么好的调试办法吗

    作者回复: 可以现在task编译一次localmaven的,我已经写了支持

    2019-03-28
  • splm
    如果不上传maven的话,本地工程使用,提示找不到插件类,这个是什么问题?

    作者回复: 需要先编译localmaven

    2019-03-26
  • 杨泉
    如何运行Demo ASMSample项目先注释掉 // apply plugin: 'com.geektime.asm-plugin' // classpath ("com.geektime.asm:asm-gradle-plugin:1.0") { changing = true }` 编译和发布asm-gradle-plugin 到本地maven ./gradlew buildAndPublishToLocalMaven 还原第1步注释掉的插件依赖,即可运行Demo ./gradlew installDebug 我的,还要修改以下3点,才能编译通过: 1 把项目的改为 distributionUrl=https://services.gradle.org/distributions/gradle-5.6.4-all.zip 2 项目的 buildscript{ dependencies { classpath 'com.android.tools.build:gradle:3.6.1' } } 3 asm-gradle-plugin module中的 dependencies { compile 'com.android.tools.build:gradle:3.6.1' //从2.1.0改为3.6.1,否则com.android.build.gradle.internal.pipeline和com.android.build.api.transform包找不到 }
    2020-05-02
    2
  • ysnows
    https://plugins.jetbrains.com/plugin/14860-asm-bytecode-viewer-support-kotlin 大家也可以用这个插件,ASM Bytecode Outline已经不更新了
    2022-01-26
  • haizhiyun
    你好,asm 如何在一个方法的调用后面插入一个方法 ,并获取这个方法的所有参数,实现类似 aspectJ @After("call(...)") 或者 @Around("call(...)")的功能
    2019-11-29
  • splm
    Could not find implementation class for plugin error when using Gradle 4.1+。 有遇到这个问题的朋友,可以肯定是找不到类,第一要看插件的properties文件命名和里面的内容指向,命名是用来apply的,内容是用来找到对应插件类,要明确这个关系。第二,要仔细groovy文件是否有后缀。我之前就是粗心连续的回车,导致忘记给文件家后缀,一直报这个恶心的错误。
    2019-03-26
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部