Android热补丁动态修复实践

这篇博客介绍了Android热补丁的实现过程,包括创建AntilazyLoad类,将其打包为hack_dex.jar,使用javassist进行动态代码注入,以及如何在build.gradle中配置自动注入。文章详细阐述了如何利用javassist工具在构建过程中植入代码,以及如何在不同Android版本上加载hack_dex.jar。此外,还提到了hotfixlib模块的核心代码,用于将patch_dex.jar动态插入到dexElements中。
摘要由CSDN通过智能技术生成

创建hackdex模块并创建AntilazyLoad类


看图就好了:

hackdex模块

将AntilazyLoad单独打成hack_dex.jar包


通过以下命令来实现:

jar cvf hack.jar com.devilwwj.hackdex/*

这个命令会将AntilazyLoad类打包成hack.jar文件

dx --dex --output hack_dex.jar hack.jar

这个命令使用dx工具对hack.jar进行转化,生成hack_dex.jar文件

dx工具在我们的sdk/build-tools下

dx工具

最终我们把hack_dex.jar文件放到项目的assets目录下:

hack_dex.jar

使用javassist实现动态代码注入


创建buildSrc模块,这个项目是使用Groovy开发的,需要配置Groovy SDK才可以编译成功。

在这里下载Groovy SDK:http://groovy-lang.org/download.html,下载之后,配置项目user Library即可。

它里面提供了一个方法,用来向指定类的构造函数注入代码:

/**

  • 植入代码

  • @param buildDir 是项目的build class目录,就是我们需要注入的class所在地

  • @param lib 这个是hackdex的目录,就是AntilazyLoad类的class文件所在地

*/

public static void process(String buildDir, String lib) {

println(lib);

ClassPool classes = ClassPool.getDefault()

classes.appendClassPath(buildDir)

classes.appendClassPath(lib)

// 将需要关联的类的构造方法中插入引用代码

CtClass c = classes.getCtClass(“com.devilwwj.hotfixdemo.BugClass”)

if (c.isFrozen()) {

c.defrost()

}

println(“添加构造方法”)

def constructor = c.getConstructors()[0];

constructor.insertBefore(“System.out.println(com.devilwwj.hackdex.AntilazyLoad.class);”)

c.writeFile(buildDir)

CtClass c1 = classes.getCtClass(“com.devilwwj.hotfixdemo.LoadBugClass”)

if (c1.isFrozen()) {

c1.defrost()

}

println(“添加构造方法”)

def constructor1 = c1.getConstructors()[0];

constructor1.insertBefore(“System.out.println(com.devilwwj.hackdex.AntilazyLoad.class);”)

c1.writeFile(buildDir)

}

配置app项目的build.gradle


上一小节创建的module提供相应的方法来让我们对项目的类进行代码注入,我们需要在build.gradle来配置让它自动来做这件事:

apply plugin: ‘com.android.application’

task(‘processWithJavassist’) << {

String classPath = file(‘build/intermediates/classes/debug’)// 项目编译class所在目录

com.devilwwj.patch.PatchClass.process(classPath, project(‘:hackdex’).buildDir.absolutePath + “/intermediates/classes/debug”) // 第二个参数是hackdex的class所在目录

}

android {

compileSdkVersion 23

buildToolsVersion “23.0.1”

defaultConfig {

applicationId “com.devilwwj.hotfixdemo”

minSdkVersion 14

targetSdkVersion 23

versionCode 1

versionName “1.0”

}

buildTypes {

debug {

minifyEnabled false

proguardFiles getDefaultProguardFile(‘proguard-android.txt’),

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值