Android热更新之初探

什么是热修复?

热修复提出于2014年,兴起于2016年,尤其是在Instant run 问世以后,各种热修复技术相继涌出。

是一种摆脱传统发版方案直接使用补丁来更新app内容,不需要重新下载安装apk等略过一系列繁琐过程的新兴技术,目前国内部分成熟App都拥有自己的热修复技术,如:手淘、QQ、微信、美团、饿了么等。

热修复有什么优势&为什么要使用热修复?

来看一个场景:公司一个项目A在上线后发现一个严重bug如果不紧急修复可能导致用户流失,这种情况下如果是传统的app更新就很麻烦了大概是这个流程:

这期间重新发版涉及到提交测试环节,这样修复一个bug很不及时,如果使用热修复方案,它将变得很简单:

其优势为:

无需重新发版,简单高效

用户无感知,无需下载新应用,代价小

修复成功率高,挽回用户群体

热修复是如何工作的?

2017年6月手淘联合阿里云正式发布了新一代非侵入式Android热修复方案 - Sophix

它能修复:代码、资源、SO库,下图为Sophix与微信和饿了么热修复技术对比表

从表中我们能知道个大概,就是Sophix似乎更值得使用一下。

分别介绍QQ空间超级不定、微信Tinker和Sophix的前身HotFix各自的工作原理。

首先了解一下apk的执行过程:代码被编译Build后生成apk文件,其实在里面生成了一个classes.dex文件。

我们解压一个apk文件如下图:

这个classes.dex就是所有代码的集合,是一个可执行文件,android运行apk实质是解压apk运行里面的这个的dex文件。

apk首次运行的时候会对这个dex文件进行优化,优化后生成一个odex文件,存在于缓存中,下次再启动就直接打开这个odex文件,达到快速打开目的。而执行apk的过程就是遍历这个dex并作出相应操作的过程,遍历后的dex方法存放在一个Elements数组中,它的长度限制是65536.即日常说的65K.

如果我们apk因为太庞大或者是引用三方库太多导致方法数超过65K,就会报错.

而谷歌已经在Android 5.0开始支持Multdex.

在知道上面信息后,我们谈谈这三家的热修复是如何实现的

1.QQ空间超级补丁:基于DEX分包方案,使用了多DEX加载的原理,大致的过程就是:把BUG方法修复以后,放到一个单独的DEX里,插入到dexElements数组的最前面,让虚拟机去加载修复完后的方法。

当patch.dex中包含Test.class时就会优先加载,在后续的DEX中遇到Test.class的话就会直接返回而不去加载,这样就达到了修复的目的.

2.微信Tinker:微信针对QQ空间超级补丁技术的不足提出了一个提供DEX差量包,整体替换DEX的方案。主要的原理是与QQ空间超级补丁技术基本相同,区别在于不再将patch.dex增加到elements数组中,而是差量的方式给出patch.dex,然后将patch.dex与应用的classes.dex合并,然后整体替换掉旧的DEX文件,以达到修复的目的。

3.AndFix:不同于QQ空间超级补丁技术和微信Tinker通过增加或替换整个DEX的方案,提供了一种运行时在Native修改Filed指针的方式,实现方法的替换,达到即时生效无需重启,对应用无性能消耗的目的。

AndFix与HotFix的关系如下:

AndFix实现原理:

AndFix实现过程:

更详细的说明戳这里:三大流派之简单对比

阿里云Sophix热修复之简单使用

Sophix集成示例:

第一步:找到Project的build.gradle文件,在allProjects节点下加上如下代码:

repositories {          maven { url"http://maven.aliyun.com/nexus/content/repositories/releases"}}

第二步:找到Module的build.gradle文件,添加依赖:

compile'com.aliyun.ams:alicloud-android-hotfix:3.0.7'

然后同步project

第三步:添加权限,SDK使用到以下权限

-->

READ_EXTERNAL_STORAGE/ACCESS_WIFI_STATE 权限属于Dangerous Permissions,自行做好android6.0以上的运行时权限获取

第四步:密钥等配置,在application节点下加入以下配置:

第五步:登录阿里云热修复管理控制台,填入对应3个value

第六步:代码集成

在Application的attachBaseContext方法里加入Sophix初始化

@OverrideprotectedvoidattachBaseContext(Context base){super.attachBaseContext(base);        SophixManager.getInstance().setContext(this)                .setAppVersion(getAppVersion())                .setAesKey(null)                .setEnableDebug(true)                .setPatchLoadStatusStub(newPatchLoadStatusListener() {@OverridepublicvoidonLoad(finalintmode,finalintcode,finalString info,finalinthandlePatchVersion){// 补丁加载回调通知if(code == PatchStatus.CODE_LOAD_SUCCESS) {// 表明补丁加载成功}elseif(code == PatchStatus.CODE_LOAD_RELAUNCH) {// 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;// 建议: 用户可以监听进入后台事件, 然后应用自杀}elseif(code == PatchStatus.CODE_LOAD_FAIL) {// 内部引擎异常, 推荐此时清空本地补丁, 防止失败补丁重复加载SophixManager.getInstance().cleanPatches();                        }else{// 其它错误信息, 查看PatchStatus类说明}                    }                }).initialize();    }@OverridepublicvoidonCreate(){super.onCreate();        ......// queryAndLoadNewPatch不可放在attachBaseContext 中,否则无网络权限,建议放在后面任意时刻,如onCreate中SophixManager.getInstance().queryAndLoadNewPatch();}

自此SDK的集成已经差不多完成,官方给出了很详细的集成方法,官方集成文档

第七步:生成热修复补丁

我们直接看官方文档这里面写的很详细,细到每个设置每个参数都有说明

第八步:调试并发布补丁

首先我们需要上传补丁到阿里云管理后台,点此查看详细操作

接下来是对补丁的调试,点此查看详细操作

调试没毛病后,发布补丁,参考管理后台使用说明的step5

作者:luciandun

链接:https://www.jianshu.com/p/a4bf979cce3b

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,406评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,976评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,302评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,366评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,372评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,457评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,872评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,521评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,717评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,523评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,590评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,299评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,859评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,883评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,127评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,760评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,290评论 2 342

推荐阅读更多精彩内容