Android RocooFix 热修复框架

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

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

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

修复lib包:RocooFix_libs

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

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

前言:

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

使用方法:

<code class="hljs java has-numbering"> <span class="hljs-comment">//打补丁(需要制作补丁的时候使用)</span>
        RocooFix.init(<span class="hljs-keyword">this</span>);

<span class="hljs-comment">//方案1:静态启用,一般在Application里加载补丁</span>

<span class="hljs-javadoc">/**
  * 从Assets里取出补丁,一般用于测试
  *
  *<span class="hljs-javadoctag"> @param</span> context
  *<span class="hljs-javadoctag"> @param</span> assetName
  */</span>
RocooFix.initPathFromAssets(Context context, String assetName);

 <span class="hljs-javadoc">/**
   * 从指定目录加载补丁
   *<span class="hljs-javadoctag"> @param</span> context
   *<span class="hljs-javadoctag"> @param</span> dexPath
   */</span>
RocooFix.applyPatch(Context context, String dexPath);



<span class="hljs-comment">//方案2:动态打补丁,立即生效,有性能问题,适用于补丁方法数较少的情况,建议在ART虚拟机里启用该模式</span>
<span class="hljs-javadoc">/**
 * 从Asset里加载补丁,一般用于本地测试
 *<span class="hljs-javadoctag"> @param</span> context
 *<span class="hljs-javadoctag"> @param</span> assetName
 */</span>
RocooFix.initPathFromAssetsRuntime(Context context, String assetName) ;

<span class="hljs-javadoc">/**
 * 从指定目录加载补丁
 *<span class="hljs-javadoctag"> @param</span> context
 *<span class="hljs-javadoctag"> @param</span> dexPath
 */</span> 
RocooFix.applyPatchRuntime(Context context, String dexPath)  ;</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li></ul>

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

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

一、新建Android项目 app

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

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

到此我们的目录结构为:

这里写图片描述

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

<code class="hljs cs has-numbering">buildscript {
    repositories {
        jcenter()
        maven {
            url <span class="hljs-string">"http://dl.bintray.com/dodola/maven"</span>   <span class="hljs-comment">//添加</span>
        }
    }
    dependencies {
        classpath <span class="hljs-string">'com.android.tools.build:gradle:2.1.2'</span>
        classpath <span class="hljs-string">'org.jacoco:org.jacoco.core:0.7.4.201502262128'</span>   <span class="hljs-comment">//添加</span>
        <span class="hljs-comment">// NOTE: Do not place your application dependencies here; they belong</span>
        <span class="hljs-comment">// in the individual module build.gradle files</span>
    }
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul>

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

<code class="hljs java has-numbering">apply plugin: <span class="hljs-string">'com.android.application'</span>
apply plugin: <span class="hljs-string">'com.dodola.rocoofix'</span>            <span class="hljs-comment">//添加</span>

android {
    compileSdkVersion <span class="hljs-number">23</span>
    buildToolsVersion <span class="hljs-string">"23.0.3"</span>

    defaultConfig {
        applicationId <span class="hljs-string">"com.test.hotfixtest"</span>
        minSdkVersion <span class="hljs-number">15</span>
        targetSdkVersion <span class="hljs-number">23</span>
        versionCode <span class="hljs-number">6</span>
        versionName <span class="hljs-string">"1.0"</span>
    }
<span class="hljs-comment">//添加</span>
    buildTypes {
        release {
            minifyEnabled <span class="hljs-keyword">true</span>
            proguardFiles getDefaultProguardFile(<span class="hljs-string">'proguard-android.txt'</span>), <span class="hljs-string">'proguard-rules.pro'</span>
        }
        debug {
            minifyEnabled <span class="hljs-keyword">true</span>
            proguardFiles getDefaultProguardFile(<span class="hljs-string">'proguard-android.txt'</span>), <span class="hljs-string">'proguard-rules.pro'</span>
        }
    }

}

<span class="hljs-javadoc">/**
*
*必须添加
**/</span>
rocoo_fix {
    preVersionPath = <span class="hljs-string">'5'</span>
    enable = <span class="hljs-keyword">true</span>
}

dependencies {
    compile fileTree(include: [<span class="hljs-string">'*.jar'</span>], dir: <span class="hljs-string">'libs'</span>)
    testCompile <span class="hljs-string">'junit:junit:4.12'</span>
    compile <span class="hljs-string">'com.android.support:appcompat-v7:23.1.1'</span>
    compile project(<span class="hljs-string">':rocoo'</span>)
}
</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li></ul>

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):

<code class="hljs haml has-numbering">-<span class="ruby">keep <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">com</span>.<span class="hljs-title">dodola</span>.<span class="hljs-title">rocoofix</span>.** {*;</span>}
</span>-<span class="ruby">keep <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">com</span>.<span class="hljs-title">lody</span>.<span class="hljs-title">legend</span>.* {*;</span>}</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li></ul>

七、添加测试代码:

新建一个Java类:

<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> HelloHack {
         <span class="hljs-keyword">public</span> String <span class="hljs-title">showHello</span>() {
                <span class="hljs-keyword">return</span> <span class="hljs-string">"rocoofix"</span>;
              }
    }</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

在建一个继承Application的类:

<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RocooApplication</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Application</span> {</span>
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">attachBaseContext</span>(Context base) {
        <span class="hljs-keyword">super</span>.attachBaseContext(base);
        <span class="hljs-comment">//需要打补丁时开启</span>
        RocooFix.init(<span class="hljs-keyword">this</span>);
        <span class="hljs-comment">//测试从assets文件夹读取补丁</span>
        RocooFix.initPathFromAssets(<span class="hljs-keyword">this</span>, <span class="hljs-string">"patch.jar"</span>);
    }
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul>

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

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

<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> HelloHack {
         <span class="hljs-keyword">public</span> String <span class="hljs-title">showHello</span>() {
                <span class="hljs-keyword">return</span> <span class="hljs-string">"rocoofix——ok"</span>;
              }
    }</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

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试用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值