Rocoofix热修复功能
现在我们在网上可以找到很多的这种热修复的功能[Rocoofix][6]热修复就是其中的一种,因为现在还没有google官方的一些支持,所以目前基本上除了一些大的公司(阿里巴巴,腾讯)有自己的热修复框架,其他的都是看的别人写的一些,下面就来看看我看的一个RocooFix 热修复:
可以看看这个:https://github.com/dodola/RocooFix
但是这个里面确实还有许多的坑在里面!我通过一段时间的研究,总结了一些bug ,可以让你们少走弯路!但是这个本人还没有在项目正式的线上使用,因为这个毕竟不是官方的!你们自己可以试试!
整个流程:
两种模式
(1)静态修复某种情况下需要重启应用。
(2)动态修复,无需重启应用即可生效。
但是我这边不讲动态修复,主要讲的是静态修复
主要代码
Application的配置
代码如下:
public class RocooApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
//打补丁
RocooFix.init(this);
}
}
这个别忘了在AndroidManifest.xml文件中加入
<application
android:name=".RocooApplication"
......>
</application>
静态启用补丁
代码如下:
静态启用,一般在Application里加载补丁
/**
* 从Assets里取出补丁,一般用于测试
*
* @param context
* @param assetName
*/
RocooFix.initPathFromAssets(Context context, String assetName);
/**
* 从指定目录加载补丁
* @param context
* @param dexPath
*/
RocooFix.applyPatch(Context context, String dexPath);
注意:dexPath这个路径是有讲究的!一般是放到Android/ceche/项目名/patch.jar这样的目录
Android 6.0 以上版本 你还得需要加入的 读取SD卡 的动态权限判断
在Root中的Build.gradle配置
在repositories 配置如下
repositories {
jcenter()
maven {
url "http://dl.bintray.com/dodola/maven"
}
}
在dependencies 里面配置如下:
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.dodola:rocoofix:1.1’
}
注意: 不是 2.1.0版本的,有可能 6.0以上系统不支持
在你项目的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 里面 加入:
dependencies {
compile 'com.dodola:rocoo:1.0'
}
注意:
scanref =true 直接配置在项目里面会报错缺包!你需要加入一个buildsrc 的项目进去(在我的博客最前面的地址中下载最新的buildsrc项目)
这里主要介绍一下preVersionPath这个属性的作用。
rocoo_fix将制作补丁的步骤透明化,用户无需手动备份hash.txt文件,插件会自动根据当前的versionCode生成hash.txt和mapping.txt文件到指定目录,比如:
上一个版本发布的时候版本号是1,那么生成的文件会放在app源码目录/rocooFix/version1/[debug]|[release]的目录下,如果需要制作补丁那么在配置里指定preVersionPath 属性,它的值是上一个版本的版本号,这里的值是1,
然后将build.gradle的versionCode的号码修改,这里修改成2,只要和之前的版本不同就可以,没有具体值的要求。
在你的项目里面配置 proguard-rules.pro配置如下
-keep class com.dodola.rocoofix.* {;}
-keep class com.lody.legend.* {;}
这是起到混淆的作用
其中的配置都已经全部完成!
整个项目的使用方法,下面详细的说一下:
第一步:新建一个类
public class Test2 {
public static String getString(){
return "test 2";
}
}
第二步: 在Application中 加入 获取assets目录内容代码
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
RocooFix.init(this);
//这个是放在assets目录中使用的
RocooFix.initPathFromAssets(this, "patch.jar");
}
第三步:在MainActivity里面调用 Test类
@Override
protected void onCreate() {
super.onCreate();
TextView textview = (TextView)findViewById(R.id.textview);
StringBuffer stringBuffer=new StringBuffer();
stringBuffer.append(Test.getA());
textview.setText(stringBuffer);
}
第四步 build.gradle 中修改
***注意了: 把这个preVersionPath = '1' 注销***
rocoo_fix {
includePackage = ['com/orliu/rocoo']//限制需要制作补丁的package
excludeClass = []//将不需要加到patch里的类写在这里
preVersionPath = '1'//注意:此项属性只在需要制作补丁的时候才需开启!!如果不需要制作补丁则需要去掉此项
enable = true//注意:关掉此项会无法生成Hash.txt文件
scanref=true//默认为 false,开启这个选项会将与补丁 class 相引用的 class 都打入包中来解决 ART 虚拟机崩溃问题,功能 Beta 中
}
第五步:以上四步把 bug版本配置好了!现在可以运行打包
第一个版本会生成hash.text文件和mapping.txt文件
第六步:修改MainActivity
把Activity 修改一下代码,例如把里面的Test 内容修改 一下!
然后修改 当前项目的versionCode (比如之前是1 现在改成2),说明这个是一个升级版。
然后 把第四步 里面的修改 的preVersionPath = ‘?’ 这个里面是放你上一个版本的versionCode 并 打开!
这样就会生成 patch.jar 的文件
第七步:把path.jar文件放到 assets 目录里面
然后把之前修改的Test类里面的内容都还原,把第六步的操作也都还原了!然后再打一个包,这样就会显示出效果来!
备注
这里面坑很多,反正仔细点就应该没有啥问题![^footnote].
(1)注意点:放到本地服务器上面跑的时候 你需要把parch.jar 文件 替换了,最好还是重启一下 Tomcat !不然这也是加载不出效果的;(放到正式环境里面应该是没有问题的)
(2)注意: 是6.0以上系统得把修改过的类以及引用他的类都放进patch ,这样才会有效果!不然很可能都是没有效果(例如:MainActivity调用了 Test 类,Test类修改了,但是MainActivity 没有修改,这样可能出不来效果)
(3)访问SD 卡的时候:6.0的时候还是需要加入动态权限的哟!
(4)如果是放到SD 卡中还是需要注意的 放的位置也会影响的 (这个方法从SD 卡中得到RocooFix.applyPatch();)
(5)放到Android/ceche/项目包/patch.jar 这个路径下(试过了,可以通过)
(6)这里你没有配置好的话有可能打包也会出错,或者patch.jar生成不了
buildTypes {
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}