继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【九月打卡】第17天 Android 热更新面试问题

GT9456
关注TA
已关注
手记 89
粉丝 12
获赞 17

课程名称BAT大牛亲授技能+技巧 Android面试快速充电升级
课程章节:Android基础相关面试问题
主讲老师DocMike

课程内容

热更新流程

热更新是 App 开发者常用的一种更新方式。它能很好的弥补重新发版的不足,比如发版需要应用商店审核导致更新周期变长,需要用户手动安装等。通过热更新修复 bug,更新时不需要用户再次安装。通常热更新需要经历以下的过程。

  1. 线上检测到严重的 crash,急需处理;
  2. 从生产分支拉出 bugfix 分支,并在分支上修复问题;
  3. 通过 Jenkins 构建和生成补丁;
  4. 验证通过后,app 通过推送或者主动拉取的方式下载补丁文件;
  5. 将 bugfix 的代码合并到开发分支和生产分支;

主流热更新框架

  1. Dexposed,是基于 Xposed 的 AOP 框架,方法级粒度,可以进行AOP 编程、插桩、热补丁、SDK hook 等功能。通过修改 Android Dalvik 运行时的 Zygote 进程,并使用 Xposed Bridge 来 hook 方法并注入自己的代码,实现非侵入式的 runtime 修改。

  2. AndFix,同样是方法的 hook,AndFix 不像 Dexposed 从 Method 入手,而是以 Field 为切入点,Dalvik 和 Art 都支持。

  3. Nuwa,Nuwa 的实现分为 Gradle 插件和 SDK 两部分。插件部分负责编译补丁包, SDK 部分负责具体打补丁。

热修复原理

Android 中类加载的过程是使用 PathClassLoader 类作为 Android 的默认的类加载器,PathClassLoader 其实实现的就是简单的从文件系统中加载类文件。通过遍历dexElements 列表,然后通过调用 element.dexFile 对象上的loadClassBinaryName() 方法来加载类,如果返回值不是 null,就表示加载类成功,会将这个Class对象返回。而 dexElements 对象是在 DexPathList 类的构造函数中完成初始化的。makeDexElements 所做的事情就是遍历我们传递来的 dexPath,然后一次加载每个 dex 文件。

热修复的原理是通过更改含有 bug 的 dex 文件的加载顺序,在 dex 的加载中,若已找到方法则不会继续查找,所以如果能让修复之后的方法在含有 bug 的方法之前加载就能达到修复 bug 的目的。把有问题的类修复后,放到一个单独的 dex,通过反射插入到dexElements 数组的最前面,让虚拟机优先加载打完补丁的 class。

课程收获

这一章介绍了几种热更新的框架,除了老师介绍的几个热更新框架,还有 Tinker、Robust 等等。热更新框架只能作为紧急修复线上问题的一种手段。实际的项目中面对的情况很复杂,不能因为有了热更新框架,就放松了对产品质量的要求。还是要尽量把问题,在开发测试阶段解决掉。

图片描述

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP