一、什么是插桩

插桩:目标程序代码中某些位置插入或修改一些代码,从而在目标程序运行过程中获取某些程序状态并加以分析。简单来说就是在代码中插入代码。 函数插桩:便是在函数中插入或修改代码,在Android编译过程中,往字节码里插入自定义的字节码,所以也可以称为字节码插桩。

二、如何进行操作

完成插桩需要考虑以下两步:

1、寻找插入时机

了解Android打包流程

2、插入字节码

2.1、插桩入口 Transform API:Android Gradle提供,可操作获取字节码

2.1.1、自定义Transform、插件编写

2.2、字节码操作 Javassist :一个开源的分析、编辑和创建 Java 字节码的类库 ASM:Java 字节码操控框架 ASM 的优点就在于性能上的优势,且更加灵活;Javassist 的实现 中大量使用的反射,所以性能偏低。这里使用ASM来处理字节码。

2.1、Transform 在class编译成dex的过程中,会经过一系列Transform处理。Transform之间采用流式处理方式。每个Transform需要一个输入,处理完成后产生一个输出,而这个输出又会作为下一个Transform的输入。就这样,所有的Transform依次完成自己的使命。Proguard、Muti-Dex等功能都是通过继承Transform实现的,而我们自定义的Transform,会插入到这个Transform链条的最前面。

2.1.1、自定义Transform:

1 、继承Transform(看下实际项目讲解几个重要方法) 2、自定义gradle插件,集成Transform

Gradle自定义插件 插件的源码可以使用Scale、groovy、java、kotlin编写,有三种地方(方式)可以自定义:

1、直接在build.gradle中编写

2、在项目的 buildSrc 目录下编写

3、创建一个Android Library Module,可以打包发布 JAR。

这里介绍第三种做法:

1、创建一个Library Module

2、修改build.gradle文件

3、修改src/main/java的目录名改成src/main/groovy

4、在groovy新建自己的包目录,并新建一个groovy 类,这个类就是插件的入口类

5、新建插件配置文件 /src/main/resources/META-INF/gradle-plugins/xx.properties,文件名xx就是插件名,引用插件时使用apply plugin: "xx"

6、执行uploadArchives这个gradle任务会在 项目根目录的repo文件夹生成一个本地maven仓库

7、在项目的gradle文件添加仓库引用

8、在 app目录下的gradle文件添加apply plugin: 引用插件

2.2、ASM

ASM不是直接对数字字节码进行操作,而是对类似于”com/rhythm7/Main.m:I“这种字节码反编译后的格式进行操作,这样的格式,就友好的多,我们无需关注class文件冗长的数字中方法的偏移量、编码方式、指代含义等,只需要关注字节码指令即可。

ASM提供很多vistor接口供我们使用,在 ASM 中,提供了一个 ClassReader类,这个类可以直接由字节数组或由 class 文件间接的获得字节码数据,它能正确的分析字节码,构建出抽象的树在内存中表示字节码。它会调用 accept方法,这个方法接受一个继承了 ClassVisitor抽象类的对象实例作为参数,然后依次调用 ClassVisitor接口的各个方法。

使用ASM Bytecode Outline插件生成ASM代码 1、在Android Studio中安装ASM Bytecode Outline插件 2、安装后,在编译器中,点击右键,选择Show Bytecode outLine 3、在ASM标签中选择ASMified,即可在右侧看到当前类对应的ASM代码。

三、在Android中的应用

目前想到的是编译时AOP方向,做一些统一的管理控制。

1、行为统计 页面的打开关闭、点击事件

2、方法耗时统计

3、方法替换(热修复等)

4、多模块解耦

...... 其他方向:

1、对第三方jar包、依赖做修改(修复bug等)

2、对系统方法修改(自定义全局Log输出、方法适配等) ......

