阅读此文之前,可以先阅读: http://blog.csdn.net/lmj623565791/article/details/49883661

在此不阐述原理, 只描述实际过程.


1:首先新建一个Android Studio Android 工程(Project)
新建2个类:

public class BugWrapperClass {//存在Bug的类, 需要被一个父类包含public String getBug() {return new BugClass().getBug();}
}
public class BugClass {public String getBug(){return "Is In Bug Class";//用于修复的类}
}
  ((TextView) findViewById(R.id.text_view)).setText( new BugWrapperClass().getBug());//调用的方法, 很简单,不详述了.

2:这个时候,需要替换BugClass.class, 步骤如下:
需要修改项目 Module 的 build.gradle 如下:

apply plugin: 'com.android.application'//注意此处
task('insertClass') << {String classPath = file('build/intermediates/classes/debug')//项目编译class所在目录dodola.patch.PatchClass.process(classPath, project(':InsertLib').buildDir.absolutePath + '/intermediates/classes/debug')//第二个参数是hackdex的class所在目录
}android {compileSdkVersion 23buildToolsVersion "23.0.2"defaultConfig {...}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}//注意此处applicationVariants.all { variant ->variant.dex.dependsOn << insertClass}
}dependencies {...
}

//以下方法在,buildSrc(Moudle中),后面有下载地址;主要最用就是去除 CLASS_ISPREVERIFIED 标识

