Android--热修复,补丁实战
阅读此文之前,可以先阅读: 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--热修复,补丁实战相关推荐
- Android 热修复Tinker接入实战
1 热修复原理 热修复的原理一句话总结就是:就是dex的动态替换. 首先,我们知道PC上的JVM是直接解析class字节码的,而android上的JVM是解析dex文件的,因此Android程序要运行 ...
- Android热修复之 阿里开源的热补丁
1.概述 上一期讲到Android热修复之 - 收集崩溃信息上传至服务器,我们获取到用户手中上线的崩溃信息上传到服务器后该怎么办?如果直接发布版本要用户去下载肯定不乐意.这一期我们来看一下怎么去打 ...
- android热补丁作用,Android热修复之 - 阿里开源的热补丁
这里就有一个概念那就AndFix.apatch补丁用来修复方法,接下来我们看看到底是怎么实现的. 1.2 生成apatch包 假如我们收到了用户上传的崩溃信息,我们改完需要修复的Bug,这个时候就会有 ...
- Android 热修复方案Tinker(五) SO补丁加载
基于Tinker V1.7.5 Android 热修复方案Tinker(一) Application改造 Android 热修复方案Tinker(二) 补丁加载流程 Android 热修复方案Tink ...
- Android热修复技术简介
目录 写在前面 一.热修复简介 1.1.什么是热修复 1.2.热修复有哪些好处 1.3.热修复===万事大吉? 二.热修复常见技术方案对比 2.1.方案介绍 2.2.实现套路 2.3.技术对比 2.4 ...
- 微信 Tinker 负责人张绍文关于 Android 热修复直播分享记录
2019独角兽企业重金招聘Python工程师标准>>> 微信 Tinker 负责人张绍文关于 Android 热修复直播分享记录 来源:微信技术团队的公众号WeMobileDev 热 ...
- 深入解析阿里Android热修复技术原理
前言:本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结 通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简 ...
- Android热修复技术原理详解(最新最全版本)
本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结 通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单 ...
- [读书笔记] 深入探索Android热修复技术原理 (手淘技术团队)
热修复技术介绍 探索之路 最开始,手淘是基于Xposed进行了改进,产生了针对Android Dalvik虚拟机运行时的Java Method Hook技术--Dexposed. 但该方案对于底层Da ...
- android热修复原理底层替换,Android 热修复 - 各框架原理学习及对比
写在开头 从15年开始各技术大佬们开始研究热修复技术,并陆续开源了许多的热修复框架.如 Jasonross 的 Nuwa,美团的 Robust,阿里的 Andfix,腾讯的 Tinker 等等...均 ...
最新文章
- mysql oracle 默认事务级别_oracle 默认的事务隔离级别
- win2003服务器通过ipsec做防火墙的配置方法
- 打jar时包含所有依赖(maven-assembly-plugin)
- conn.execute的用法
- sqlserver2008r2安装
- 【Python基础知识-pycharm版】第六节-控制语句
- 又又叒更新,Win 12要来了?
- Java经典编程题50道之四十二
- 让ListView中的控件失去焦点:android:descendantFocusability=blocksDescendants
- k8s安装calico网络插件
- 未来10年,软件开发技术的8个发展趋势
- Typora 常用快捷键
- 【OpenCV 例程200篇】20. 图像的按位运算(cv2.bitwise)
- 7-4 房产税费计算2022.6.24
- android 目录详解,Android源码目录结构详解
- 艺赛旗(RPA)【服务端】修改服务器访问端口
- R语言|clusterprofile超几何分布富集分析 GO,KEGG富集分析,循环Fisher‘s test
- 数据分析Pandas
- npm install 下载依赖包报错以及安装npm install node-sass --save 报错的问题--这里肯定有你想要的答案
- ios 内购正式环境_iOS 内购的实现
热门文章
- C++ vector<std::tuple<XXX, XXX, XXX>>
- ie java被阻止_解决IE屏蔽Java Applet问题的方法
- 腾讯Hardcoder Android通讯框架简介
- 解决:RuntimeError: CUDA out of memory. Tried to allocate 64.00 MiB (GPU 0; 4.00 GiB total capacity; 2
- 无监督学习之聚类方法
- 局部异常因子算法-Local Outlier Factor(LOF)
- matlab求一个数的位数字,matlab求一个三位整数各位数字的立方和等于该数本身则称为...
- 阿里携“骑呗”入局共享单车,好戏即将开始
- 自制COCO 实例分割dataset并测试效果(从采集到测试)
- node python做游戏服务哪个适合做服务端_当前的几种开源游戏服务端介绍