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


一、Android常用的能动态改变代码逻辑的方法有两种

1. Java hook(反射,动态代理)

android是基于java,同时也就有了反射的概念,动态去加载代码,同时动态代理也可以实现,但比较难理解,网络上讲得也很多了,这里就不讲。

2. 插桩(编译插桩,插件化插桩)

如果是按照插桩时机,在编译时候的就是编译插桩,然而,有些时候需要在程序运行的时候动态加载一些东西。我理解的差异性是插桩的代码是跟原来程序是分开的,在一个特定的时机与原有程序合二为一。

二、从xposed框架到编译插桩

记得去年曾经分享过xposed框架的使用,那是在系统层面去hook住方法,不足之处是系统要先刷入框架包,优点是可以对该系统里面所有的app进行hook

是否可以对我们自己的应用进行代码的修改?比如上面提到的有java hook,还有编译插桩:下面是比较流行的框架

  1. aspectJ (面向切面框架) 跟普通代码一样,理解容易

  2. Asm (操作字节码框架)需要使用asm字节码,相对复杂

而插桩的应用场景:apm,无埋点

三、比较一下aspectJ 与asm分别插桩后的代码

1. aspectJ

2. asm

通过上面两个图可以看出插桩后的代码还是有所区别,aspectJ采用插入方法的方式,这种代码混淆的时候一定要注意,不然会出现找不到方法名。而asm采用直接把差异代码嵌入原有的方法里,显然执行起来更加高效。

asm实现的插桩

1. 原代码

2. 字节码

3. asm代码

可以看出代码相对来说是比较复杂的,可能需要工具才能正确去编写asm代码,比如idea插件bytecode outline

asm在编译打包的哪个步骤插桩呢

如图所示:在编译成.class文件后,执行asm步骤,对class文件进行处理。而后就把各种编译后的文件打包进dex文件的过程。

demo-采用asm为某个方法插入代码

一个简单的demo,对一个方法进行asm插桩

https://github.com/ydpzg/TestPlugin


附录

自定义gradle plugin

https://guides.gradle.org/writing-gradle-plugins/

https://docs.gradle.org/current/userguide/custom_plugins.html

Asm 字节码插件: Asm Bytecode Outline

java字节码: javac Apple.java javap -verbose Apple.class

转载于:https://my.oschina.net/kalengo/blog/3084577

Android编译插桩相关推荐

  1. 深入探索编译插桩技术(四、ASM 探秘,android中文api文档

    从字节码的视角中,一个 Java 类由很多组件凝聚而成,而这之中便包括超类.接口.属性.域和方法等等.当我们在使用 ASM 进行操控时,可以将它们视为一个个与之对应的事件.因此 ASM 提供了一个 类 ...

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

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

  3. 深入探索编译插桩技术(二、AspectJ)

    前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 现如今,编译插桩技术已经深入 Android 开发中的各个领域,而 AOP 技术正是一种高效 ...

  4. 深入探索编译插桩技术(一、编译基础)

    前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 现如今,Gradle + 编译插桩 的应用场景越来越多,无论是 各种性能优化中的插件工具制作 ...

  5. 深入探索编译插桩技术(四、ASM 探秘)

    前言 成为一名优秀的Android开发,需要一份完备的 知识体系,在这里,让我们一起成长为自己所想的那样~. 在 <深入探索编译插桩技术(二.AspectJ)>:juejin.im/pos ...

  6. Android ASM 插桩实践

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

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

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

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

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

  9. 【愚公系列】2023年06月 移动安全之安卓逆向(插桩及栈分析)

    文章目录 前言 一.插桩及栈分析 1.概念简介 2.Android Killer插桩 二.栈跟踪及分析 1.DDMS工具介绍 1.1 设备信息窗口 1.2 过滤器窗口 1.3 功能窗口 1.4 信息输 ...

最新文章

  1. XSS挑战之旅闯关笔记
  2. odoo tree视图 当页不弹窗显示方法
  3. android自定义控件 几种方式总结
  4. PyInstaller用法
  5. PHP登录表单提交前端验证,form表单提交前先用ajax进行验证(前端)
  6. Android书页翻页设计:android-flip
  7. html读取json换行无效,前端Json换行显示
  8. 巧用XP的Hosts文件 防止误进恶意网站
  9. .Net报文请求转义
  10. java mysql insert id_MySQL和Java-获取最后插入值的ID(JDBC)[重复]
  11. 爱情的诗·11~15节
  12. 已解决:axios 发送post请求,报403错误
  13. 自用力扣笔记备忘录——数组tag简单题
  14. win10 linux分区大小调整大小,如何在windows系统中调整分区大小(包括windows10/8/7)...
  15. Python pip 常用命令
  16. MP4和HR-HDTV压制教程
  17. VAPS XT开发入门教程02:安装配置
  18. java后台Controller下载文件方法
  19. uniapp引入阿里云短信业务
  20. 将中文的0-9数字编码转化为ascii

热门文章

  1. 定值保险计算举例_定值保险
  2. Win10 如何修改默认软件安装路径
  3. 如何看懂公司的财务报表(3)
  4. Oracle 11g 单机安装 —— 文件系统
  5. 如何用进度猫思维导图做项目管理?
  6. java正则不能输入汉字_求一个正则表达式只输入字母或数字或汉字,要过滤特殊字符...
  7. 浅析修理厂的5s管理内容及效用
  8. 这场不一样的2017杭州云栖大会!我们在等你!
  9. r语言绘制雷达图_用r绘制雷达蜘蛛图
  10. 智能全景汽车3D建模VR模型虚拟交互三维在线展示