Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >安卓 App 热补丁动态修复技术介绍

安卓 App 热补丁动态修复技术介绍

原创
作者头像
QQ空间开发团队
修改于 2017-10-31 09:18:34
修改于 2017-10-31 09:18:34
3.4K0
举报

作者:johncz

1.背景

当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就会忙得焦头烂额:重新打包App、测试、向各个应用市场和渠道换包、提示用户升级、用户下载、覆盖安装。有时候仅仅是为了修改了一行代码,也要付出巨大的成本进行换包和重新发布。

这时候就提出一个问题:有没有办法以补丁的方式动态修复紧急Bug,不再需要重新发布App,不再需要用户重新下载,覆盖安装?

虽然Android系统并没有提供这个技术,但是很幸运的告诉大家,答案是:可以,我们QQ空间提出了热补丁动态修复技术来解决以上这些问题。

2.实际案例

空间Android独立版5.2发布后,收到用户反馈,结合版无法跳转到独立版的访客界面,每天都较大的反馈。在以前只能紧急换包,重新发布。成本非常高,也影响用户的口碑。最终决定使用热补丁动态修复技术,向用户下发Patch,在用户无感知的情况下,修复了外网问题,取得非常好的效果。

3.解决方案

该方案基于的是android dex分包方案的,关于dex分包方案,网上有几篇解释了,所以这里就不再赘述,具体可以看这里

简单的概括一下,就是把多个dex文件塞入到app的classloader之中,但是android dex拆包方案中的类是没有重复的,如果classes.dex和classes1.dex中有重复的类,当用到这个重复的类的时候,系统会选择哪个类进行加载呢?

让我们来看看类加载的代码:

一个ClassLoader可以包含多个dex文件,每个dex文件是一个Element,多个dex文件排列成一个有序的数组dexElements,当找类的时候,会按顺序遍历dex文件,然后从当前遍历的dex文件中找类,如果找类则返回,如果找不到从下一个dex文件继续查找。

理论上,如果在不同的dex中有相同的类存在,那么会优先选择排在前面的dex文件的类,如下图:

在此基础上,我们构想了热补丁的方案,把有问题的类打包到一个dex(patch.dex)中去,然后把这个dex插入到Elements的最前面,如下图:

好,该方案基于第二个拆分dex的方案,方案实现如果懂拆分dex的原理的话,大家应该很快就会实现该方案,如果没有拆分dex的项目的话,可以参考一下谷歌的multidex方案实现。然后在插入数组的时候,把补丁包插入到最前面去。

好,看似问题很简单,轻松的搞定了,让我们来试验一下,修改某个类,然后打包成dex,插入到classloader,当加载类的时候出现了(本例中是QzoneActivityManager要被替换):

为什么会出现以上问题呢?

从log的意思上来讲,ModuleManager引用了QzoneActivityManager,但是发现这这两个类所在的dex不在一起,其中:

  1. ModuleManager在classes.dex中
  2. QzoneActivityManager在patch.dex中

结果发生了错误。

这里有个问题,拆分dex的很多类都不是在同一个dex内的,怎么没有问题?

让我们搜索一下抛出错误的代码所在,嘿咻嘿咻,找到了一下代码:

从代码上来看,如果两个相关联的类在不同的dex中就会报错,但是拆分dex没有报错这是为什么,原来这个校验的前提是:

如果引用者(也就是ModuleManager)这个类被打上了CLASS_ISPREVERIFIED标志,那么就会进行dex的校验。那么这个标志是什么时候被打上去的?让我们在继续搜索一下代码,嘿咻嘿咻~,在DexPrepare.cpp找到了一下代码:

这段代码是dex转化成odex(dexopt)的代码中的一段,我们知道当一个apk在安装的时候,apk中的classes.dex会被虚拟机(dexopt)优化成odex文件,然后才会拿去执行。

