您的位置:首页 > 移动开发 > Android开发

Android热修复:Andfix和Hotfix,两种方案的比较与实现

2016-10-08 13:52 651 查看
android的热修复技术我看的最早的应该是QQ空间团队的解决方案,后来真正需要了,才仔细调查,现在的方案中,阿里有两种Dexposed和Andfix框架,由于前一种不支持5.0以上android系统,所以阿里系的方案我们就看Andfix就好。Hotfix框架算是对上文提到的QQ空间团队理论实现。本文旨在写实现方案,捎带原理。


Andfix


引入

框架官网:https://github.com/alibaba/AndFix

介绍是用英文写的,所以附上翻译网址:

http://blog.csdn.net/qxs965266509/article/details/49802429

使用android studio开发,引入如下:
<code class=" hljs nginx" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: Arial, Helvetica, sans-serif;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136); padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">compile</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">‘</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">com</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">alipay</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">euler</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">andfix</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">:</span><span class="lit" style="box-sizing: border-box; padding: 0px; color: rgb(0, 102, 102);">0.4</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="lit" style="box-sizing: border-box; padding: 0px; color: rgb(0, 102, 102);">0</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="lit" style="box-sizing: border-box; padding: 0px; color: rgb(0, 102, 102);">@aar</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">‘</span></span></code>


原理

下面是个修复的过程图,供我们更好地理解。



可以看出,andfix的修复是方法级的,对有bug的方法进行替换。


做补丁

官方有给使用方式,不过比较简略,所以会有些修改。我的思路是把补丁制作好,然后放到服务器上,客户端下载补丁到指定文件夹,然后修复。

首先要有补丁的制作工具,官方也为我们准备好了:这里

解压后,我们把修复前的apk和修复后的apk,keystore(为了方便,我就用debug的keystore了)放到这个文件夹里,如下:



其中需要用命令做补丁文件,就是需要一个修复前的apk和修复后的apk做对比,命令含义如下:
<code class=" hljs lasso" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: Arial, Helvetica, sans-serif;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">命令</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> apkpatch</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">bat </span><span class="hljs-attribute" style="box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">f</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box; padding: 0px;"><span class="kwd" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 136);">new</span></span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">apk </span><span class="hljs-attribute" style="box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">t</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> old</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">apk </span><span class="hljs-attribute" style="box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">o</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> output1 </span><span class="hljs-attribute" style="box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">k</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> debug</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">keystore </span><span class="hljs-attribute" style="box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">p</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> android </span><span class="hljs-attribute" style="box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">a</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> androiddebugkey </span><span class="hljs-attribute" style="box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">e</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> android

</span><span class="hljs-attribute" style="box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">f</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);"><</span></span><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box; padding: 0px;"><span class="kwd" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 136);">new</span></span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">apk</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">></span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">:新版本</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-attribute" style="box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">t</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);"><</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">old</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">apk</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">></span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">旧版本</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-attribute" style="box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">o</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px; color: rgb(0, 136, 0);"><</span></span><span class="str" style="box-sizing: border-box; padding: 0px; color: rgb(0, 136, 0);">output</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px; color: rgb(0, 136, 0);">></span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">输出目录</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-attribute" style="box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">k</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px; color: rgb(0, 136, 0);"><</span></span><span class="str" style="box-sizing: border-box; padding: 0px; color: rgb(0, 136, 0);">keystore</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px; color: rgb(0, 136, 0);">></span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">打包所用的</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">keystore
</span><span class="hljs-attribute" style="box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">p</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px; color: rgb(0, 136, 0);"><</span></span><span class="str" style="box-sizing: border-box; padding: 0px; color: rgb(0, 136, 0);">password</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px; color: rgb(0, 136, 0);">></span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> keystore</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">的密码</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-attribute" style="box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">a</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px; color: rgb(0, 136, 0);"><</span></span><span class="str" style="box-sizing: border-box; padding: 0px; color: rgb(0, 136, 0);">alias</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px; color: rgb(0, 136, 0);">></span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> keystore </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">用户别名</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-attribute" style="box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">-</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">e</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);"><</span></span><span class="kwd" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 136);">alias</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> password</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">></span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> keystore </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">用户别名密码</span></code>




然后会在outputdic里生成一个后缀是.apatch的文件:



改名成out.apatch,这就是我们的补丁。


打补丁

如何使用补丁呢?和把大象装进冰箱是一样步骤。

下面直接上代码了:

第一步:把补丁放到服务器。

