==

通过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 插桩入门相关推荐

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

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

  2. 吹爆系列:Android 插桩之美,全面掌握~

    作者:阿明的小蝴蝶 插桩 插桩是什么?你在开发中有用过插桩的技术吗? 所谓的插桩就是在代码编译期间修改已有的代码或者生成新代码. 插桩具体在编译的哪个流程介入呢? 插桩的作用与场景 代码生成 代码监控 ...

  3. Android 插桩之美,全面掌握

    链接: https://www.yuque.com/docs/share/b49a3274-17d9-4c87-815a-4a13ab72e4e0 1 插桩 插桩是什么?你在开发中有用过插桩的技术吗? ...

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

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

  5. android逆向01:修改apk的资源文件,smali插桩

    前提: 有需求才有实现. android逆向能干什么?去除游戏中的广告,跳过各种支付达到付费效果,人为干预简化游戏流程直奔主题,无限增加各种付费道具,等等:当然可以对自己的apk进行逆向的逆向进行加固 ...

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

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

  7. 【Android 逆向】函数拦截 ( ARM 架构下的插桩拦截 | 完整代码示例 )

    文章目录 一.ARM 架构下的插桩拦截 二.完整代码示例 一.ARM 架构下的插桩拦截 ARM 架构下的跳转指令 : 下面的二进制数都是十六进制数 ; 323232 位指令 ; 04 F0 1F E5 ...

  8. 【Android 逆向】函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )

    文章目录 一.GOT 表拦截与插桩拦截 二.插桩拦截简介 三.插桩拦截涉及的 ARM 和 x86 中的跳转指令 一.GOT 表拦截与插桩拦截 函数拦截有 222 种方式 : 使用 GOT 表进行函数拦 ...

  9. 【字节码插桩】Android 打包流程 | Android 中的字节码操作方式 | AOP 面向切面编程 | APT 编译时技术

    文章目录 一.Android 中的 Java 源码打包流程 1.Java 源码打包流程 2.字符串常量池 二.Android 中的字节码操作方式 一.Android 中的 Java 源码打包流程 Ja ...

  10. 【Android 插件化】“ 插桩式 “ 插件化框架 ( 注入上下文的使用 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. Lync Server 2013 部署前端池支持NLB吗?
  2. 一键生成Vue.js + Web API前后端集成项目
  3. 初级Java开发工程师!绝密文档,面试手册全面突击!!!秋招已经到来
  4. tcp retransmission原因
  5. TensorFlow losses
  6. ++[[]][+[]]+[+[]] == 10 //true
  7. 测试一下你对IP地址的掌握水平
  8. Qt加载RGB内存数据,并显示彩色图
  9. 微软云平台 Azure简介 (三)Windows Azure 存储概述
  10. JSP Overview
  11. android studio拼音转汉字,汉字转拼音,TinyPinyin、Pinyin4j与JPinyin哪个库更快
  12. 我怎样学会英语的--钟道隆逆向英语学习法1
  13. Google Earth Engine——从 Python 中的数字高程模型计算坡度和坡向
  14. CC2530+RFX2401启用功放过程小结
  15. 关于Vue的再次试炼
  16. 淘淘商城---8.11
  17. matlab中set position,Matlab中set函数
  18. CCD摄像机主要技术参数解释
  19. matlab程序模拟微信抢红包,微信红包算法MATLAB实现
  20. 1978年,我是如何每月赚到1500元!

热门文章

  1. 89c52如何控制ad9833输出正弦波,三角波,方波。
  2. 【计算方法】牛顿插值法
  3. 科学计算机怎么直接显示10的多少次方,科学计算器怎么开n次方
  4. 微信小程序开发工具使用方法
  5. Android系统源码编译
  6. C# Emoji在Web端显示
  7. 2017年电力职称计算机考试题,2017年职称计算机考试Excel试题(1)
  8. android高德地图热力图,没有编程基础也可通过高德地图完成炫酷的热力图分析...
  9. arp表老化时间及其修改
  10. PMP课程笔记:第12章 项目采购管理