目录(?)[+]

AndFix

这篇主要介绍alibaba的AndFix项目的使用,下一篇介绍 AndFix原理及源码解析。

Github:https://github.com/alibaba/AndFix


AndFix介绍

AndFix是一个Android App的在线热补丁框架。使用此框架,我们能够在不重复发版的情况下,在线修改App中的Bug。AndFix就是 “Android Hot-Fix”的缩写。 
就目前来说,AndFix支持Android 2.3到6.0版本,并且支持arm 与 X86系统架构的设备。完美支持Dalvik与ART的Runtime。 
AndFix 的补丁文件是以 .apatch 结尾的文件。 
AndFix是阿里巴巴开源项目。


  • AndFix

    • AndFix介绍
    • Android上如何使用
    • patch文件的生成
      • 在Android Studio使用
      • 在Eclipse使用
      • 代码混淆ProGuard

Android上如何使用

1.在自定义Application中初始化,为了更早的修复应用中的bug。

<code class="language-Java hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">package</span> com.euler.andfix;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> android.app.Application;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> com.alipay.euler.andfix.patch.PatchManager;<span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/*** MainApplication 2015-11-12 下午2:07:11* *<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @author</span> 乔晓松 965266509@qq.com*/</span>
<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">MainApplication</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">extends</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">Application</span> {</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> PatchManager mPatchManager;<span class="hljs-annotation" style="color:#9b859d;box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onCreate</span>() {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">super</span>.onCreate();<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 初始化patch管理类</span>mPatchManager = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> PatchManager(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">this</span>);<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 初始化patch版本</span>mPatchManager.init(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"1.0"</span>);<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 加载已经添加到PatchManager中的patch</span>mPatchManager.loadPatch();}
}
</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li></ul>

2.如果有新的补丁需要修复,下载完成后,进行以下操作

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//添加patch,只需指定patch的路径即可,补丁会立即生效</span>
mPatchManager.addPatch(path);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

3.当apk版本升级,需要把之前patch文件的删除,需要以下操作

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//删除所有已加载的patch文件</span>
mPatchManager.removeAllPatch();</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

patch文件的生成

使用工具:apkpatch-1.0.3 
原理:根据两个apk包,生成一个差异文件,就是所谓的补丁文件即patch文件。

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">命令 : apkpatch<span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">.</span>bat <span class="hljs-attribute" style="box-sizing: border-box;">-f</span> <span class="hljs-literal" style="color:#06666;box-sizing: border-box;">new</span><span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">.</span>apk <span class="hljs-attribute" style="box-sizing: border-box;">-t</span> old<span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">.</span>apk <span class="hljs-attribute" style="box-sizing: border-box;">-o</span> output1 <span class="hljs-attribute" style="box-sizing: border-box;">-k</span> debug<span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">.</span>keystore <span class="hljs-attribute" style="box-sizing: border-box;">-p</span> android <span class="hljs-attribute" style="box-sizing: border-box;">-a</span> androiddebugkey <span class="hljs-attribute" style="box-sizing: border-box;">-e</span> android<span class="hljs-attribute" style="box-sizing: border-box;">-f</span> <span class="hljs-subst" style="color:#000000;box-sizing: border-box;"><</span><span class="hljs-literal" style="color:#06666;box-sizing: border-box;">new</span><span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">.</span>apk<span class="hljs-subst" style="color:#000000;box-sizing: border-box;">></span> :新版本
<span class="hljs-attribute" style="box-sizing: border-box;">-t</span> <span class="hljs-subst" style="color:#000000;box-sizing: border-box;"><</span>old<span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">.</span>apk<span class="hljs-subst" style="color:#000000;box-sizing: border-box;">></span> : 旧版本
<span class="hljs-attribute" style="box-sizing: border-box;">-o</span> <span class="hljs-subst" style="color:#000000;box-sizing: border-box;"><</span>output<span class="hljs-subst" style="color:#000000;box-sizing: border-box;">></span> : 输出目录
<span class="hljs-attribute" style="box-sizing: border-box;">-k</span> <span class="hljs-subst" style="color:#000000;box-sizing: border-box;"><</span>keystore<span class="hljs-subst" style="color:#000000;box-sizing: border-box;">></span>: 打包所用的keystore
<span class="hljs-attribute" style="box-sizing: border-box;">-p</span> <span class="hljs-subst" style="color:#000000;box-sizing: border-box;"><</span>password<span class="hljs-subst" style="color:#000000;box-sizing: border-box;">></span>: keystore的密码
<span class="hljs-attribute" style="box-sizing: border-box;">-a</span> <span class="hljs-subst" style="color:#000000;box-sizing: border-box;"><</span>alias<span class="hljs-subst" style="color:#000000;box-sizing: border-box;">></span>: keystore 用户别名
<span class="hljs-attribute" style="box-sizing: border-box;">-e</span> <span class="hljs-subst" style="color:#000000;box-sizing: border-box;"><</span>alias password<span class="hljs-subst" style="color:#000000;box-sizing: border-box;">></span>: keystore 用户别名密码</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

 
执行完命令,就会在输出目录中输出.apatch文件: 
 
new-c293df7dbc23f11214fdd020ea78d3b8.apatch:就是patch文件。

.apatch文件根目录内容: 
META_INF文件下内容: 
PATCH.MF文件内容:注:Patch-Classes就是改动过的class.

客户端请求服务器接口(api),服务器根据用户传递的数据分析是否有需要修复的bug。 
如果有bug需要修复,就下载服务器指定的.apatch文件的链接,下载完后及时加载并修复,使用addpatch(path)方法,补丁会立即生效。

在Android Studio使用

maven dependency:

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">dependency</span>></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">groupId</span>></span>com.alipay.euler<span class="hljs-tag" style="color:#06666;box-sizing: border-box;"></<span class="hljs-title" style="color:#0088;box-sizing: border-box;">groupId</span>></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">artifactId</span>></span>andfix<span class="hljs-tag" style="color:#06666;box-sizing: border-box;"></<span class="hljs-title" style="color:#0088;box-sizing: border-box;">artifactId</span>></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">version</span>></span>0.3.1<span class="hljs-tag" style="color:#06666;box-sizing: border-box;"></<span class="hljs-title" style="color:#0088;box-sizing: border-box;">version</span>></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">type</span>></span>aar<span class="hljs-tag" style="color:#06666;box-sizing: border-box;"></<span class="hljs-title" style="color:#0088;box-sizing: border-box;">type</span>></span>
<span class="hljs-tag" style="color:#06666;box-sizing: border-box;"></<span class="hljs-title" style="color:#0088;box-sizing: border-box;">dependency</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

or gradle dependency:

