Android RocooFix热修复动态加载框架介绍
RocooFix
Another hotfix framework
之前的HotFix项目太过简单,也有很多同学用Nuwa遇到很多问题,作者也不再修复,所以重新构建了一套工具。

Bugfix
- 2016-06-26
- 增加了 Android N (API 24)的支持
- 增加了关联引用的补丁制作模块,解决 ART NativeCode address 位置错误引起的崩溃问题,但是会造成包大小的增加,后期会支持微信提出的 Dexdiff 技术
Features
- 支持两种模式:
- 静态修复某种情况下需要重启应用。
- 动态修复,无需重启应用即可生效。
- 支持DalvikVM和ART VM
- 制作补丁更加方便
- 支持
com.android.tools.build:gradle:1.3.0->com.android.tools.build:gradle:2.1.0(解决了Nuwa
这个issue) - 支持混淆和Mulitdex
- 无需关注
hash.txt和mapping.txt文件的生成和保存
动态修复使用的是Lody的Legend项目,由于Dalvik的CLASS验证导致这个HOOK框架在Dalvik虚拟机下会崩溃,但是在RocooFix框架里正好可以欺骗这个验证,所以在Dalvik下不会出现原来的崩溃问题。具体情况可以参照这篇日志
TODO
- 补充单测
- 兼容性测试
- Legend 泄露问题
- 目录规则调整
- 上传lib库到maven
Use
public class RocooApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
//打补丁
RocooFix.init(this);
}
}
//方案1:静态启用,一般在Application里加载补丁
/**
* 从Assets里取出补丁,一般用于测试
*
* @param context
* @param assetName
*/
RocooFix.initPathFromAssets(Context context, String assetName);
/**
* 从指定目录加载补丁
* @param context
* @param dexPath
*/
RocooFix.applyPatch(Context context, String dexPath);
//方案2:动态打补丁,立即生效,有性能问题,适用于补丁方法数较少的情况,建议在ART虚拟机里启用该模式
/**
* 从Asset里加载补丁,一般用于本地测试
* @param context
* @param assetName
*/
RocooFix.initPathFromAssetsRuntime(Context context, String assetName) ;
/**
* 从指定目录加载补丁
* @param context
* @param dexPath
*/
RocooFix.applyPatchRuntime(Context context, String dexPath) ;
Configuration
- 在root的
build.gradle增加如下内容:
repositories {
jcenter()
maven {
url "http://dl.bintray.com/dodola/maven"
}
}
dependencies {
classpath 'com.dodola:rocoofix:1.1’
}
- 在你项目的
build.gradle文件里添加如下配置
apply plugin: 'com.dodola.rocoofix'
repositories {
maven {
url "http://dl.bintray.com/dodola/maven"
}
}
rocoo_fix {
includePackage = ['com/dodola/rocoofix']//限制需要制作补丁的package
excludeClass = ['BaseApplication.class']//将不需要加到patch里的类写在这里
preVersionPath = '1'//注意:此项属性只在需要制作补丁的时候才需开启!!如果不需要制作补丁则需要去掉此项
enable = true//注意:关掉此项会无法生成Hash.txt文件
scanref=true//默认为 false,开启这个选项会将与补丁 class 相引用的 class 都打入包中来解决 ART 虚拟机崩溃问题,功能 Beta 中
}
dependencies {
compile 'com.dodola:rocoo:1.0'
}
这里主要介绍一下preVersionPath这个属性的作用。
rocoo_fix将制作补丁的步骤透明化,用户无需手动备份hash.txt文件,插件会自动根据当前的versionCode生成hash.txt和mapping.txt文件到指定目录,比如:
上一个版本发布的时候版本号是1,那么生成的文件会放在app源码目录/rocooFix/version1/[debug]|[release]的目录下,如果需要制作补丁那么在配置里指定preVersionPath 属性,它的值是上一个版本的版本号,这里的值是1,
然后将build.gradle的versionCode的号码修改,这里修改成2,只要和之前的版本不同就可以,没有具体值的要求
Proguard
-keep class com.dodola.rocoofix.** {*;}
-keep class com.lody.legend.** {*;}
Build
Patch
下面演示一下使用项目demo生成补丁的制作过程
- 假如我们需要打补丁的文件是
package com.dodola.rocoosample;
public class HelloHack {
public String showHello() {
return "hello world";
}
}
此时build.gradle里的VersionCode是1

- 运行一次应用,这时会在
app的目录下生成如下文件:

这里可以看做是我们已经发布版本的hash.txt
- 假设我们需要修复步骤1 里的
showHello方法,修改如下:
package com.dodola.rocoosample;
public class HelloHack {
public String showHello() {
return "hello Hack";//此处修复,补丁加载后该方法返回hello hack
}
}
- 修改build.gradle 文件里
rocoo_fix项,让其执行patch 的task,配置如下
rocoo_fix {
preVersionPath = '1'//注意:这里指定的是需要打补丁的VersionCode
enable = true
}
- 修改当前项目的
versionCode为2,说明这个是一个升级fix版本。

