Android RocooFix 热修复框架

来源:互联网 发布:nginx 访问根目录 编辑:程序博客网 时间:2024/05/18 00:32

最近在学习Android的热修复,使用了两个比较热门的框架,现做下总结:

项目git地址:https://github.com/dodola/RocooFix

源码会编译错误,可以使用下面的包。

修复lib包:RocooFix_libs

需要了解热修复原理的可以看下张鸿洋博客

也可以加下这个群:561394234 (里面有修复的项目,RocooFix作者也在里面!)

前言:

RocooFix支持两种模式:
1、静态修复某种情况下需要重启应用。 (推荐使用)
2、动态修复,无需重启应用即可生效。

使用方法:

 //打补丁        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)  ;

没有加群的朋友可以下载上面的RocooFix_libs包跟着我一步步来做:

项目使用Android Studio开发,所以准备好翻墙工具下载依赖包!!!

一、新建Android项目 app

二、将上面下载文件里面的rocoo作为lib库导入
在app的build.gradle 里面添加compile project(‘:rocoo’),也可以手动添加依赖。

三、下载下来的文件夹里面还有个buildsrc文件直接放到app项目平级目录中(这个不用做任何操作)

到此我们的目录结构为:

这里写图片描述

四:配置 根目录里面的 build.gradle文件:

buildscript {    repositories {        jcenter()        maven {            url "http://dl.bintray.com/dodola/maven"   //添加        }    }    dependencies {        classpath 'com.android.tools.build:gradle:2.1.2'        classpath 'org.jacoco:org.jacoco.core:0.7.4.201502262128'   //添加        // NOTE: Do not place your application dependencies here; they belong        // in the individual module build.gradle files    }}

、配置 app 里面的build.gradle 文件

apply plugin: 'com.android.application'apply plugin: 'com.dodola.rocoofix'            //添加android {    compileSdkVersion 23    buildToolsVersion "23.0.3"    defaultConfig {        applicationId "com.test.hotfixtest"        minSdkVersion 15        targetSdkVersion 23        versionCode 6        versionName "1.0"    }//添加    buildTypes {        release {            minifyEnabled true            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }        debug {            minifyEnabled true            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}/****必须添加**/rocoo_fix {    preVersionPath = '5'    enable = true}dependencies {    compile fileTree(include: ['*.jar'], dir: 'libs')    testCompile 'junit:junit:4.12'    compile 'com.android.support:appcompat-v7:23.1.1'    compile project(':rocoo')}

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,只要和之前的版本不同就可以,没有具体值的要求

六、添加混淆代码(proguard-rules.pro):

-keep class com.dodola.rocoofix.** {*;}-keep class com.lody.legend.* {*;}

七、添加测试代码:

新建一个Java类:

public class HelloHack {         public String showHello() {                return "rocoofix";              }    }

在建一个继承Application的类:

public class RocooApplication extends Application {    @Override    protected void attachBaseContext(Context base) {        super.attachBaseContext(base);        //需要打补丁时开启        RocooFix.init(this);        //测试从assets文件夹读取补丁        RocooFix.initPathFromAssets(this, "patch.jar");    }}

八、运行项目看是否报错。测试已没错。

九、生成 patch.jar 文件
1、首先随便修改下代码如:

public class HelloHack {         public String showHello() {                return "rocoofix——ok";              }    }

2、修改 app 项目中的build.gradle 文件把 versionCode 版本修改一下,把preVersionPath值修改成versionCode没修改之前的值。

最后运行项目就会在app目录下生成app\rocoofix\version4\debug\patch.jar 了,得到这个文件就算成功了,最后我们就可以随便测试补丁了,放在sd目录或者assets文件下,关闭补丁RocooFix.init(this) 运行没修改前的代码看看程序是否变了。

ps:这里做好心理准备补丁在有些机型会失效,目前测试MI 2S 4.4.4系统 成功。后面还会带来阿里的框架AndFix试用。

3 2