虚拟机在启动的时候,会有许多的启动参数,其中一项就是verify选项,当verify选项被打开的时候,上面doVerify变量为true,那么就会执行dvmVerifyClass进行类的校验,如果dvmVerifyClass校验类成功,那么这个类会被打上CLASS_ISPREVERIFIED的标志,那么具体的校验过程是什么样子的呢?

此代码在DexVerify.cpp中,如下:

  1. 验证clazz->directMethods方法,directMethods包含了以下方法:
  2. static方法
    1. private方法
    2. 构造函数
  3. clazz->virtualMethods
  4. 虚函数=override方法?

概括一下就是如果以上方法中直接引用到的类(第一层级关系,不会进行递归搜索)和clazz都在同一个dex中的话,那么这个类就会被打上CLASS_ISPREVERIFIED:

所以为了实现补丁方案,所以必须从这些方法中入手,防止类被打上CLASS_ISPREVERIFIED标志。

最终空间的方案是往所有类的构造函数里面插入了一段代码,代码如下:

代码语言:if (ClassVerifier.PREVENT_VERIFY) {
复制
代码语言:txt
AI代码解释
复制
System.out.println(AntilazyLoad.class);

}`

其中AntilazyLoad类会被打包成单独的hack.dex,这样当安装apk的时候,classes.dex内的类都会引用一个在不相同dex中的AntilazyLoad类,这样就防止了类被打上CLASS_ISPREVERIFIED的标志了,只要没被打上这个标志的类都可以进行打补丁操作。

然后在应用启动的时候加载进来.AntilazyLoad类所在的dex包必须被先加载进来,不然AntilazyLoad类会被标记为不存在,即使后续加载了hack.dex包,那么他也是不存在的,这样屏幕就会出现茫茫多的类AntilazyLoad找不到的log。

所以Application作为应用的入口不能插入这段代码。(因为载入hack.dex的代码是在Application中onCreate中执行的,如果在Application的构造函数里面插入了这段代码,那么就是在hack.dex加载之前就使用该类,该类一次找不到,会被永远的打上找不到的标志)

其中:

之所以选择构造函数是因为他不增加方法数,一个类即使没有显式的构造函数,也会有一个隐式的默认构造函数。

空间使用的是在字节码插入代码,而不是源代码插入,使用的是javaassist库来进行字节码插入的。

隐患:

代码语言:txt
AI代码解释
复制
    虚拟机在安装期间为类打上CLASS_ISPREVERIFIED标志是为了提高性能的,我们强制防止类被打上标志是否会影响性能?这里我们会做一下更加详细的性能测试.但是在大项目中拆分dex的问题已经比较严重,很多类都没有被打上这个标志。

如何打包补丁包:

  1. 空间在正式版本发布的时候,会生成一份缓存文件,里面记录了所有class文件的md5,还有一份mapping混淆文件。
  2. 在后续的版本中使用-applymapping选项,应用正式版本的mapping文件,然后计算编译完成后的class文件的md5和正式版本进行比较,把不相同的class文件打包成补丁包。

备注:该方案现在也应用到我们的编译过程当中,编译不需要重新打包dex,只需要把修改过的类的class文件打包成patch dex,然后放到sdcard下,那么就会让改变的代码生效。

文章来源公众号:QQ空间终端开发团队(qzonemobiledev)

相关推荐

微信Android热补丁实践演进之路
【腾讯TMQ】不会做bug分析?套路走起~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
人工智能改变化学领域,机器学习范式加速化学物质发现
虽然工程、金融和商业从新算法中获益匪浅,但获益不仅仅来自算法。几十年来,大规模计算一直是物理科学工具包中不可或缺的一部分 —— 人工智能的一些最新进展已经开始改变科学发现的产生方式。
智药邦
2022/04/13
4060
人工智能改变化学领域,机器学习范式加速化学物质发现
人工智能、机器学习、深度学习的区别在哪?|编译
编者:T 客汇 杨丽 张苏月 关键词:人工智能,机器学习,深度学习 网址:www.tikehui.com 有人说,人工智能(Artificial Intelligence)是未来。人工智能是科幻小说。人工智能已经是我们日常生活的一部分。所有这些陈述都 ok,这主要取决于你所设想的人工智能是哪一类。 例如,今年早些时候,Google DeepMind 的 Alphago 程序击败了韩国围棋大师李世乭九段。人工智能、机器学习和深度学习这些词成为媒体热词,用来描述 DeepMind 是如何获得成功的。尽管三者
人称T客
2018/03/22
7690
人工智能、机器学习、深度学习的区别在哪?|编译
AI for Science:人工智能改变化学领域,机器学习范式加速化学物质发现
选自thegradient 作者:Victor Cano Gil 机器之心编译 编辑:Juniper 随着人工智能技术兴起,在化学领域,传统的基于实验和物理模型的方式逐渐与基于数据的机器学习范式融合。越来越多的用于计算机处理数据表示被开发出来,并不断适应着以生成式为主的统计模型。 虽然工程、金融和商业从新算法中获益匪浅,但获益不仅仅来自算法。几十年来,大规模计算一直是物理科学工具包中不可或缺的一部分 —— 人工智能的一些最新进展已经开始改变科学发现的产生方式。 物理科学领域的杰出成就令人兴奋不已,例如使用
机器之心
2022/03/09
6040
机器学习泰斗迈克尔 · 乔丹:不是什么都叫AI的
选自IEEE Spectrum 作者:Kathy Pretz 机器之心编译 编辑:小舟、张倩 在可预见的未来,计算机对现实世界进行抽象推理的能力还无法匹敌人类。 「人工智能系统还远远不够先进,无法在涉及推理、运用现实世界知识和社交互动等许多任务中替代人类。」机器学习先驱迈克尔 · 欧文 · 乔丹(Michael I.Jordan)说道。 迈克尔 · 欧文 · 乔丹是机器学习领域的权威之一、IEEE Fellow,他为无监督机器学习的发展做出了突出贡献。2016 年,乔丹被《Science》评为「全世界最
机器之心
2023/03/29
3110
机器学习泰斗迈克尔 · 乔丹:不是什么都叫AI的
Nature社论|结构生物学中的人工智能将会继续
2021年7月27日,Nature发表社论,对近期AlphaFold的热点报道进行了点评。
智药邦
2021/08/06
5500
资源 | 人工智能、深度学习、机器学习有什么区别?DL 应用案例全解析(下载)
【新智元导读】对于希望从战略层面洞察人工智能这一领域的企业领袖来说,insideBIGDATA Guide to Deep Learning & Artificial Intelligence是个有用的新资源。它解释了AI、机器学习以及深度学习的区别,审视了AI和HPC的交集,介绍了各个领域中AI和深度学习的精彩应用案例,展示了GPU是如何有效地和AI技术结合在一起的。 这是AI的时代。基于AI的产品大量涌入市场,许多著名厂商已经在产品中整合了AI解决方案:通用电气推行了AI业务Predix,IBM广告里W
新智元
2018/03/27
1.2K0
资源 | 人工智能、深度学习、机器学习有什么区别?DL 应用案例全解析(下载)
三大技术基础推动人工智能走向实用
人工智能从幕后走向实用离不开人工智能技术取得的突破和发展。在互联网时代背景下,大数据、新型高性能计算架构以及深度学习帮助人工智能技术实现了从量变到质变的转变。其中,计算机视觉、语音识别技术均已能够规模
用户1332428
2018/03/08
1.7K0
三大技术基础推动人工智能走向实用
人工智能的过去、现在和未来
人工智能(Artificial Intelligence,AI)是指计算机像人一样拥有智能能力,是一个融合计算机科学、统计学、脑神经学和社会科学的前沿综合学科,可以代替人类实现识别、认知,分析和决策等多种功能。如当你说一句话时,机器能够识别成文字,并理解你话的意思,进行分析和对话等。
小莹莹
2018/07/24
1.4K0
人工智能的过去、现在和未来
机器学习快速粉碎摩尔定律,医院已开始摘取AI低枝果实
【新智元导读】在几位医疗行业知名人士的眼中,AI 在这一领域的发展比预想的更快。有远见的医院已开始部署 AI 技术,使用了诸如患者自动诊疗、智能信息推荐、智能账单等等比较容易实现的 AI 应用。正如他们在医学和基因组学领域看到的那样,“机器学习的改进速度远超摩尔定律所描述的芯片改进速度。” 眼下精明的医院已经开始在特定用例中部署 AI、认知计算和机器学习方面的应用了。医疗行业的知名人士预测,AI 在这一领域的发展将比此前预想的更快。 Health Catalyst 的执行副总裁 Dale Sanders
新智元
2018/03/28
8500
对话机器学习教父Tom Mitchell:人工智能会不会出现第三次衰退?
AI科技评论按:4月27日,GMIC 2017(全球移动互联网大会)北京站开幕。卡内基梅隆大学计算机科学学院机器学习系主任 Tom Mitchell 接受了媒体的采访。他就人工智能的发展趋势、人才培养
AI科技评论
2018/03/12
1.1K0
对话机器学习教父Tom Mitchell:人工智能会不会出现第三次衰退?
探索自然本源!谷歌2022年终总结第七弹:「生化环材」如何吃上机器学习红利?
---- 新智元报道   编辑:LRS 【新智元导读】让人造的计算机帮我们解开自然的奥秘。 随着机器学习和量子计算的巨大进步,我们现在有了更强大的新工具,能够以新的方式与各行业研究者合作,并从根本上加速突破性科学发现的进展。 本期谷歌年终总结的主题是「自然科学」,文章作者为谷歌研究院的杰出科学家John Platt,1989年博士毕业于加州理工大学。 往期链接: 1. 超详超硬Jeff Dean万字总结火热出炉!图解谷歌2022年AIGC、LLM、CV三大领域成就 2. 谷歌2022年度回顾:让A
新智元
2023/02/27
3400
探索自然本源!谷歌2022年终总结第七弹:「生化环材」如何吃上机器学习红利?
谷歌新人工智能工具可准确构建基因组图像
2017年12月,谷歌发布了一款新的人工智能工具,可利用基因测序数据准确地构建人类的基因组图像。 虽然科学家在约十五年前就已经首次完成人类基因组的测序工作,但在十五年后的今天,理解编码人类生命的海量数据仍然是艰难挑战,而这正是机器学习技术擅长解决的那类问题。 谷歌于2017年12月4日星期一发布了一款名为DeepVariant的工具。该工具使用最新的人工智能(AI)技术,通过测序数据构建更加准确的人类基因组图像。 DeepVariant可帮助将高通量测序读数转换为全基因组图像。它会自动识别测序数据中的小
企鹅号小编
2018/02/12
7990
谷歌新人工智能工具可准确构建基因组图像
Science|用人工智能学习生命语言
2025年1月30日,Science发表文章Learning the language of life with AI。文章主要讲述了人工智能通过构建生命大语言模型(LLLM)破解了从蛋白质折叠到基因调控、细胞运作的多维度生命密码,正在将生物学从观察科学转化为可设计、可编程的工程科学,开启生物医学研究、药物开发和生命本质认知的革命性时代。
智药邦
2025/02/19
1480
Science|用人工智能学习生命语言
人工智能与机器学习:两者有何不同?
在过去几年,人工智能和机器学习频繁出现在技术新闻和各种网站上。两者常常被用作同义词,但许多专家认为它们存在微妙且重大的区别。 当然,专家们自己有时对于那些区别到底是什么也意见不一。 然而一般来说,有两
CDA数据分析师
2018/02/08
1.4K0
人工智能与机器学习:两者有何不同?
Drug Target Review | 人工智能(AI)在基因组学中的作用
人工智能在包括基因组学在内的许多研究领域中都有应用。阿斯利康(AstraZeneca)的斯拉夫·彼得罗夫斯基(SlavéPetrovski)揭示了如何在人类基因组研究中使用AI及其在未来的发展。
DrugAI
2021/01/29
6450
【干货】不容错过的 30 个机器学习视频、教程&课程
导读:下面是 Analytics Vidhya 网站发表的文章,汇集了 2016 年机器学习经典视频、教材和课程,分类整理,初学者、进阶级还是资深研究员,都可以从中发现适合的材料。视频只做了展示截图,观看的话请复制文中的链接哦。 目录 第一部分:机器学习入门 怎样在 6 个月内成为数据科学家 CMU统计机器学习课程 滑铁卢大学机器学习课程 Python 应用机器学习课程 导论:Python 数据科学 SciPy 机器学习导论课 Python Pandas 数据分析 CS50 机器学习课程 Pandas 初
钱塘数据
2018/03/02
2.5K0
【干货】不容错过的 30 个机器学习视频、教程&课程
【Nature 封面论文】机器学习掀起材料革命,人工智能或将颠覆人类科研方式
【新智元导读】昨日Nature封面论文:哈佛大学研究者借助机器学习算法,利用“废弃”数据成功预测新材料的合成,引发学界激论:人工智能真能加速发现神奇新材料吗?该研究所用的“计算材料学”结合计算机模型和机器学习,是对传统研究方法的革新。计算机科学和人工智能的影响已经拓展到越来越多的领域,机器学习或将改变未来科研方式。 发现一种新的材料是非常艰难的过程,通常要经历无数次失败,偶尔在机缘巧合之下取得成果,还要费劲功夫反向检测这种新材料的性质。但有一批材料科学家转换思路,使用计算机模型和机器学习算法生成海量假想的材
新智元
2018/03/22
2.8K0
【Nature 封面论文】机器学习掀起材料革命,人工智能或将颠覆人类科研方式
人工智能与大学数学是“近亲”
作者 | 赛氪考研 整理 | AI科技大本营(rgznai100) 人工智能,作为计算机科学的一个分支,在过去的几年实现了爆炸式发展。2016年Google DeepMind的AlphaGo打败了韩国的围棋大师李世石九段,让人工智能赢得了前所未有的关注。 人工智能的发展,主要得意于三个方面: GPU的发展使并行计算变得速度更快、成本更低、性能更强大; 深度学习算法大大提升了人工智能在语音、图像处理等应用层面的准确度; 与此同时,存储设备的容量变得越来越大,而我们正获得海量数据(即大数据的发展),无论是图
AI科技大本营
2018/04/27
1.4K1
人工智能与大学数学是“近亲”
人们都在说人工智能,其实现在我们真正做的是智能增强
自20世纪50年代以来,人工智能(The Artificial Intelligence / AI)与智能增强(Intelligence Augmentation / IA)之间的争论已经持续了半个多世纪。一般来说,智能增强指的是利用信息技术增强人类能力。这个想法自1950年被首次提出后,现在已经变得无处不在。如今人工智能越来越多地被用于广泛描述那些能够模仿人类功能(比如学习和解决问题)的机器,但它最初所建立的前提条件是:人类智能可以被精确描述,并能够用于所有制造的机器进行模拟。人工通用智能(Artific
GPUS Lady
2018/04/02
1K0
人们都在说人工智能,其实现在我们真正做的是智能增强
【机器学习】机器学习引领AI:重塑人类社会的新纪元
随着科技的飞速发展,机器学习作为人工智能(AI)的核心驱动力,正在以前所未有的速度重塑人类社会的各个方面。从医疗诊断、金融决策,到智能家居、自动驾驶,AI已经不再是遥不可及的未来科技,而是成为了我们日常生活中不可或缺的一部分
Eternity._
2024/06/14
2850
【机器学习】机器学习引领AI:重塑人类社会的新纪元
推荐阅读
相关推荐
人工智能改变化学领域,机器学习范式加速化学物质发现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档