正常发布应用,此时会在下图所示的路径中生成补丁文件:

我们可以反编译一下来确认补丁是否正常

相关项目
Android RocooFix热修复动态加载框架介绍的更多相关文章
- Android HotFix动态加载框架介绍
HotFix(Deprecated) https://github.com/dodola/HotFix 请关注 RocooFix 我重新写了一个RocooFix框架,解决了Nuwa因为Gradle1. ...
- Android动态加载框架汇总
几种动态加载的比较 1.Tinker 用途:热修复 GitHub地址:https://github.com/Tencent/tinker/ 使用:http://www.jianshu.com/p/f6 ...
- 携程Android App的插件化和动态加载框架
携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...
- 动态加载框架DL分析
动态加载框架DL分析 插件化开发,主要解决三个问题1.动态加载未安装的apk,dex,jar等文件2.activity生命周期的问题,还有service3.Android的资源调用的问题 简单说一下怎 ...
- APK动态加载框架(DL)解析
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/39937639 (来自singwhatiwanna的csdn博客) 前言 好久 ...
- Android 插件技术:动态加载dex技术初探
1.Android动态加载dex技术初探 http://blog.csdn.net/u013478336/article/details/50734108 Android使用Dalvik虚拟机加载可执 ...
- Android中常见的图片加载框架
图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行 ...
- Android 插件开发,做成动态加载
为什么需要插件开发: 相信你对Android方法数不能超过65K的限制应该有所耳闻,随着应用程序功能不断的丰富,总有一天你会遇到一个异常: Conversion to Dalvik format fa ...
- 热更新--动态加载framework
1.准备工作:先自己封装一个framework:http://www.cnblogs.com/sunjianfei/p/5781863.html 2.把封装好的framework压缩成zip,放到本地 ...
随机推荐
- 《NET 设计规范》第 2 章 框架设计基础
<NET 设计规范>第 2 章 框架设计基础 要设计功能强大又易于使用的框架. 要理解广大开发人员并有针对性地为他们设计框架. 要理解各种编程语言,并为他们设计框架. 2.1 渐进框架 2 ...
- 布隆过滤器(BloomFilter)持久化
摘要 Bloomfilter运行在一台机器的内存上,不方便持久化(机器down掉就什么都没啦),也不方便分布式程序的统一去重.我们可以将数据进行持久化,这样就克服了down机的问题,常见的持久化方法包 ...
- 使用jquery中height()方法获取各种高度
$(window).height(); //浏览器当前窗口可视区域高度 $(document).height(); //浏览器当前窗口文档的高度 $(document.body).height();/ ...
- javase学习小结一
输出格式: int num=12345; System.out.printf("%7d",number);输出结果为:空格空格12345 System.out.println(&q ...
- CSS选择器之通配符选择器和多元素选择器
1.通配符选择器 如果希望所有的元素都符合某一种样式,可以使用通配符选择器. 基本语法: *{margin:0; padding:0} 可以让所有的html元素的外边距和内边距都默认为0. 写一段ht ...
- ansible playbook实践(四)-如何调试写好的playbook文件
有时,我们写了一个长长,功能很强悍的yaml文件,但是,我们有可能会担心,写的yaml文件是否正确,是否有漏洞危机,毕竟是要修改线上的机器,那么,有可能我们可以从以下几个检查维度来进行,确保在大规模应 ...
- jQuery源码逐行分析学习01(jQuery的框架结构简化)
最近在学习jQuery源码,在此,特别做一个分享,把所涉及的内容都记录下来,其中有不妥之处还望大家指出,我会及时改正.望各位大神不吝赐教!同时,这也是我的第一篇前端技术博客,对博客编写还不是很熟悉,美 ...
- bzoj 4870: [Shoi2017]组合数问题 [矩阵乘法优化dp]
4870: [Shoi2017]组合数问题 题意:求 \[ \sum_{i=0}^{n-1} \binom{nk}{ik+r} \mod p \] \(n \le 10^9, 0\le r < ...
- [Sdoi2017]新生舞会 [01分数规划 二分图最大权匹配]
[Sdoi2017]新生舞会 题意:沙茶01分数规划 貌似\(*10^7\)变成整数更科学 #include <iostream> #include <cstdio> #inc ...
- POJ 2888 Magic Bracelet [Polya 矩阵乘法]
传送门 题意:竟然扯到哈利波特了.... 和上一题差不多,但颜色数很少,给出不能相邻的颜色对 可以相邻的连边建图矩阵乘法求回路个数就得到$f(i)$了.... 感觉这样的环上有限制问题挺套路的...旋 ...