简单起见,用的xampp,写了段php代码,起到下载的功能就可以了。
<code class=" hljs xml" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: Arial, Helvetica, sans-serif;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="php" style="box-sizing: border-box; padding: 0px;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;"><?</span><span class="pln" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;">php</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_name</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px;">"out.apatch"</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="com" style="box-sizing: border-box; padding: 0px;">//需要下载的文件</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
define</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px;">"SPATH"</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px;">"/files/"</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="com" style="box-sizing: border-box; padding: 0px;">//存放文件的相对路径</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_sub_path</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$_SERVER</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">[</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">‘</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">DOCUMENT_ROOT</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">‘</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">];</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="com" style="box-sizing: border-box; padding: 0px;">//网站根目录的绝对地址</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_path</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_sub_path</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">SPATH</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_name</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="com" style="box-sizing: border-box; padding: 0px;">//文件绝对地址,即前面三个连接</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="com" style="box-sizing: border-box; padding: 0px;">//判断文件是否存在</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;"><span class="kwd" style="box-sizing: border-box; padding: 0px;">if</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(!</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">file_exists</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_path</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">)){</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">echo</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px;">"该文件不存在"</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;"><span class="kwd" style="box-sizing: border-box; padding: 0px;">return</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$fp</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> fopen</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_path</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px;">"r"</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="com" style="box-sizing: border-box; padding: 0px;">//打开文件</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_size</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> filesize</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_path</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="com" style="box-sizing: border-box; padding: 0px;">//获取文件大小</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="com" style="box-sizing: border-box; padding: 0px;">/*
*下载文件需要用到的header
*/</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
header</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px;">"Content-type:application/octet-stream"</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
header</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px;">"Accept-Ranges:bytes"</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
header</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px;">"Accept-Length:"</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_size</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
header</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;"><span class="str" style="box-sizing: border-box; padding: 0px;">"Content-Disposition:attachment;filename="</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_name</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">

</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$buffer</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box; padding: 0px;"><span class="lit" style="box-sizing: border-box; padding: 0px;">1024</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_count</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box; padding: 0px;"><span class="lit" style="box-sizing: border-box; padding: 0px;">0</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="com" style="box-sizing: border-box; padding: 0px;">//向浏览器返回数据</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;"><span class="kwd" style="box-sizing: border-box; padding: 0px;">while</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(!</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">feof</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$fp</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">&&</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_count</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);"><</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_size</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">){</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_con</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> fread</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$fp</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$buffer</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_count</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">+=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$buffer</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">echo</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$file_con</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="com" style="box-sizing: border-box; padding: 0px;">//这里如果不echo,只会下载到0字节的文件</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
fclose</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">$fp</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">?></span></span></span></code>


第二步:下载和打补丁。

回到android,在我们的application里:
<code class=" hljs java" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: Arial, Helvetica, sans-serif;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">public</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-class" style="box-sizing: border-box; padding: 0px;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;"><span class="kwd" style="box-sizing: border-box; padding: 0px;">class</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102); padding: 0px;"><span class="typ" style="box-sizing: border-box; padding: 0px;">App</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;"><span class="kwd" style="box-sizing: border-box; padding: 0px;">extends</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102); padding: 0px;"><span class="typ" style="box-sizing: border-box; padding: 0px;">Application</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box; padding: 0px;"><span class="lit" style="box-sizing: border-box; padding: 0px; color: rgb(0, 102, 102);">@Override</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">public</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">void</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-title" style="box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">onCreate</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">()</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">super</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">onCreate</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">YuanAndfix</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">inject</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">this</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span></code>


其中,YuanAndfix类:
<code class=" hljs java" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: Arial, Helvetica, sans-serif;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">public</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-class" style="box-sizing: border-box; padding: 0px;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;"><span class="kwd" style="box-sizing: border-box; padding: 0px;">class</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102); padding: 0px;"><span class="typ" style="box-sizing: border-box; padding: 0px;">YuanAndfix</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">public</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">static</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">final</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">String</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> apatch_path </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"out.apatch"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">public</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">static</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">void</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-title" style="box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">inject</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">final</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Context</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> context</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">

