使用AndFix实现Android热修复
2016-07-21 19:04
691 查看
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是阿里巴巴开源项目。
Android上如何使用
1.在自定义Application中初始化,为了更早的修复应用中的bug。package com.demo.xiep.andfixdemo; import android.app.Application; import android.content.pm.PackageManager; import android.os.Environment; import android.util.Log; import com.alipay.euler.andfix.patch.PatchManager; import java.io.File; import java.io.IOException; public class AppApplication extends Application { private static final String TAG =AppApplication.class.getSimpleName(); private static final String APATCH_PATH = "/andfixdemo-1.2.0.apatch"; private static final String DIR = "/apatch";//补丁文件夹 private PatchManager mPatchManager; private String appversion; @Override public void onCreate() { super.onCreate(); initAndFix();//初始化AndFix } private void initAndFix() { // 初始化patch 管理类 mPatchManager=new PatchManager(this); try { //获取版本号 appversion= this.getPackageManager().getPackageInfo(getPackageName(), 0).versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } //初始化patch版本 mPatchManager.init(appversion); //加载已经添加到patchManager的patch mPatchManager.loadPatch(); try { // .apatch file path String patchFileString = Environment.getExternalStorageDirectory() .getAbsolutePath() + DIR+APATCH_PATH; Log.e(TAG,"修复包读取路径:"+patchFileString); mPatchManager.addPatch(patchFileString); Log.d(TAG, "apatch:" + patchFileString + " added."); //复制且加载补丁成功后,删除下载的补丁 File f = new File(this.getFilesDir(), DIR + APATCH_PATH); Log.e(TAG,"删除修复包读取路径:"+patchFileString); if (f.exists()) { boolean result = new File(patchFileString).delete(); if (!result) Log.e(TAG, patchFileString + " delete fail"); } } catch (IOException e) { Log.e(TAG, "", e); } } }
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: rgb(102, 0, 102); box-sizing: border-box;">.</span>bat <span class="hljs-attribute" style="box-sizing: border-box;">-f</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); 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: rgb(102, 0, 102); 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: rgb(102, 0, 102); 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: rgb(0, 0, 0); box-sizing: border-box;"><</span><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>apk<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span> :新版本 <span class="hljs-attribute" style="box-sizing: border-box;">-t</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span>old<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>apk<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span> : 旧版本 <span class="hljs-attribute" style="box-sizing: border-box;">-o</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span>output<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span> : 输出目录 <span class="hljs-attribute" style="box-sizing: border-box;">-k</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span>keystore<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span>: 打包所用的keystore <span class="hljs-attribute" style="box-sizing: border-box;">-p</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span>password<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span>: keystore的密码 <span class="hljs-attribute" style="box-sizing: border-box;">-a</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span>alias<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span>: keystore 用户别名 <span class="hljs-attribute" style="box-sizing: border-box;">-e</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span>alias password<span class="hljs-subst" style="color: rgb(0, 0, 0); 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: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">dependency</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">groupId</span>></span>com.alipay.euler<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">groupId</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">artifactId</span>></span>andfix<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">artifactId</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">version</span>></span>0.3.1<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">version</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">type</span>></span>aar<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">type</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">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="box-sizing: border-box; color: rgb(0, 0, 136);">dependencies</span> { <span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">compile</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'com.alipay.euler:andfix:0.3.1<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@aar</span>'</span> }</code>将生成的补丁放到指定服务器上。(这里我放到了七牛上)
注:从服务器获取到修复包以后,需将修复包下载至在内存apatch文件中方可生效:
http://blog.csdn.net/lmj623565791/article/details/49883661/
demo下载地址:
http://download.csdn.net/detail/u010963246/9582658
相关文章推荐
- Android初级教程反射+AIDL+内容观察者监控黑名单号码代码模板
- Android初级教程反射+AIDL+内容观察者监控黑名单号码代码模板
- Android开发:计算缓存大小并且清空缓存
- 一步步理解Android事件分发机制
- Android编码命名规范
- Android 不同应用通过SharedPreference实现共享数据
- Android Binder 设计与实现
- Andorid之地理定位权限的在M之前和之后获取表现
- Android遮罩实现图片不规则的显示
- Android中自定义样式与View的构造函数中的第三个参数defStyle的意义
- ToggleButton的使用
- Android源码解析系列
- android广播动态监听一般设置的状态
- Android Picasso的基本使用
- android SDK manager 无法获取更新版本列表
- Android View 点击事件的分发机制
- android byte字节数组转换十六进制字符串
- Android 读取<meta-data>元素的数据
- 转:国内Top500Android应用分析报告
- adb logcat指令参数详解