public class PatchClass {/*** 植入代码* @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)println("buildDir:" + buildDir)println("lib:" + lib)CtClass c1 = classes.getCtClass("com.rsen.BugWrapperClass")//需要去除标识的类if (c1.isFrozen()) {c1.defrost()}println("====添加构造方法====")def constructor1 = c1.getConstructors()[0];constructor1.insertBefore("System.out.println(com.angcyo.insertlib.InsertClass.class);")c1.writeFile(buildDir)}
}

修改完 build.gradle之后,此时运行项目,调用代码时,会报错;
因为 InsertClass.class类,没有加载;
新建一个 lib moudle,新建一个 InsertClass.class类;如下:

public class InsertClass {
//这个类,声明了就可以
}

编译成jar, 再用dx工具,打包成dex类型的jar:
方法如下:

Make Moudle之后,会在
(Moudle根目录)\build\intermediates\bundles\debug\classes.jar 这个目录下生成jar文件在 (Android SDK目录)\build-tools\23.0.2\dx.bat 这个目录有dx工具通过 命令:dx  --dex --output hack_dex.jar hack.jar
可以得到 dex类型的jar

得到dex.jar文件之后,复制到项目assets目录中,通过以下代码,加载InsertClass类

public class RApplication extends Application {@Overridepublic void onCreate() {super.onCreate();File dexPath = new File(getDir("dex", Context.MODE_PRIVATE), "indertlib_dex.jar");HotFix.prepareDex(this.getApplicationContext(), dexPath, "indertlib_dex.jar");HotFix.patch(this, dexPath.getAbsolutePath(), "com.angcyo.insertlib.InsertClass");try {this.getClassLoader().loadClass("com.angcyo.insertlib.InsertClass");} catch (ClassNotFoundException e) {e.printStackTrace();}}
}
//注意要在manifest.xml文件中 使用这个application哦;
//这里需要依赖 HotFix 库moudle,后面有下载地址;

此时,项目可以正常运行了;

3:打补丁
新建一个 补丁 lib moudle;创建需要修补的类

public class BugClass {public String getBug(){return "Is Patch Rsen Class";//此方法已经修改了.}
}

通过之前介绍的方法: 使用dx工具,获取dex类型的jar;
将得到的jar,放在项目assets目录;

4:加载补丁

  //准备补丁,从assert里拷贝到dex里File dexPath = new File(getDir("dex", Context.MODE_PRIVATE), "patch_dex.jar");HotFix.prepareDex(this.getApplicationContext(), dexPath, "patch_dex.jar");HotFix.patch(this, dexPath.getAbsolutePath(), "com.rsen.BugClass");//包名要一致Snackbar.make(findViewById(R.id.text_view), "打补丁完成", Snackbar.LENGTH_LONG).setAction("Action", null).show();//注意,在打补丁之前,先不要调用BugClass类,否则打补丁会失败;

热修复的方法有点复杂,如果有更容易实现的方法,欢迎告之,不胜感激;


文中依赖的2个库项目,和整个项目下载地址:https://github.com/angcyo/HotFixMultiDexDemo

特别提示:gradle的插件版本只能使用 1.3.0; 否则编译会出错!

buildscript {repositories {jcenter()}dependencies {classpath 'com.android.tools.build:gradle:1.3.0' //注意此行}
}

至此: 文章就结束了,如有疑问: QQ群:274306954 欢迎您的加入.

Android--热修复,补丁实战相关推荐

  1. Android 热修复Tinker接入实战

    1 热修复原理 热修复的原理一句话总结就是:就是dex的动态替换. 首先,我们知道PC上的JVM是直接解析class字节码的,而android上的JVM是解析dex文件的,因此Android程序要运行 ...

  2. Android热修复之 阿里开源的热补丁

    1.概述   上一期讲到Android热修复之 - 收集崩溃信息上传至服务器,我们获取到用户手中上线的崩溃信息上传到服务器后该怎么办?如果直接发布版本要用户去下载肯定不乐意.这一期我们来看一下怎么去打 ...

  3. android热补丁作用,Android热修复之 - 阿里开源的热补丁

    这里就有一个概念那就AndFix.apatch补丁用来修复方法,接下来我们看看到底是怎么实现的. 1.2 生成apatch包 假如我们收到了用户上传的崩溃信息,我们改完需要修复的Bug,这个时候就会有 ...

  4. Android 热修复方案Tinker(五) SO补丁加载

    基于Tinker V1.7.5 Android 热修复方案Tinker(一) Application改造 Android 热修复方案Tinker(二) 补丁加载流程 Android 热修复方案Tink ...

  5. Android热修复技术简介

    目录 写在前面 一.热修复简介 1.1.什么是热修复 1.2.热修复有哪些好处 1.3.热修复===万事大吉? 二.热修复常见技术方案对比 2.1.方案介绍 2.2.实现套路 2.3.技术对比 2.4 ...

  6. 微信 Tinker 负责人张绍文关于 Android 热修复直播分享记录

    2019独角兽企业重金招聘Python工程师标准>>> 微信 Tinker 负责人张绍文关于 Android 热修复直播分享记录 来源:微信技术团队的公众号WeMobileDev 热 ...

  7. 深入解析阿里Android热修复技术原理

    前言:本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结 通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简 ...

  8. Android热修复技术原理详解(最新最全版本)

    本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结   通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单 ...

  9. [读书笔记] 深入探索Android热修复技术原理 (手淘技术团队)

    热修复技术介绍 探索之路 最开始,手淘是基于Xposed进行了改进,产生了针对Android Dalvik虚拟机运行时的Java Method Hook技术--Dexposed. 但该方案对于底层Da ...

  10. android热修复原理底层替换,Android 热修复 - 各框架原理学习及对比

    写在开头 从15年开始各技术大佬们开始研究热修复技术,并陆续开源了许多的热修复框架.如 Jasonross 的 Nuwa,美团的 Robust,阿里的 Andfix,腾讯的 Tinker 等等...均 ...

最新文章

  1. mysql oracle 默认事务级别_oracle 默认的事务隔离级别
  2. win2003服务器通过ipsec做防火墙的配置方法
  3. 打jar时包含所有依赖(maven-assembly-plugin)
  4. conn.execute的用法
  5. sqlserver2008r2安装
  6. 【Python基础知识-pycharm版】第六节-控制语句
  7. 又又叒更新,Win 12要来了?
  8. Java经典编程题50道之四十二
  9. 让ListView中的控件失去焦点:android:descendantFocusability=blocksDescendants
  10. k8s安装calico网络插件
  11. 未来10年,软件开发技术的8个发展趋势
  12. Typora 常用快捷键
  13. 【OpenCV 例程200篇】20. 图像的按位运算(cv2.bitwise)
  14. 7-4 房产税费计算2022.6.24
  15. android 目录详解,Android源码目录结构详解
  16. 艺赛旗(RPA)【服务端】修改服务器访问端口
  17. R语言|clusterprofile超几何分布富集分析 GO,KEGG富集分析,循环Fisher‘s test
  18. 数据分析Pandas
  19. npm install 下载依赖包报错以及安装npm install node-sass --save 报错的问题--这里肯定有你想要的答案
  20. ios 内购正式环境_iOS 内购的实现

热门文章

  1. C++ vector<std::tuple<XXX, XXX, XXX>>
  2. ie java被阻止_解决IE屏蔽Java Applet问题的方法
  3. 腾讯Hardcoder Android通讯框架简介
  4. 解决:RuntimeError: CUDA out of memory. Tried to allocate 64.00 MiB (GPU 0; 4.00 GiB total capacity; 2
  5. 无监督学习之聚类方法
  6. 局部异常因子算法-Local Outlier Factor(LOF)
  7. matlab求一个数的位数字,matlab求一个三位整数各位数字的立方和等于该数本身则称为...
  8. 阿里携“骑呗”入局共享单车,好戏即将开始
  9. 自制COCO 实例分割dataset并测试效果(从采集到测试)
  10. node python做游戏服务哪个适合做服务端_当前的几种开源游戏服务端介绍