</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">final</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">PatchManager</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> patchManager </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">new</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">PatchManager</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">context</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
patchManager</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">init</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">BuildConfig</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">VERSION_CODE </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">+</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">""</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;">//current version</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
patchManager</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">loadPatch</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">new</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Thread</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">new</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Runnable</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">()</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box; padding: 0px;"><span class="lit" style="box-sizing: border-box; padding: 0px; color: rgb(0, 102, 102);">@Override</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">public</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">void</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-title" style="box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">run</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">()</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">HttpDownload</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> httpDownload </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">new</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">HttpDownload</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
httpDownload</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">downFile</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"http://192.168.1.12/download.php"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> context</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">getDir</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"patch"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Context</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">MODE_PRIVATE</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">).</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">getAbsolutePath</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">()+</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"/"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">apatch_path</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">try</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">String</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> patchPath </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">context</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">getDir</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"patch"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Context</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">MODE_PRIVATE</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">).</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">getAbsolutePath</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">()+</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"/"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">+</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">apatch_path</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">File</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> file </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">new</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">File</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">patchPath</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">if</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">file</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">exists</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">())</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
patchManager</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">addPatch</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">patchPath</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Toast</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">makeText</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">context</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"打补丁完成"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Toast</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">LENGTH_SHORT</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">).</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">show</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">else</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Toast</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">makeText</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">context</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"失败"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Toast</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">LENGTH_SHORT</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">).</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">show</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">catch</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Exception</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> e</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
e</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">printStackTrace</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}).</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">start</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">

</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span></code>


这样,热修复就完成了,我这个例子是点击按钮,弹出toast显示文字,修复前是
<code class=" hljs avrasm" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: Arial, Helvetica, sans-serif;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Toast</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">.</span><span class="pln" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;">makeText</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">MainActivity</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">.</span><span class="kwd" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">this</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"bug"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Toast</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">.</span><span class="pln" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;">LENGTH</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">_SHORT</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">.</span><span class="pln" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;">show</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">()</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">;</span></span></code>


修复后是:
<code class=" hljs avrasm" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: Arial, Helvetica, sans-serif;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Toast</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">.</span><span class="pln" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;">makeText</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">MainActivity</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">.</span><span class="kwd" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">this</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"fixed"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Toast</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">.</span><span class="pln" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;">LENGTH</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">_SHORT</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">.</span><span class="pln" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;">show</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">()</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">;</span></span></code>


以上就是Andfix的使用,经过我的试验,使用这个框架的局限在于不能修改全局变量,不能加新的方法,不过可以在现有的方法上做修改,加局部变量。从这方面来看,Andfix其实要求我们只是修改方法里面的bug,不能大规模做更改。如果我们觉得这种修复不能满足修复要求,那么,可以看另外这种,局限更少的热修方案。


HotFix


原理

官网:https://github.com/dodola/HotFix

在用这个框架之前,我希望你先去看一下原理,对后面的实现有很大帮助。

下面我简单说一下原理。

把多个dex文件塞入到app的classloader之中android加载的时候,如果有多个dex文件中有相同的类,就会加载前面的类,所以这个热补的原理就是把有问题的类替换掉,把需要的类放到最前面,达到热补的目的。



但是有个问题,我们想要替换的类,不能被打上CLASS_ISPREVERIFIED标志,否则回报错,于是这个方案的难点就在于如何让想要被修复的类不被打上CLASS_ISPREVERIFIED标志。所以,大神们的hack神计来了,先制作一个dex包,然后给我们想要修复的类的构造方法,都注入这个dex包,其实就是输出这个dex包的一个类:

System.out.println(dodola.hackdex.AntilazyLoad.class);

这样,就可以让我们想要修复的类不被打上CLASS_ISPREVERIFIED标志,然后就可以加载补丁了。


框架

这个框架的使用不管是配置上,还是补丁生成上,都相对麻烦一些,虽然有个相似的框架Nuwa做了自动化这块,不过据说有些坑没人填,所以果断用这个hotfix框架。框架下载下来,我们先看一下结构。



app是主工程;

buildSrc是Gradle的Task,Gradle的编译命令就是由多个task组成的,说白了就是Gradle在编译程序的时候会按照这些task顺序执行命令。

hackdex里面就一个空类,目的为了让编译通过,让主工程的类不被打上CLASS_ISPREVERIFIED标志。

hotfixlib是个修复的工具类。

接着,我们看一下他们是怎么一起工作的。

首先是主工程app的build.gradle文件,里面多了两段代码:
<code class=" hljs livecodeserver" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: Arial, Helvetica, sans-serif;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">task</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">‘</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">processWithJavassist</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">‘</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);"><<</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">String</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> classPath </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">file</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">‘</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">build</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">/</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">intermediates</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">/</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">classes</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">/</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">debug</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">‘</span></span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">)</span><span class="com" style="box-sizing: border-box; padding: 0px;">//项目编译class所在目录</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
dodola</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">patch</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">PatchClass</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">process</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">classPath</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> project</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">‘:</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">hackdex</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">‘</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">).</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">buildDir
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">absolutePath </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">+</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">‘/</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">intermediates</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">/</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">classes</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">/</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">debug</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">‘</span></span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">)</span><span class="com" style="box-sizing: border-box; padding: 0px;">//第二个参数是hackdex的class所在目录</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">

