Android 插桩入门
==
通过gradle的插件完成android的插桩入门
- 首先学习编写一个简单的gradle插件
- 通过composing builds 方法引入这个插件方便调试
- 自己实现Transform方法来实现自己的插桩功能
- 通过Asm outline插件完成学习插桩代码
参考
本文中的代码通过参考以下的文章和仓库来学习
- [AndroidAutoTrack](()
- [Hunter](()
- [gradle脚本调试](()
- [ASM插入方法](()
完成一个简单的插件
本文设计到的代码都在这个项目中的AsmPlugin目录下[代码](()
- 首先创建一个工程,这里是AsmPlugin,我是在PluginDemo的工程下。因为我希望后面调试的时候,可以很容易的把这俩工程关联起来
- AsmPlugin是一个插件工程,是新建了一个android工程,然后根据AndroidAutoTrack里面的插件模板修改相应的build.gradle文件来完成的
- 在AsmPlugin中建立比较简单的插件模板,我引入了AndroidAutoTrack中的基类插件库,然后自己增加一个简单的Demo
- 关联这个插件到PluginDemo中。
建立一个插件工程
我是建立一个普通的的Android工程,修改相应的文件完成插件的改造, 新建一个空的Android模块,这里是SimplePlugin 修改模块中的build.gradle文件 插件的gradle文件如下
apply plugin: ‘groovy’
apply plugin: ‘kotlin’
apply plugin: ‘java-gradle-plugin’
apply plugin: ‘kotlin-kapt’
//apply from: ‘…/upload_bintray.gradle’
dependencies {
implementation gradleApi()
implementation localGroovy()
implementation project(“:BasePlugin”)
implementation ‘commons-io:commons-io:2.6’
implementation ‘org.javassist:javassist:3.27.0-GA’
implementation ‘com.google.auto.service:auto-service:1.0-rc6’
kapt “com.google.auto.service:auto-service:1.0-rc6”
}
gradlePlugin {
plugins {
version {
// 在 app 模块需要通过 id 引用这个插件
id = ‘simple-plugin’
// 实现这个插件的类的路径
implementationClass = ‘com.bn.simpleplugin.SimplePlugin’
}
}
}
- 其中的 id为插件的名称,跟引用这个插件时的名称对应
- implementationClass 是指定插件入口类,需要实现gradle的Plugin类
文件结构如下
完成简单的插件模块
增加两个类SimplePlugin类和SimpleTransform类 SimplePlugin.kt
class SimplePlugin : Plugin {
override fun apply(p0: Project) {
val appExtension = p0.extensions.getByType(
AppExtension::class.java
)
appExtension.registerTransform(SimpleTransform(p0))
}
}
SimpleTransform.kt
class SimpleTransform(private val project: Project):Transform() {
override fun getName(): String {
return “SimpleTransform”
}
override fun getInputTypes(): Set<QualifiedContent.ContentType> {
return TransformManager.CONTENT_JARS
}
override fun getScopes(): MutableSet
override fun isIncremental(): Boolean {
return true
}
@Throws(TransformException::class, InterruptedException::class, IOException::class)
override fun transform(transformInvocation: TransformInvocation) {
val injectHelper = AutoTrackHelper()
val baseTransform = BaseTransform(transformInvocation, object : TransformCallBack {
override fun process(className: String, classBytes: ByteArray?): ByteArray? {
if(TestAsm.needHandle(className)){
return TestAsm.handleTestClass3(classBytes!!)
}
if (ClassUtils.checkClassName(className)) {
try {
return injectHelper.modifyClass(classBytes!!)
} catch (e: IOException) {
e.printStackTrace()
}
}
return null
}
})
baseTransform.startTransform()
}
}
在transform方法中,我们可以拿到所有需要打包的类,根据自己的需要来完成插桩。
关联插件工程到主工程
修改主工程的根目录的settings.gradle文件,通过includeBuild关键字完成两个工程的关联,这个是为了方便后面定义的插件,能够去插件仓库中找到
修改主工程的根目录下的build.gradle文件。来完成插件定义
dle文件,通过includeBuild关键字完成两个工程的关联,这个是为了方便后面定义的插件,能够去插件仓库中找到
[外链图片转存中…(img-GJNMXjiJ-1650771031950)]
修改主工程的根目录下的build.gradle文件。来完成插件定义
Android 插桩入门相关推荐
- 介绍自己的一个Android插桩热修复框架项目QuickPatch
QuickPatch项目地址: https://gitee.com/egg90/QuickPatch 和 https://github.com/eggfly/QuickPatch 同步更新 类似于美团 ...
- 吹爆系列:Android 插桩之美,全面掌握~
作者:阿明的小蝴蝶 插桩 插桩是什么?你在开发中有用过插桩的技术吗? 所谓的插桩就是在代码编译期间修改已有的代码或者生成新代码. 插桩具体在编译的哪个流程介入呢? 插桩的作用与场景 代码生成 代码监控 ...
- Android 插桩之美,全面掌握
链接: https://www.yuque.com/docs/share/b49a3274-17d9-4c87-815a-4a13ab72e4e0 1 插桩 插桩是什么?你在开发中有用过插桩的技术吗? ...
- android 插桩工具,Android Asm 插桩 教学项目
AndroidAutoTrack 本项目主要就是给大家一个参考学习的demo而已,主要是打算简化学习gradle插件的成本,以及对于android transform的一次抽象,将增量更新等等进行一次 ...
- android逆向01:修改apk的资源文件,smali插桩
前提: 有需求才有实现. android逆向能干什么?去除游戏中的广告,跳过各种支付达到付费效果,人为干预简化游戏流程直奔主题,无限增加各种付费道具,等等:当然可以对自己的apk进行逆向的逆向进行加固 ...
- 【Android 逆向】函数拦截实例 ( ② 插桩操作 | 保存实际函数入口 6 字节数据 | 在插桩的函数入口写入跳转指令 | 构造拼接桩函数 )
文章目录 前言 一.函数拦截需要的几个参数 二.插桩前先保存实际函数入口 6 字节数据 三.在插桩的函数入口写入跳转指令 | 构造拼接桩函数 前言 [Android 逆向]函数拦截实例 ( 函数拦截流 ...
- 【Android 逆向】函数拦截 ( ARM 架构下的插桩拦截 | 完整代码示例 )
文章目录 一.ARM 架构下的插桩拦截 二.完整代码示例 一.ARM 架构下的插桩拦截 ARM 架构下的跳转指令 : 下面的二进制数都是十六进制数 ; 323232 位指令 ; 04 F0 1F E5 ...
- 【Android 逆向】函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )
文章目录 一.GOT 表拦截与插桩拦截 二.插桩拦截简介 三.插桩拦截涉及的 ARM 和 x86 中的跳转指令 一.GOT 表拦截与插桩拦截 函数拦截有 222 种方式 : 使用 GOT 表进行函数拦 ...
- 【字节码插桩】Android 打包流程 | Android 中的字节码操作方式 | AOP 面向切面编程 | APT 编译时技术
文章目录 一.Android 中的 Java 源码打包流程 1.Java 源码打包流程 2.字符串常量池 二.Android 中的字节码操作方式 一.Android 中的 Java 源码打包流程 Ja ...
- 【Android 插件化】“ 插桩式 “ 插件化框架 ( 注入上下文的使用 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
最新文章
- Lync Server 2013 部署前端池支持NLB吗?
- 一键生成Vue.js + Web API前后端集成项目
- 初级Java开发工程师!绝密文档,面试手册全面突击!!!秋招已经到来
- tcp retransmission原因
- TensorFlow losses
- ++[[]][+[]]+[+[]] == 10 //true
- 测试一下你对IP地址的掌握水平
- Qt加载RGB内存数据,并显示彩色图
- 微软云平台 Azure简介 (三)Windows Azure 存储概述
- JSP Overview
- android studio拼音转汉字,汉字转拼音,TinyPinyin、Pinyin4j与JPinyin哪个库更快
- 我怎样学会英语的--钟道隆逆向英语学习法1
- Google Earth Engine——从 Python 中的数字高程模型计算坡度和坡向
- CC2530+RFX2401启用功放过程小结
- 关于Vue的再次试炼
- 淘淘商城---8.11
- matlab中set position,Matlab中set函数
- CCD摄像机主要技术参数解释
- matlab程序模拟微信抢红包,微信红包算法MATLAB实现
- 1978年,我是如何每月赚到1500元!