Android编译插桩
背景:这一次分享一下关于android编译插桩这个话题,在正常编写代码实现程序的逻辑外,还要使用一点点黑科技,拿起操作代码无所不能的武器。
一、Android常用的能动态改变代码逻辑的方法有两种
1. Java hook(反射,动态代理)
android是基于java,同时也就有了反射的概念,动态去加载代码,同时动态代理也可以实现,但比较难理解,网络上讲得也很多了,这里就不讲。
2. 插桩(编译插桩,插件化插桩)
如果是按照插桩时机,在编译时候的就是编译插桩,然而,有些时候需要在程序运行的时候动态加载一些东西。我理解的差异性是插桩的代码是跟原来程序是分开的,在一个特定的时机与原有程序合二为一。
二、从xposed框架到编译插桩
记得去年曾经分享过xposed框架的使用,那是在系统层面去hook住方法,不足之处是系统要先刷入框架包,优点是可以对该系统里面所有的app进行hook
是否可以对我们自己的应用进行代码的修改?比如上面提到的有java hook,还有编译插桩:下面是比较流行的框架
aspectJ (面向切面框架) 跟普通代码一样,理解容易
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编译插桩相关推荐
- 深入探索编译插桩技术(四、ASM 探秘,android中文api文档
从字节码的视角中,一个 Java 类由很多组件凝聚而成,而这之中便包括超类.接口.属性.域和方法等等.当我们在使用 ASM 进行操控时,可以将它们视为一个个与之对应的事件.因此 ASM 提供了一个 类 ...
- aspectj 获取方法入参_深入探索编译插桩技术(二、AspectJ)
本文来自jsonchao的投稿,个人微信:bcce5360 现如今,编译插桩技术已经深入 Android 开发中的各个领域,而 AOP 技术正是一种高效实现插桩的模式,它的出现正好给处于黑暗中的我们带 ...
- 深入探索编译插桩技术(二、AspectJ)
前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 现如今,编译插桩技术已经深入 Android 开发中的各个领域,而 AOP 技术正是一种高效 ...
- 深入探索编译插桩技术(一、编译基础)
前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 现如今,Gradle + 编译插桩 的应用场景越来越多,无论是 各种性能优化中的插件工具制作 ...
- 深入探索编译插桩技术(四、ASM 探秘)
前言 成为一名优秀的Android开发,需要一份完备的 知识体系,在这里,让我们一起成长为自己所想的那样~. 在 <深入探索编译插桩技术(二.AspectJ)>:juejin.im/pos ...
- Android ASM 插桩实践
上一章知道了如何获取 class 文件,那该如何进行插桩呢?本章告诉你! 什么是 ASM? ASM 是一个字节码操作库,它可以直接修改已经存在的 class 文件或者生成 class 文件. ASM ...
- android 插桩工具,Android Asm 插桩 教学项目
AndroidAutoTrack 本项目主要就是给大家一个参考学习的demo而已,主要是打算简化学习gradle插件的成本,以及对于android transform的一次抽象,将增量更新等等进行一次 ...
- 介绍自己的一个Android插桩热修复框架项目QuickPatch
QuickPatch项目地址: https://gitee.com/egg90/QuickPatch 和 https://github.com/eggfly/QuickPatch 同步更新 类似于美团 ...
- 【愚公系列】2023年06月 移动安全之安卓逆向(插桩及栈分析)
文章目录 前言 一.插桩及栈分析 1.概念简介 2.Android Killer插桩 二.栈跟踪及分析 1.DDMS工具介绍 1.1 设备信息窗口 1.2 过滤器窗口 1.3 功能窗口 1.4 信息输 ...
最新文章
- XSS挑战之旅闯关笔记
- odoo tree视图 当页不弹窗显示方法
- android自定义控件 几种方式总结
- PyInstaller用法
- PHP登录表单提交前端验证,form表单提交前先用ajax进行验证(前端)
- Android书页翻页设计:android-flip
- html读取json换行无效,前端Json换行显示
- 巧用XP的Hosts文件 防止误进恶意网站
- .Net报文请求转义
- java mysql insert id_MySQL和Java-获取最后插入值的ID(JDBC)[重复]
- 爱情的诗·11~15节
- 已解决:axios 发送post请求,报403错误
- 自用力扣笔记备忘录——数组tag简单题
- win10 linux分区大小调整大小,如何在windows系统中调整分区大小(包括windows10/8/7)...
- Python pip 常用命令
- MP4和HR-HDTV压制教程
- VAPS XT开发入门教程02:安装配置
- java后台Controller下载文件方法
- uniapp引入阿里云短信业务
- 将中文的0-9数字编码转化为ascii