听说”双11”是这么解决线上bug的
听说”双11”是这么解决线上bug的
--Android线上热修复的使用与原理
预备知识和开发环境
Android NDK编程
AndFix浅析
Android线上热修复的原理大同小异。这里仅仅针对眼下最火的框架AndFix进行解说。主要从AndFix的使用、原理以及优缺点三个方面进行阐述。
使用方式
介绍
AndFix是一个AndroidApp的在线热补丁框架。
使用此框架,我们可以在不反复发版的情况下,在线改动App中的Bug。AndFix就是 “AndroidHot-Fix”的缩写。
就眼下来说,AndFix支持Android2.3到6.0版本号。而且支持arm与X86系统架构的设备。完美支持Dalvik与ART的Runtime。眼下已经应用到支付宝上。是比較成熟的hot-fix框架。
AndFix 的补丁文件是以.apatch 结尾的文件。(来源:网络)
接入流程图:
接入步骤
1) Maven或Gradle下载aar或直接引入源代码
Maven:
<dependency>
<groupId>com.alipay.euler</groupId>
<artifactId>andfix</artifactId>
<version>0.3.1</version>
<type>aar</type>
</dependency>
Gradle:
dependencies {
compile 'com.alipay.euler:andfix:0.3.1@aar'
}
2) 初始化PatchManager
patchManager = new PatchManager(context);
patchManager.init(appversion);//current version
3) 载入补丁包
patchManager.loadPatch();
4)存在新补丁包
patchManager.addPatch(path);//path of the patch file that was downloaded
5)删除全部补丁包
patchManager.removeAllPatch();
制作apatch文件
1) 工具 :apkpatch(Github下载)
2) 使用方式
打补丁命令:
usage: apkpatch -f <new> -t <old> -o <output> -k <keystore> -p <***> -a <alias> -e <***>
-a,--alias <alias> keystore entry alias.
-e,--epassword <***> keystore entry password.
-f,--from <loc> new Apk file path.
-k,--keystore <loc> keystore path.
-n,--name <name> patch name.
-o,--out <dir> output dir.
-p,--kpassword <***> keystore password.
-t,--to <loc> old Apk file path.
合并补丁命令:
usage: apkpatch -m <apatch_path...> -o <output> -k <keystore> -p <***> -a <alias> -e <***>
-a,--alias <alias> keystore entry alias.
-e,--epassword <***> keystore entry password.
-k,--keystore <loc> keystore path.
-m,--merge <loc...> path of .apatch files.
-n,--name <name> patch name.
-o,--out <dir> output dir.
-p,--kpassword <***> keystore password.
举例:
两个apk文件,一个有问题,一个把问题攻克了,如图:
打开cmd,cd到apktool所在路径。运行例如以下命令:
回车,在C:\Users\xiayong\Desktop\HotFixTest\result文件夹下生成例如以下文件
当中,out.apatch便是我们须要的补丁文件。
代码混淆
-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
native <methods>;
}
疑问
1、.apatch 文件下载下来以后的存储位置应该在哪里?
2、.apatch文件删除了还有效果吗?
3、hot-fix的安全性怎么保证?
带着疑问,请看原理分析~
原理剖析
原理图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
一句话说明:找到问题安装包中出错的Method,用.apatch文件里修复过的Method进行替换。
举个栗子:
演示代码来源:https://github.com/THEONE10211024/HotFixDemo
.apatch文件:
.apatch文件是hot-fix的关键,那么.apatch文件又是一个什么东西呢?以下。我们来重点分析一下.apatch文件。
1. apatch文件实际上是一个压缩文件
解压apatch文件。一探到底:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
包括了一个dex文件和一个目录。先看看目录里都有什么文件
重点是PATCH.MF文件,用记事本打开。
AndFix首先会读取这个文件中面的东西。保存在Patch类的一个对象里,备用。
再看看classes.dex文件。
用反编译工具反编译后。我们会看到类似例如以下的文件:
分析好了apatch文件,接下来我们一步步看AndFix是怎么修复的。
把AndFix接入自己的APP仅仅须要四行代码:
mPatchManager = new PatchManager(this);
mPatchManager.init("1.0");
mPatchManager.loadPatch();
mPatchManager.addPatch(patchFileString);
1、mPatchManager = new PatchManager(this);
初始化一些以后会使用的对象。(详见代码)
2、mPatchManager.init("1.0");
首先推断传入的版本号号“1.0”是否是已有补丁相应的版本号号。
不是,说明APP版本号已经升级。须要把老版本号的clean掉。然后初始化补丁包:遍历APP的私有文件夹(/data/data/xxx.xxx.xxx/file/apatch)下全部文件,找到以“apatch”为后缀的文件。解析文件->读取文件必要信息(主要是PATCH.MF中)->存放在mPatchs(类型:SortedSet<Patch>)中。
3. mPatchManager.loadPatch();
遍历mPatchs,针对每一个补丁文件:安全校验->解析dex->载入类->找到含有MethodReplace注解的方法->hook替换。
核心的hook替换是调用C++实现的:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
Dalvik虚拟机:
Art虚拟机:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
Art虚拟的原理与Dalvik不一样。Art主要是改动“ArtMethod”的属性,让虚拟机“误觉得”改动后的方法即是原来的方法。
以5.0为例:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
优势与亮点
1. 提炼精华,简洁,轻便,适配广。完美的支持了Android 2.3到6.0系统,以及x86框架,机型覆盖率广。提供依据两个apk生成patch的工具,因而使用者仅仅需正向编程,通过工具生成patch文件。下发给client就可以,编程效率高。是完好的、高可用的热修复方案。
2. 与业界其它方案对照:QQ空间、大众点评等採用的是动态载入dex方式。
“后者纯java实现,但须要hack类的优化流程。将打CLASS_ISPREVERIFIED标签的类,去除此标签。以解决类与类引用不在一个dex中的异常问题。
这会放弃dex optimize对启动执行速度的优化。
原则上,这对于方法数没有大到须要multidex的应用。损失更明显。而前者不触犯原有的优化流程,仅仅点杀须要hook的方法,更为纯粹、有效。
”
不足与缺陷
1. 只支持android 方法的替换,不支持资源文件、xml的修复
2. 慎用android:onClick="showToast"形式的事件注冊。
3. 有人反应和“EventBus”不兼容。(自己測试良好)
4. 有人反应fix之后部分手机出现ANR。(自己遇见过)
集成注意事项
1. 两手准备:一旦发现问题。
1)server下发补丁包;2)server上把有问题的包替换成最新包
2. 注意避免本地多次拉取补丁包。假设x版本号存在y补丁。则不再下载该补丁。
资料链接
1) google的NDK样例
https://github.com/googlesamples/android-ndk
2) 几个开源热修复或插件化解决方式(排名不分先后)
https://github.com/lzyzsd/AndroidHotFixExamples
https://github.com/simpleton/dalvik_patch
https://github.com/dodola/HotFix
https://github.com/jasonross/Nuwa
https://github.com/alibaba/AndFix
https://github.com/rovo89/Xposed
https://github.com/alibaba/dexposed
https://github.com/bunnyblue/DroidFix
https://github.com/CtripMobile/DynamicAPK
3) 技术原理博客(排名不分先后)
p=781">http://bugly.qq.com/blog/?p=781
https://m.oschina.net/blog/308583(Android Dex分包方案)
http://lirenlong.github.io/hotfix/(浅析xposed、dexposed和AndFix的原理)
http://blog.csdn.net/lmj623565791/article/details/49883661(鸿洋)
http://blog.csdn.net/vipzjyno1/article/details/21039349/(android反编译)
听说”双11”是这么解决线上bug的的更多相关文章
- 线上bug的解决方案--带来的全新架构设计
缘由 本人从事游戏开发很多年一直都是游戏服务器端开发. 因为个人原因吧,一直在小型公司,或者叫创业型团队工作吧.这样的环境下不得不逼迫我需要什么都会,什么做. 但是自我感觉好像什么都不精通..... ...
- 程序员如何描述清楚线上bug
案例 一个管理后台的bug,把操作记录中的操作员姓名,写成了该操作员的id.原因是修改了一个返回操作人姓名的函数,返回了操作人的id.但是还有其他地方也用这个函数,导致其他地方把姓名字段填写成了操作员 ...
- 线上bug分析
昨天下午大神把组内几十号人召集在一起开Online bug分析大会,主要是针对近期线上事故从事故原因和解决方案两个维度来分析. 对金融软件来说,每一次的线上事故都有可能给公司带来重大的损失,少扣了用户 ...
- 线上bug或故障界定及填写规范
[线上故障与线上Bug界定] 一.线上故障: 1. 故障参照公司规范稍做调整: a) 1级故障:资讯首页或主App首页无法打开:多条业务线同时不可用:超过15分钟: b) ...
- 关于线上bug
之所以想写下线上bug,因为发觉有些公司对线上bug的处理是比较严格甚至是很苛刻,涉及到的相关人可能会因此而背黑锅. 之所以会存在这样情况,因为公司各部门都有关联,特别是用户.老板的投诉,也给公司会造 ...
- 「日常开发」记一次因使用Date引起的线上BUG处理
生活中,我们需要掌控自己的时间,减少加班,提高效率:日常开发中,我们需要操作时间API,保证效率.安全.稳定.现在都2020年了,了解如何在JDK8及以后的版本中更好地操控时间就很有必要,尤其是一次线 ...
- 线上BUG:MySQL死锁分析实战
原文链接:线上BUG:MySQL死锁分析实战 1 线上告警 我们不需要关注截图中得其他信息,只要能看到打印得org.springframework.dao.DeadlockLoserDataAcces ...
- 出现线上bug,测试人能做些什么?
测试奇谭,BUG不见. 大家好,我是谭叔. 一提到线上问题,很多测试小白要么"原则性"恐惧,要么憨憨如也,不知如何下手. 本篇文章,我再细化下这道常见的面试题,跟大家捋捋发生线上问 ...
- 记一次线上bug排查-quartz线程调度相关
记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...
随机推荐
- [BZOJ 1718] Redundant Paths
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1718 [算法] 用Tarjan算法找出所有e-DCC(边-双联通分量),然后将这张图 ...
- 理解了这些词句涵义用法等,你就熟练ES6了。
let const 块级作用于 暂时性死区 解构赋值:变量的解构赋值.对象的解构赋值.字符串的解构赋值.数值和布尔值的解构赋值. String的扩展 正则表达式的扩展 Number的扩展 Array的 ...
- PCB Genesis脚本C#使用WPF窗体实现方法
用C#写脚本做UI界面基本上都是用WinForm界面,如果想制作很漂亮动态的界面用WPF界面挺不错的选择, 这里介绍如何使用控制台程序调用WPF窗口 一.方法一 在控制台程序中,通过Main方法启动W ...
- 模拟Queue(wait/notify)
BlockingQueue:顾名思义,首先它是一个队列,并且支持阻塞的机制,阻塞的放入和得到数据.我们要实现LinkedBlockingQueue下面的两个方法put和take. put(anObje ...
- BN 详解和使用Tensorflow实现(参数理解)
Tensorflow BN具体实现(多种方式): 理论知识(参照大佬):https://blog.csdn.net/hjimce/article/details/50866313 补充知识: ① ...
- 【HDU1698】 Just a Hook 【线段树入门】
原题:原题链接 题意:(机器翻译的...) 让我们将钩子的连续金属棒从1到N编号.对于每次操作,Pudge可以将连续的金属棒(从X到Y编号)改为铜棒,银棒或金棒. 钩的总值计算为N个金属棒的值的总和. ...
- POJ 1082---->一个神一般的题
代码只有10行,反正我是看了题解才知道的. 嗯 首先 看到这个题, BFS+一堆判断(什么平年闰年跨年各种乱搞肯定能搞出来,但是Code length就不一定了)... 然后呢 就看到了这个题解 从后 ...
- CSS命名规则和如何命名
CSS命名规则 头:header 内容:content/containe 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper 左右中:l ...
- amcharts简单demo(仪表盘)
最近项目中展示数据有用到amcharts,一个小demo例子. <script src="<%=basePath%>amchart/amcharts.js" ty ...
- OC对象的本质及分类
Object-C的底层都是通过C/C++来实现的,所以OC中的对象也会转化成C/C++中的某一个数据结构, 我们在终端里通过指令 xcrun -sdk iphoneos clang -arch arm ...