【移动应用开发技术】2019 深入解析Android热修复技术_第1页
【移动应用开发技术】2019 深入解析Android热修复技术_第2页
【移动应用开发技术】2019 深入解析Android热修复技术_第3页
【移动应用开发技术】2019 深入解析Android热修复技术_第4页
【移动应用开发技术】2019 深入解析Android热修复技术_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】2019深入解析Android热修复技术

通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单描述一下Tinker的框架结构。什么是热修复?热修复框架分类技术原理及特点Tinker框架解析各框架对比图总结正常开发流程https://upload-images.jianshu.io/upload_images/14847428-6fcac9b8292a263c?imageMogr2/auto-orient/striphttps://upload-images.jianshu.io/upload_images/14847428-800f660c9ac114e2?imageMogr2/auto-orient/strip热修复优势https://upload-images.jianshu.io/upload_images/14847428-bebf2ab515584603?imageMogr2/auto-orient/strip修复什么?https://upload-images.jianshu.io/upload_images/14847428-165a5d7d51351616?imageMogr2/auto-orient/strip现状:百花齐放百家争鸣https://upload-images.jianshu.io/upload_images/14847428-4a7bcc2f46c27a12?imageMogr2/auto-orient/strip简单分类;https://upload-images.jianshu.io/upload_images/14847428-7421c115c980ad94?imageMogr2/auto-orient/strip更合理的分类;https://upload-images.jianshu.io/upload_images/14847428-342465ddf97d4777?imageMogr2/auto-orient/strip3.1阿里Dexposed--native解决方案原理:直接在native层进行方法的结构体信息对换,从而实现完美的方法新旧替换,从而实现热修复功能他的思想完全来源于Xposed框架,完美诠释了AOP编程,这里用到最核心的知识点就是在native层获取到指定方法的结构体,然后改变他的nativeFunc字段值,而这个值就是可以指定这个方法对应的native函数指针,所以先从Java层跳到native层,改变指定方法的nativeFunc值,然后在改变之后的函数中调用Java层的回调即可。实现了方法的拦截功能。基于开源框架Xposed实现,是一种AOP解决方案只HookApp本身的进程,不需要Root权限https://upload-images.jianshu.io/upload_images/14847428-57b80d75ff33ac3b?imageMogr2/auto-orient/striphttps://upload-images.jianshu.io/upload_images/14847428-7fae8bd84daf36a7?imageMogr2/auto-orient/striphttps://upload-images.jianshu.io/upload_images/14847428-6a14d74fe7ee5426?imageMogr2/auto-orient/strip优点:即时生效不需要任何编译器的插桩或者代码改写,对正常运行不引入任何性能开销。这是AspectJ之类的框架没法比拟的优势;对所改写方法的性能开销也极低(微秒级),基本可以忽略不计;从工程的角度来看,热补丁仅仅是牛刀小试,它真正的威力在于『线上调试』;基于Xposed原理实现的AOP不仅可以hook自己的代码,还可以hook同进程的AndroidSDK代码,这也就可以让我们有能力在App中填上Google自己挖的坑。缺点:Dalvik上近乎完美,不支持ART(需要另外的实现方式),所以5.0以上不能用了;最大挑战在于稳定性与兼容性,而且native异常排查难度更高;由于无法增加变量与类等限制,无法做到功能发布级别;3.2阿里AndFix--native解决方案原理:与Dexposed一样都基于开源框架Xposed实现,是一种AOP解决方案优点:即时生效支持dalvik和art(AndFixsupportsAndroidversionfrom2.3to7.0,bothARMandX86architecture,bothDalvikandARTruntime,both32bitand64bit.)与Dexposed框架相比AndFix框架更加轻便好用,在进行热修复的过程中更加方便了缺点:面临稳定性与兼容性问题AndFix不支持新增方法,新增类,新增field等AndFix(Dexpsed)框架不稳定的原因(痛点)https://upload-images.jianshu.io/upload_images/14847428-8559a691441eef82?imageMogr2/auto-orient/striphttps://upload-images.jianshu.io/upload_images/14847428-2d297bf2d2a00c21?imageMogr2/auto-orient/strip原理:原理是Hook了ClassLoader.pathList.dexElements[]。因为ClassLoader的findClass是通过遍历dexElements[]中的dex来寻找类的。当然为了支持4.x的机型,需要打包的时候进行插桩。越靠前的Dex优先被系统使用,基于类级别的修复https://upload-images.jianshu.io/upload_images/14847428-43de3722b03c8244?imageMogr2/auto-orient/strip优点:不需要考虑对dalvik虚拟机和art虚拟机做适配代码是非侵入式的,对apk体积影响不大缺点:需要下次启动才会生效最大挑战在于性能,即Dalvik平台存在插桩导致的性能损耗,Art平台由于地址偏移问题导致补丁包可能过大的问题虚拟机在安装期间为类打上CLASS_ISPREVERIFIED标志是为了提高性能的,我们强制防止类被打上标志是否会影响性能?这里我们会做一下更加详细的性能测试.但是在大项目中拆分dex的问题已经比较严重,很多类都没有被打上这个标志。插桩方案性能上的痛点:https://upload-images.jianshu.io/upload_images/14847428-6fb205e418da11df?imageMogr2/auto-orient/strip3.4美团Robust--InstantRun热插拔原理原理:Robust插件对每个产品代码的每个函数都在编译打包阶段自动的插入了一段代码,插入过程对业务开发是完全透明编译打包阶段自动为每个class都增加了一个类型为ChangeQuickRedirect的静态成员,而在每个方法前都插入了使用changeQuickRedirect相关的逻辑,当changeQuickRedirect不为null时,可能会执行到accessDispatch从而替换掉之前老的逻辑,达到fix的目的。https://upload-images.jianshu.io/upload_images/14847428-c7b465ce03a6b039?imageMogr2/auto-orient/strip优点:几乎不会影响性能(方法调用,冷启动)支持Android2.3-8.x版本高兼容性(Robust只是在正常的使用DexClassLoader)、高稳定性,修复成功率高达99.9%补丁实时生效,不需要重新启动支持方法级别的修复,包括静态方法支持增加方法和类支持ProGuard的混淆、内联、优化等操作缺点:代码是侵入式的,会在原有的类中加入相关代码so和资源的替换暂时不支持会增大apk的体积,平均一个函数会比原来增加17.47个字节,10万个函数会增加1.67M。会增加少量方法数,使用了Robust插件后,原来能被ProGuard内联的函数不能被内联了3.5微信Tinker原理:服务端做dex差量,将差量包下发到客户端,在ART模式的机型上本地跟原apk中的classes.dex做merge,merge成为一个新的merge.dex后将merge.dex插入pathClassLoader的dexElement,原理类同Q-Zone,为了实现差量包的最小化,Tinker自研了DexDiff/DexMerge算法。Tinker还支持资源和So包的更新,So补丁包使用BsDiff来生成,资源补丁包直接使用文件md5对比来生成,针对资源比较大的(默认大于100KB属于大文件)会使用BsDiff来对文件生成差量补丁。https://upload-images.jianshu.io/upload_images/14847428-1db1e5d3cb5f8b22?imageMogr2/auto-orient/striphttps://upload-images.jianshu.io/upload_images/14847428-929f831ad790e2e0?imageMogr2/auto-orient/strip优点:支持动态下发代码支持替换So库以及资源缺点:不能即时生效,需要下次启动Tinker已知问题:Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件(1.9.0支持新增非export的Activity);由于GooglePlay的开发者条款限制,不建议在GP渠道动态更新代码;在AndroidN上,补丁对应用启动时间有轻微的影响;不支持部分三星android-21机型,加载补丁时会主动抛出"TinkerRuntimeException:checkDexInstallfailed";对于资源替换,不支持修改remoteView。例如transition动画,notificationicon以及桌面图标。Tinker性能痛点:Dex合并内存消耗在vmhead上,容易OOM,最后导致合并失败。如果本身app占用内存已经比较高,可能容易导致app本系统杀掉。3.6阿里Sophix原理(双剑合璧):https://upload-images.jianshu.io/upload_images/14847428-f48236448e191eca?imageMogr2/auto-orient/strip优化Andfix(突破底层结构差异,解决稳定性问题):Andfix底层ArtMethod结构时采用内部变量一一替换,倒是这个各个厂商是会修改的,所以兼容性不好。https://upload-images.jianshu.io/upload_images/14847428-e99cd0a6eb1dda46?imageMogr2/auto-orient/stripSophix改变了一下思路,采用整体替换方法结构,忽略底层实现,从而解决兼容稳定性问题。https://upload-images.jianshu.io/upload_images/14847428-4395aacf401ae90d?imageMogr2/auto-orient/strip突破QQ和Tinker的缺陷QQ和Tinker的缺陷https://upload-images.jianshu.io/upload_images/14847428-d798bd64bb626ff4?imageMogr2/auto-orient/stripSophix对dex的解决方案Dalvik下采用阿里自研的全量dex方案:不是考虑把补丁包的dex插到所有dex前面(dex插桩),而是想办法在原理的dex中删除(只是删除了类的定义)补丁dex中存在的类,这样让系统查找类的时候在原来的dex中找不到,那么只有补丁中的dex加载到系统中,系统自然就会从补丁包中找到对应的类。Art下本质上虚拟机以及支持多dex的加载,Sophix的做法仅仅是把补丁dex作为主dex(classes.dex)而已,相当于重新组织了所有的dex文件:把补丁包的dex改名为classes.dex,以前apk的所有dex依次改为classes2.dex、classes3.dex...classesx.dex,如下图所示。https://upload-images.jianshu.io/upload_images/14847428-fa398a0285fe8138?imageMogr2/auto-orient/strip资源修复另辟蹊径常用方案(InstantRun技术):这种方案的兼容问题在于替换AssetManager的地方https://upload-images.jianshu.io/upload_images/14847428-13eee5ca49b03820?imageMogr2/auto-orient/stripSophix资源修复方案https://upload-images.jianshu.io/upload_images/14847428-2e65475a9b453a74?imageMogr2/auto-orient/stripSO修复另辟蹊径https://upload-images.jianshu.io/upload_images/14847428-0b77ea739de9d695?imageMogr2/auto-orient/strip之所以只贴了Tinker的代码框架,是因为目前开源的方案中是最好的,当然除了Robust。代码结构https://upload-images.j

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论