Android函数插桩相关推荐

  1. Android编译插桩

    背景:这一次分享一下关于android编译插桩这个话题,在正常编写代码实现程序的逻辑外,还要使用一点点黑科技,拿起操作代码无所不能的武器. 一.Android常用的能动态改变代码逻辑的方法有两种 1. ...

  2. Android ASM 插桩实践

    上一章知道了如何获取 class 文件,那该如何进行插桩呢?本章告诉你! 什么是 ASM? ASM 是一个字节码操作库,它可以直接修改已经存在的 class 文件或者生成 class 文件. ASM ...

  3. android 插桩工具,Android Asm 插桩 教学项目

    AndroidAutoTrack 本项目主要就是给大家一个参考学习的demo而已,主要是打算简化学习gradle插件的成本,以及对于android transform的一次抽象,将增量更新等等进行一次 ...

  4. 【Android 逆向】函数拦截实例 ( ② 插桩操作 | 保存实际函数入口 6 字节数据 | 在插桩的函数入口写入跳转指令 | 构造拼接桩函数 )

    文章目录 前言 一.函数拦截需要的几个参数 二.插桩前先保存实际函数入口 6 字节数据 三.在插桩的函数入口写入跳转指令 | 构造拼接桩函数 前言 [Android 逆向]函数拦截实例 ( 函数拦截流 ...

  5. 介绍自己的一个Android插桩热修复框架项目QuickPatch

    QuickPatch项目地址: https://gitee.com/egg90/QuickPatch 和 https://github.com/eggfly/QuickPatch 同步更新 类似于美团 ...

  6. Android程序员的硬通货——ASM字节码插桩

    作者:享学课堂Lance老师 转载请声明出处! 一.什么是插桩 QQ空间曾经发布的<热修复解决方案>中利用 Javaassist库实现向类的构造函数中插入一段代码解决 CLASS_ISPR ...

  7. aspectj 获取方法入参_深入探索编译插桩技术(二、AspectJ)

    本文来自jsonchao的投稿,个人微信:bcce5360 现如今,编译插桩技术已经深入 Android 开发中的各个领域,而 AOP 技术正是一种高效实现插桩的模式,它的出现正好给处于黑暗中的我们带 ...

  8. 字节码插桩框架ASM(一)

    本文大纲: ams是做什么的 asm使用 1.ASM是做什么的? 简单来说,asm是用来进行字节码插桩的.什么是字节码插桩? 字节码插桩就是修改节码文件(.class). 如同 gson框架是用来做操 ...

  9. 效能优化实践:C/C++单元测试万能插桩工具

    作者:mannywang,腾讯安全平台后台开发 研发效能是一个涉及面很广的话题,它涵盖了软件交付的整个生命周期,涉及产品.架构.开发.测试.运维,每个环节都可能影响顺畅.高质量地持续有效交付.在腾讯安 ...

  10. 工程师必备:C/C 单元测试万能插桩工具

    研发效能是一个涉及面很广的话题,它涵盖了软件交付的整个生命周期,涉及产品.架构.开发.测试.运维,每个环节都可能影响顺畅.高质量地持续有效交付.在腾讯安全平台部实际研发与测试工作中我们发现,代码插桩隔 ...

最新文章

  1. 网络主机托管的特点和优点_主机托管有哪些特点和优点
  2. 自适应中值滤波及实现
  3. java循环单链表比较相等_java的循环单链表
  4. 产品经理晋升后如何带团队?
  5. (王道408考研操作系统)第三章内存管理-第二节3:页面置换算法1
  6. Apache HTTP Server Version 安装简要记录
  7. 关于idea中运行maven项目报错显示找不到包或符号的问题——终极方案
  8. 阿里云运行python_使用阿里云运行python
  9. chrome浏览器安装插件显示程序包无效
  10. nginx自定义404错误页面
  11. scipy.sparse学习
  12. 面向Web服务的游戏设计1:选择适合的Silverlight通信技术
  13. TS战队拿下冠军,微博拿下TS战队
  14. 从成交量变化抓住股票涨跌
  15. 【原理】理解JavaScript中的上下文-对象字面量
  16. ipc开发(liteos hi3518ev200----smaple【如何把hi1131 wifi驱动跟venc驱动整合到一个sample bin文件里面)
  17. U盘“请将磁盘插入U盘”的问题/U盘0字节修复方法
  18. 【数电基础】——逻辑代数运算
  19. 图文教你把PDF格式转换为CAD格式
  20. Mybatis进行批量删除

热门文章

  1. matlab fftshift
  2. 在学习时,遇到in module ssbuild. File is included in 4 contexts
  3. python自动生成sql建表语句
  4. 雷达原理---时频分析--4.小波分解在信号分析中的应用实例
  5. PHP 千图成像,千图成像,教你制作由无数图片组成的人像效果
  6. WordPress收费下载插件Erphpdown v11.0
  7. eclipse运行不了jsp代码,错误代码:couldn't create the java virtual machine. a fatal exception has occurred.
  8. 矢量图代替PNG/JPG
  9. 2022前端HTML5面试题
  10. 105份墨天轮“国产化迁移”精品文档汇总(含TiDB、openGauss、上云等)