Android 插件化

Posted on By Vivian Sun

插件化的出现

  1. Android系统DexOpt问题

    当Android系统安装一个应用的时候,有一步是DexOpt工具对Dex优化。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。

    这个过程会生成一个ODEX文件,即Optimised Dex。执行Odex效率会比直接执行Dex文件的效率要高很多

    但是在早期的Android系统中DexOpt有一个问题:存储方法id的链表的长度是short类型,导致了方法 id 的数目不能够超过65536个

  2. 插件化的概念

    当一个项目足够大的时候,显然这个方法数的上限是不够的。尽管在新版本的 Android系统中,DexOpt修复了这个问题,但是我们仍然需要对低版本的 Android系统做兼容

    为了解决方法数超限的问题,需要将该dex文件拆成两个或多个,为此谷歌官方推出了 multidex 兼容包,配合 AndroidStudio 实现了一个 APK 包含多个 dex 的功能。

动态加载技术/插件化技术需要:插件dex如何加载到内存,资源加载问题,插件互相调,四大组件生命周期等用等问题。

摘要图(来自深入理解Android插件化技术

插件可能是apk也可以能so格式,都不会生成R.id. 这个问题有好几种解决方案

  1. 重写Context的getAsset、getResource之类的方法,偷换概念,让插件读取插件里的资源,但缺点就是宿主和插件的资源id会冲突,需要重写AAPT
  2. 重写AMS中保存的插件列表,从而让宿主和插件分别去加载各自的资源而不会冲突
  3. 打包后,执行一个脚本,修改生成包中资源id

Android插件化:从入门到放弃

Android插件化的过去,现在,未来

专有名词

  • 插件化 – apk 分为宿主和插件部分,插件在需要的时候才加载进来
  • 热修复 – 通常只包括一个类的方法,体量很小,和正常的插件不是一个数量级的,所以只称为热修复补丁包。一般用于修复bug
  • Instant Run – 2016 Google 的 Android Studio 推出了Instant Run热更新功能 同时提出了3个名词
    • “热部署” – 方法内的简单修改,无需重启app和Activity
    • “暖部署” – app无需重启,但是activity需要重启,比如资源的修改
    • “冷部署” – app需要重启,比如继承关系的改变或方法的签名变化等

插件化的原理

插件化的目的就是要减小宿主程序apk包的大小同时降低宿主程序的更新频率并做到自由装载模块。包括插件dex如何加载到内存和资源加载问题

有些是使用类加载方案,有些是底层替换方案

可以看这篇深入理解Android插件化技术

还有这篇提到的技术流派

热修复

热修复技术在近年来飞速发展,尤其是在Google InstantRun方案推出之后,各种热修复技术竞相涌现

热修复通常修改很小,是轻量级的插件化,一般用于修复bug

三方框架

目前国内支付宝,淘宝,微信,QQ空间,饿了么,美丽说蘑菇街,美团大众点评等都推出了自己的热修复方案

对比图片(来自网络)

各大热补丁方案分析和比较

微信Android热补丁实践演进之路

Android热修复原理(一)热修复框架对比和代码修复

PS: AOP - Aspect Oriented Programming (面向切面编程)

Reference

经典:

深入理解Android插件化技术

Android博客周刊专题之#插件化开发#

其他:

Android插件化技术——原理篇

【腾讯WeTest干货分享】全面了解Android热修复技术

Android 热修复专题

各大热补丁方案分析和比较

Android插件化:从入门到放弃

微信Android热补丁实践演进之路

Android 动态链接库加载原理及 HotFix 方案介绍

【新技能get】让App像Web一样发布新版本