</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span></code>



<code class=" hljs avrasm" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: Arial, Helvetica, sans-serif;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">applicationVariants</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">.</span><span class="pln" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;">all</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> variant </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">-></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
variant</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">.</span><span class="pln" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;">dex</span></span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">.</span><span class="pln" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;">dependsOn</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);"><<</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> processWithJavassist </span><span class="com" style="box-sizing: border-box; padding: 0px; color: rgb(136, 0, 0);">//在执行dx命令之前将代码打入到class中</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span></code>


这就是通过javassist,给主工程的类的构造方法注入

System.out.println(dodola.hackdex.AntilazyLoad.class);

AntilazyLoad.class在app的assets中,程序运行后会拷贝到sd卡里,主要是为了让主工程的类不被打上CLASS_ISPREVERIFIED标志。


做补丁

补丁就是想要替换的类的class文件的集合,补丁制作过程参考

https://github.com/dodola/HotFix

其中用到的类在这里提前:



接着把修复好的类放到一个文件夹,文件夹路径得和你原来类的包名一致。如:

比如上图的BugClass.class类,就放到这样的文件夹



然后执行命令:



这样就生成了一个path.jar在d盘下,接着就是把这个jar做成dex的jar了,由于要用到dx,而这个dx在我们的sdk工具包里,所以我把这个path.jar拷贝到sdk工具包,利用dx命令





然后会生成path_dex.jar,这就是我们的补丁文件了。


打补丁

<code class=" hljs java" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: Arial, Helvetica, sans-serif;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">public</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-class" style="box-sizing: border-box; padding: 0px;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;"><span class="kwd" style="box-sizing: border-box; padding: 0px;">class</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102); padding: 0px;"><span class="typ" style="box-sizing: border-box; padding: 0px;">HotfixApplication</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;"><span class="kwd" style="box-sizing: border-box; padding: 0px;">extends</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102); padding: 0px;"><span class="typ" style="box-sizing: border-box; padding: 0px;">Application</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">

</span><span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box; padding: 0px;"><span class="lit" style="box-sizing: border-box; padding: 0px; color: rgb(0, 102, 102);">@Override</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">public</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">void</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-title" style="box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">onCreate</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">()</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">super</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">onCreate</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">File</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> dexPath </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">new</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">File</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">getDir</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"dex"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Context</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">MODE_PRIVATE</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">),</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"hackdex_dex.jar"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Utils</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">prepareDex</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">this</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">getApplicationContext</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(),</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> dexPath</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"hackdex_dex.jar"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">HotFix</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">patch</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">this</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> dexPath</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">getAbsolutePath</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(),</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"dodola.hackdex.AntilazyLoad"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">try</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">this</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">getClassLoader</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">().</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">loadClass</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"dodola.hackdex.AntilazyLoad"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">catch</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">ClassNotFoundException</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> e</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
e</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">printStackTrace</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span></code>


然后是下载和打补丁
<code class=" hljs java" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: Arial, Helvetica, sans-serif;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">      </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">switch</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">item</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">getItemId</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">())</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">case</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> R</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">id</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">action_fix</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">new</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Thread</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">new</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Runnable</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">()</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box; padding: 0px;"><span class="lit" style="box-sizing: border-box; padding: 0px; color: rgb(0, 102, 102);">@Override</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">public</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">void</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-title" style="box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">run</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">()</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">String</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> url </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"http://192.168.1.12/download.php"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">HttpDownload</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> httpDownload </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">new</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">HttpDownload</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">final</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">int</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> flag </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> httpDownload</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">downFile</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">url</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">MainActivity</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">this</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">getDir</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"dex"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Context</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">MODE_PRIVATE</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">).</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">getAbsolutePath</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">()+</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"/"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"path_dex.jar"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">HotFix</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">patch</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">MainActivity</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">this</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">MainActivity</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">this</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">getDir</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"dex"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Context</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">MODE_PRIVATE</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">).</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">getAbsolutePath</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">()+</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"/"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">+</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"path_dex.jar"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">""</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
runOnUiThread</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">new</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Runnable</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">()</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box; padding: 0px;"><span class="lit" style="box-sizing: border-box; padding: 0px; color: rgb(0, 102, 102);">@Override</span></span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">public</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">void</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-title" style="box-sizing: border-box; padding: 0px;"><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">run</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">()</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">String</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> fileState</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">null</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">if</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">flag</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">==</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box; padding: 0px;">0</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
fileState </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"下载完成"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">if</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">flag</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">==</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box; padding: 0px;">1</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
fileState </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"文件已存在"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">if</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">flag</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">==-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box; padding: 0px;">1</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
fileState </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"下载错误"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Toast</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">makeText</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">MainActivity</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">this</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> fileState</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Toast</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">LENGTH_SHORT</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">).</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">show</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">});</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">

