android热修复方案概览

android热修复相关的意义就不多说了,最近需求之余在看相关的内容,接下来的文章会抽空分析一下热修复相关的知识点,先来看一下目前比较知名的方案。

热修复方案的类型

从原理上来分大致有以下三类:native方案classloader方案插入静态变量埋点方案

  • native 方案主要强调的是即时生效,主要来自于阿里系:
    Andfix:https://github.com/alibaba/AndFix
    Sophix:阿里最新的热更新方案,通过整体替换ArtMethod提高兼容性,同时结合classloader方案融入冷启动,进行自动切换,可惜未开源。

  • classloader方案的鼻祖来自于QQ空间,但是QQ空间没有开源,这里只列出开源方案,主要来自于腾讯系:
    Nuwa: https://github.com/jasonross/Nuwa
    HotFix:https://github.com/dodola/HotFix
    Tinker: https://github.com/Tencent/tinker

  • 插入静态变量埋点方案最早来源于InstantRun的热部署方案,主要指的是美团的Robust,此外还有蘑菇街的Aceso。
    Robust:https://github.com/Meituan-Dianping/Robust
    Aceso:https://github.com/meili/Aceso

对于整个android系统来说,热修复方案其实是一种逆向行为,无论是哪种方案,都可能存在兼容性问题的,而且每次android新版本发布,尤其对虚拟机等做优化时,基本上都会成为热修复的“坑”。不管别的,热修复里面涉及到的知识点都是值得我们学习的,所以我决定较为系统的学习一下,提升自己的技能。

热修复方案的特点

  • 最突出的优点
    native方案:即时生效,无需重启,这基本上是native方法的唯一优点。
    classloader方案:修复范围广,包括代码,资源,so等均可修复。
    埋点方案:兼容性好

  • 缺点
    native方案:兼容性较差,过于底层,bug不好定位,虽然阿里的sophix进行了修复,我个人认为还是存在兼容性问题的,据同事测试反映,基本上热启动的几率很小,大部分都走的是冷启动方案。
    classloader方案:之前不了解时觉得这个方案除了需要重启生效外,没有其他明显的缺点,后来发现这个方案其实最大的问题在于Art虚拟机不断优化带来的兼容性问题。
    埋点方案:修复范围小,且打patch较复杂,虽然已经实现了自动化patch,也有一些情况自动化patch无法完成或者有误。

热修复方案的选择

大的选择无非就是用别人的还是自己开发。除非公司支持,否则短时间开发出一个稳定的热修复方案是非常不容易的一件事,而且对基础要求比较高,需要不断的实践,填坑。如果选择开源方案,建议选择靠谱的方案,比如Tinker或者Sophix,技术支持做的很好,但是方案确实非常重。至于美团的Robust,技术支持相对做的较差,或者人家就是给大家个思路,没打算做技术支持,我们完全可以参照Robust自行实现一套,我司目前的热修复方案就是参照Robust完成的。

个人建议:如果项目采用的是插件化架构,最好做的彻底点,尽量架空主项目,在主项目中使用类Robust方案,结合动态下发插件;如果是组件化方案,可以考虑接入Tinker或者Sophix,毕竟修复范围要广的多。

热修复研究的意义

native方案:想要弄懂,需要去深入了解虚拟机相关知识,包括虚拟机底层执行类和方法的流程,虽然native方案存在兼容性问题,但是完全可以应用于逆向分析领域,可以和如下的逆向分析开源库归为一类。

  • Xposed(hook鼻祖级神器) https://github.com/rovo89/Xposed
  • substrate(底层hook神器) http://www.cydiasubstrate.com
  • legend(java版andfix) https://github.com/asLody/legend
  • epic(andfix变种,利用java层的Method替换代替ArtMethod替换) https://github.com/tiann/epic
    YAHFA(Yet Another Hook Framework for ART,类andfix) https://github.com/rk700/YAHFA

classloader方案:涉及到MultiDex,InstantRun,类加载器原理,dalvik的dexopt,art的dexoat等知识

埋点方案:涉及到InstantRun及字节码相关技术。

这篇文章只是作为一个基本的介绍,不涉及任何原理。从下一篇文章开始具体介绍各个方案的技术点。

目前本人在公司负责热修复相关的工作,主要是基于robust的热修复相关工作。感兴趣的同学欢迎进群交流。


android热修复方案概览_第1张图片
image.png

你可能感兴趣的:(android热修复方案概览)