请选择 进入手机版 | 继续访问电脑版

HTML5星空

谈谈所谓热更新

[复制链接]
发表于 2017-9-1 10:20:19 | 显示全部楼层 |阅读模式

谈谈所谓插件化热更新

介绍

  插件化 apk 分为宿主和插件部分,插件在需要的时候才加载进来

  热修复 更新的类或者插件粒度较小的时候,我们会称之为热修复,一般用于修复bug

  热更新 2016 Google 的 Android Studio 推出了Instant Run 功能 同时提出了3个名词

“热部署” 方法内的简单修改,无需重启app和Activity。 

“暖部署” app无需重启,但是activity需要重启,比如资源的修改。 

“冷部署” app需要重启,比如继承关系的改变或方法的签名变化等。

所以站在app开发者角度的“热”是指在不发版的情况来实现更新,而Google提出的“热”是指值是否需要重新启动。 同时在开发插件化的时候也有两种情景,一种是插件与宿主apk没有交互,只是在用户使用到的时候进行一次吊起,还有一种是与宿主有很多的交互。

为什么要用热更新


Android 不仅系统版本众多,机型众多,而且各个市场都各有各的政策和审核速度,每次发布一个版本对于开发同学来讲都是一种漫长的煎熬。相比于iOS 两三天就能达到 80% 的覆盖速度而言,Android 应用版本升级至少需要两周才能达到 80% 的升级率,严重阻碍了版本迭代速度。也导致市场上 App 版本分散,处理 bug 和投诉等也越来越麻烦。

  • 修复的 bug 需要等待下个版本发布窗口才能发布?

  • 已经 ready 的需求排队上线,需要等待其他 Feature Team 合入代码?

  • 老版本升级速度慢?频繁上线版本提醒用户升级,影响用户体验?

这几个问题是每个 App 开发同学都必然要面对的。那么有没有方法能在用户无感知的情况下加速 bug 处理和版本迭代速度?


      近一两年 Android 热补丁框架非常热门。从最初 360 动态下发 lua 脚本,到后来出现的各种方案,如雨后春笋般出现。早期的补丁框架偏向于以代码修复为主,主要分为两大类:native hook 方案和 Multidex 方案。

      native hook 方案如阿里巴巴的 AndFix 和 Dexposed。Multidex 方案如 Qzone。切入点都是替换掉将要执行的代码。基于 Qzone 方案的思路,出现了 nuwa 这个比较完善的库,工具链比较完善。

基本知识


1.阿里的热更新框架已经开源 了。但已经很久没有更新过新版本了。当前的版本只支持到了 Android 4.4。由于 5.0 起新的 ART 虚拟机、更严格的 SELinux 策略以及对 64 位的支持之类的事,使得 Xposed 都在开发上做了很多调整。我不知道 Dexposed 现在是否支持,但至少阿里没有开源。

2.在本地动态执行远端下发的代码是极度危险的行为。利用此方法执行非法代码等或用于绕过 Google Play 等市场的审查是违反相关协议的,也是对用户极度不负责任的行为。

3.在一些访问非常密集的地方使用热更新可能会对效率产生相对比较大的影响,应该避免使用.

4.我们可以对 Java 的 ScriptEngine 进行一些封装成为一个 HotPatch 类使得它更适合做热更新的工作。

5.首先,检查热更新补丁的管道一定要建立在 https 上,因为下发代码是极其危险的,如果被劫持,后果是无法想象的。其次,请求时最好自动带上 Android 版本、手机型号、地区、版本号等信息,以方便更精确地下发,千万不能下发错。

6.Java在运行时加载对应的类是通过ClassLoader来实现的,ClassLoader本身是一个抽象来,Android中使用PathClassLoader类作为Android的默认的类加载器

7.我们的如果想做hotpatch,一定要保证我们的hotpacth dex文件出现在dexElements列表的前面。

常用热更新

基于QQ空间的HotFix →→ 要使用到android dex分包方案→拆分dex的项目的话,可以参考一下谷歌的multidex方案实现. 

大众点评的NuWa←项目补丁自动化做的很完整 
 alibaba/AndFix

阿里巴巴的DexPosed 
dalvik_patch实现multidex 
使用React-Native实现app热部署的一次实践 
alibaba/AndFix


Advantage

disadavantage

NuWa

1,可以新增类和字段,
2,兼容到6.0系统

1,基本原理是classloader,类加载器
2,不能修改资源文件,如图片布局等(可通过动态布局实现)

AndFix

1,  支持Android2.3到6.0版本

2,  支持arm与x86系统架构

3,  支持dalvik和ART的runtime

4,  不需要重启App即可应用补丁

1,不能新增类和字段,

2,不能修改资源文件,

3,不能修改manifest文件

4,不能新增成员变量

5,不能使用加固后的apk制作pacth文件

框架名称出现时间作者实现简介已知存在问题
AndroidDynamicLoader2012年7月mmin18不使用Activity采用Fragment实现
DynamicAPK携程扩展aapt解决资源问题
android-pluginmghoukx动态创建Activity来实现插件化
DynamicLoadApk2014年底百度工程师 任玉刚通过代理Activity来实现插件化
DroidPlugin2015年8月奇虎360深度hook实现不支持通知栏定制
Small2015年底林光亮比较DroidPlugin轻量一点,脚本来解决资源问题不支持Service插件化
ACCD2015年4月bunnyblueOpenAtlas 之后改为ACCD 携程开源框架参考了这个
nuwa2015年9月贾吉新通过前置相同Dex来实现热修复
AndFix2015年11月阿里使用JNI实现的热修复,针对Davilk和Art调用的方法不同
Dexposed阿里不支持Art虚拟机

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

更多资源及Java+大数据个人原创视频,
可关注本站官方公众号观看:
快讯

     京ICP备14042305号

html5star team © 2012-2013 html5星空 Comsenz Inc.

GMT+8, 2020-7-2 14:25 , Processed in 0.239251 second(s), 36 queries .

快速回复 返回顶部 返回列表