<code class="hljs nginx has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-title" style="color:#0088;box-sizing: border-box;">dependencies</span> {<span class="hljs-title" style="color:#0088;box-sizing: border-box;">compile</span> <span class="hljs-string" style="color:#0880;box-sizing: border-box;">'com.alipay.euler:andfix:0.3.1<span class="hljs-variable" style="color:#66066;box-sizing: border-box;">@aar</span>'</span>
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

在Eclipse使用

把Java层的代码引入到你的工程,配置Ndk开发环境并把jni Native代码添加进来。

代码混淆(ProGuard)

<code class="hljs scala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">-keep <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span> * <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">extends</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">java</span>.<span class="hljs-title" style="color:#66066;box-sizing: border-box;">lang</span>.<span class="hljs-title" style="color:#66066;box-sizing: border-box;">annotation</span>.<span class="hljs-title" style="color:#66066;box-sizing: border-box;">Annotation</span></span>
-keepclasseswithmembernames <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span> * {</span>native <methods>;
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

原文地址: http://blog.csdn.net/qxs965266509/article/details/49802429

Alibaba-AndFix Bug热修复框架的使用相关推荐

  1. Android-FixBug热修复框架的使用及源码分析(不发版修复bug)

    前面几篇博文已经介绍了2种热修复框架的使用及源码分析,AndFix兼容性比较好,而Dexposed Art处于Beta版. AndFix和Dexposed都是阿里的开源项目.  Alibaba-And ...

  2. Alibaba-AndFix Bug热修复框架原理及源码解析

    小憩之后,继续为你解读AndFix热修复框架,呵呵. 上一篇Alibaba-AndFix Bug热修复框架的使用已经介绍了AndFix的使用,这篇主要介绍AndFix原理以及源码解析. AndFix原 ...

  3. 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )

    文章目录 一. 热修复框架简介 1.类替换 2.so 替换 3.资源替换 4.全平台支持 5.生效时间 6.性能损耗 7.总结 二. 将 Java 字节码文件打包到 Dex 文件 一. 热修复框架简介 ...

  4. 热修复框架AndFix【源码阅读】

    前言 AndFix是阿里巴巴开源的Android热修复框架.其基本原理是利用JNI来实现方法的替换,以实现Android APP的热修复,即无需发版即可临时修复在线BUG. 热修复技术有很多种,And ...

  5. android 热修复 框架,十分钟教会你使用安卓热修复框架AndFix

    腾讯最近开发出一个Tinker,阿里也有一个Dexposed框架,当然还有一个就是今天的主角热修复框架AndFix.接下来,我会从它的概念.原理.使用方法等为你详细介绍. 1.什么是AndFix? A ...

  6. 红橙Darren视频笔记 利用阿里巴巴AndFix进行热修复

    注意 由于AndFix在2017年左右就停止更新了,在最新版本的apk上遇到很多问题,我最终也没有成功进行热修复.本节主要是学习热修复的原理 在上一篇 红橙Darren视频笔记 自己捕获异常并保存到本 ...

  7. Android—常用热修复框架

    前言 热修复即<打补丁>,当一个app上线后,如果发现重大的bug,需要紧急修复.常规的做法是修复bug,然后重新打包,再上线到各个渠道.这种方式的成本高,效率低. 于是热修复技术应运而生 ...

  8. Android之热修复框架Nuwa

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/70284239 本文出自:[顾林海的博客] ##前言 当热修复框架还没出 ...

  9. 热修复框架Tinker的从0到集成之路(转)

    转自:http://blog.csdn.net/lisdye2/article/details/54411727 热修复框架Tinker的从0到集成之路 转载请标明出处:  http://blog.c ...

最新文章

  1. shell中数值比较 字符串比较 文件判断 whle和for和until循环
  2. Salesforce Service Cloud 十大功能亮点
  3. 成功解决Not possible to connect to the Web3 provider. Make sure the provider is running and a connection
  4. shell (7)if 表达式
  5. failed to initialize nvml driver/library version mismatch ubuntu
  6. 在windows上搭建redis集群(Redis-Cluster)
  7. 全阶滑模观测器程序_滑模观测器转子估算程序
  8. Android软键盘弹出引起的各种不适终极解决方案
  9. Ffmpeg下载WINDOWS、MAC编译结果
  10. 【三维路径规划】基于matlab RRT算法无人机三维路径规划【含Matlab源码 1270期】
  11. 一招鲜——交换机配置mstp+vrrp实验
  12. 《21天学通C语言(第7版)》一6.6 课后研习
  13. 技术美术个人笔记(五)——体素距离场及体积雾
  14. java ffmpeg m3u8合片_FFmpeg MP4视频切片成TS m3u8播放系列
  15. 用python如何制作表格_Python中用xlwt制作表格实例讲解
  16. 毕业就去当网红?先听听8位95后网红的口述
  17. Win10 更改不了注册表,重启之后恢复原样
  18. JDBC Driver介绍
  19. 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用
  20. Mask RCNN综述以及建筑物实例分割

热门文章

  1. 在.c文件中调用cuda函数
  2. Linux系统结构 详解
  3. linux中export和source的作用和区别
  4. [云炬创业基础笔记]第六章商业模式测试20
  5. [MATLAB调试笔记]Update the electric field in one step
  6. 台湾大学林轩田机器学习基石课程学习笔记7 -- The VC Dimension
  7. matlab中大括号的使用 { },可以装4维的数据
  8. php ajax 弹窗修改,更改PHP/Ajax脚本来使用Meekrodb?
  9. 3Dslicer2:数据与帮助
  10. Windows下FFTW的安装_史上最全