</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}).</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">start</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">break</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">case</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> R</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">id</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">action_test</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">:</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">LoadBugClass</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> bugClass </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">new</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">LoadBugClass</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Toast</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">makeText</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">this</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"测试调用方法:"</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">+</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> bugClass</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">getBugString</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(),</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">Toast</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">LENGTH_SHORT</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">).</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">show</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">break</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span></code>


这里需要注意,如果类一旦调用过,需要下次启动程序补丁才会生效。所以如果我们先点了测试,再点下载,那么需要重启程序(后台杀死),补丁才会生效。


手动注入

上面关于防止类被打上CLASS_ISPREVERIFIED标志的办法虽然好,但是是有局限性的,必须要用gradle编译,还得了解字节码注入,如果我们是用eclipse开发,那就不能用了,其实我们还有一种办法,就是手动给类添加那行

System.out.println(dodola.hackdex.AntilazyLoad.class)代码,只要保证编译通过就可以了。所以这里这么办,我们新建一个工程,androidstudio的话,



看main下,我们新建了个hack文件夹,里面放了个hack.jar,里面只有这么个类:
<code class=" hljs cs" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: Arial, Helvetica, sans-serif;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">public</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; padding: 0px;">class</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">AntilazyLoad</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);">
</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">}</span></code>


然后,在我们主工程app里面的类的构造方法,加入

System.out.println(dodola.hackdex.AntilazyLoad.class),这行代码,就达到了手动注入的目的,就不需要那些复杂的task代码,字节码注入等操作。所以如果你是用eclipse的话,目录就是这样



这个jar包不会被打包进app,就是让编译通过,真正的AntilazyLoad.class其实还是在项目的assets包下的hack_dex.jar。

上述方法都是亲测完全可行的,特别是这种手动注入的方法,能解决大部分开发者不会用热更的困扰。这个办法我是看这篇文章学到的。

PS:

1、这个框架不能修改用final修饰过得东西,切记。

2、官网给出的打补丁代码
<code class=" hljs avrasm" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: Arial, Helvetica, sans-serif;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">HotFix</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">.</span><span class="pln" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;">patch</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="kwd" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 136);">this</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> dexPath</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">.</span><span class="pln" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;">getAbsolutePath</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(),</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">"dodola.hackdex.BugClass"</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">;</span></span></code>


这么看的话,很不合理,第三个参数居然要传bug类名,我们又不能预知哪个类会发生bug,所以我改成这样
<code class=" hljs avrasm" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: Arial, Helvetica, sans-serif;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="typ" style="box-sizing: border-box; padding: 0px; color: rgb(102, 0, 102);">HotFix</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">.</span><span class="pln" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;">patch</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="kwd" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 136);">this</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> dexPath</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">.</span><span class="pln" style="color: rgb(0, 0, 0); box-sizing: border-box; padding: 0px;">getAbsolutePath</span></span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">(),</span><span class="pln" style="box-sizing: border-box; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; padding: 0px;">""</span><span class="pun" style="box-sizing: border-box; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; padding: 0px;"><span class="pun" style="color: rgb(102, 102, 0); box-sizing: border-box; padding: 0px;">;</span></span></code>


第三个参数不要了,亲测,也是好使的。


总结

对比两种解决方案,阿里的andfix更注重于改细节的bug,虽然它是从native层做得操作,但是框架封装的很好,我们使用起来很简便,而且有更新维护,据说阿里系的app打算都用这个。如果我们仅仅就是开发一款app,还没有大改动,不会热更全局变量,不会增加方法,那么这个框架就是首选。

但是有的时候我们可能开发的是一款sdk,譬如友盟sdk之类,或者想热更全局变量,增加方法,那么andfix可以说是用不到的,所以这个时候hotfix是更好的选择。

下载点这里

Andfixdemo

HotFixdemo

服务端PHP代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  热修复 android开发