dodola / RocooFix
- вторник, 31 мая 2016 г. в 03:12:37
Java
another hotfix framework
Another hotfix framework
之前的HotFix项目太过简单,也有很多同学用Nuwa遇到很多问题,作者也不再修复,所以重新构建了一套工具。
com.android.tools.build:gradle:1.3.0->com.android.tools.build:gradle:2.1.0 (解决了Nuwa 这个issue)hash.txt和mapping.txt文件的生成和保存动态修复使用的是Lody的Legend项目,由于Dalvik的CLASS验证导致这个HOOK框架在Dalvik虚拟机下会崩溃,但是在RocooFix框架里正好可以欺骗这个验证,所以在Dalvik下不会出现原来的崩溃问题。具体情况可以参照这篇日志
public class RocooApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
//打补丁
RocooFix.init(this);
}
}
//方案1:静态启用,一般在Application里加载补丁
RocooFix.initPathFromAssets(this, "patch.jar");
//方案2:动态打补丁,立即生效,有性能问题,适用于补丁方法数较少的情况,建议在ART虚拟机里启用该模式
RocooFix.initPathFromAssetsRuntime(this,"patch.jar");
在你项目的build.gradle文件里添加如下配置
rocoo_fix {
includePackage = ['com/dodola/rocoofix']//限制需要制作补丁的package
excludeClass = ['BaseApplication.class']//将不需要加到patch里的类写在这里
preVersionPath = '1'//注意:此项属性只在需要制作补丁的时候才需开启!!如果不需要制作补丁则需要去掉此项
enable = true//注意:关掉此项会无法生成Hash.txt文件
}这里主要介绍一下preVersionPath这个属性的作用。
rocoo_fix将制作补丁的步骤透明化,用户无需手动备份hash.txt文件,插件会自动根据当前的versionCode生成hash.txt和mapping.txt文件到指定目录,比如:
上一个版本发布的时候版本号是1,那么生成的文件会放在app源码目录/rocooFix/version1/[debug]|[release]的目录下,如果需要制作补丁那么在配置里指定preVersionPath 属性,它的值是上一个版本的版本号,这里的值是1,
然后将build.gradle的versionCode的号码修改,这里修改成2,只要和之前的版本不同就可以,没有具体值的要求
-keep class com.dodola.rocoofix.** {*;}
下面演示一下使用项目demo生成补丁的制作过程
package com.dodola.rocoosample;
public class HelloHack {
public String showHello() {
return "hello world";
}
}
此时build.gradle里的VersionCode是1
app的目录下生成如下文件:这里可以看做是我们已经发布版本的hash.txt
showHello方法,修改如下:package com.dodola.rocoosample;
public class HelloHack {
public String showHello() {
return "hello Hack";//此处修复,补丁加载后该方法返回hello hack
}
}
rocoo_fix项,让其执行patch 的task,配置如下rocoo_fix {
preVersionPath = '1'//注意:这里指定的是需要打补丁的VersionCode
enable = true
}
versionCode为2,说明这个是一个升级fix版本。