APP插件化/组件化框架分析

VirtualAPK插件框架简单使用
阿里Atlas组件框架使用

最近一段时间在研究插件化和组件化实现方案,今天也算整理一下笔记记录一下,记得之前讲述过一篇关于组件化的文章【Android 组件化之初探】,刚好对应着阿里的Atlas组件化框架,今天主要做个大致的介绍,稍后再逐个讲述下各框架的接入方法以及具体使用方法。

一、模块化、插件化和组件化

1. 模块化、插件化和组件化的关系

在技术开发领域,模块化是指分拆代码,即当我们的代码特别臃肿的时候,用模块化将代码分而治之、解耦分层。具体到 android 领域,模块化的具体实施方法分为插件化和组件化。

2. 插件化和组件化的区别

一套完整的插件化或组件化都必须能够实现单独调试、集成编译、数据传输、UI 跳转、生命周期和代码边界这六大功能。

插件化和组件化最重要而且是唯一的区别的就是:

  • 插件化可以动态增加和修改线上的模块;
  • 组件化的动态能力相对较弱,只能对线上已有模块进行动态的加载和卸载,不能新增和修改。

插件化

插件化开发是将一个项目app拆分成多个模块,这些模块包括宿主和插件。每个模块相当于一个apk,而组件化相当于一个lib。最终发布的时候将宿主apk和插件apk单独打包或者联合打包。

作用
  • 并发开发
    每个组负责一个插件,彼此之间没有过多的依赖,可以单独调试打包。有时发版其实就相当于发插件。
  • 动态更新插件
    通过推送插件更新来修复bug。
  • 按需下载模块
    用户需要使用到对应模块的时候,才去下载相应模块。
  • 方法数或变量数爆棚问题

组件化

组件化开发是将一个项目app拆分成多个模块,每个模块都是一个组件,组件化开发过程中相互依赖或单独调试,最终发布的时候是将这些组件合并统一成一个apk。

3. 插件化 和 组件化如何选择

在插件化和组件化取舍的一个重要原则是:APP 是否有动态增加或修改线上模块的需求,如果这种动态性的需求很弱,就不需要考虑插件化,一般说来,电商类或广告类产品对这个需求比较强烈,而类似“得到 APP”这类的知识服务产品,每个功能的推出都是经过精细打磨的,对这种即时的动态性要求不高,所以不需要采用插件化。

如果你的产品对动态性的要求比较高,那么在选择插件化之前也需要从两个方面权衡一下。一是插件化不可避免的去 hook 一些系统的 api,也就不可避免地有兼容性的问题,因此每个插件化方案需要有专门的团队去负责维护;二是从一个业务逻辑复杂的项目中去拆分插件化需要的时间可能是非常巨大的,需要考虑对开发节奏的影响。

因此,对大多数产品来说,组件化都是一个不错甚至最佳的选择,它没有兼容性,可以更方便地拆分,并且几乎没有技术障碍,可以更顺利地去执行。特别是对急需拆分的产品来说,组件化是一个可退可守的方案,可以更快地执行下去,并且将来要是迁移到插件化,组件化拆分也是必经的一步。

二、插件化和组件化方案

  • DynamicAPK (携程)
    DynamicAPK 已停止维护

    1. 只支持四大组件中的Activity
    2. 组件需要在宿主程序的manifest中预注册
    3. 不支持PendingIntent
    4. 插件构建需要部署aapt
    5. 支持大部分Android特性
    6. 兼容性适配一般
  • VirtualAPK (滴滴)
    VirtualAPK GitHub

    1. 四大组件全支持
    2. 组件不需要在宿主程序manifest中预注册
    3. 支持PendingIntent
    4. 插件构建Gradle插件
    5. 支持几乎全部的Android特性
    6. 兼容性适配比较高
    7. 兼容 Android O
    8. 加载apk

    目前暂不支持的特性

    1. 暂不支持Activity的一些不常用特性(比如process、configChanges等属性),但是支持theme、launchMode和screenOrientation属性;
    2. overridePendingTransition(int enterAnim, int exitAnim)这种形式的转场动画,动画资源不能使用插件的(可以使用宿主或系统的);
    3. 插件中弹通知,需要统一处理,走宿主的逻辑,通知中的资源文件不能使用插件的(可以使用宿主或系统的)。

    VirtualAPK插件框架简单使用

  • Atlas(阿里手淘)
    atlas GitHub
    Atlas 文档
    Atlas是伴随着手机淘宝的不断发展而衍生出来的一个运行于Android系统上的一个容器化框架,我们也叫动态组件化(Dynamic Bundle)框架。它主要提供了解耦化、组件化、动态性的支持。
    Atlas-手淘组件化框架的前世今生和未来的路
    阿里巴巴开源移动容器化框架Atlas的技术演进之路
    atlas支持所有的代码及资源更新,暂时不支持新增4大组件

    1. bundle可以直接使用host中的代码和资源
    • Atlas基本上基于Module开发,这里所说的直接使用host中的代码和资源是通过将host中的公用代码和资源抽离成一个中间件middlewarelibrary,在各bundle中的build中通过使用providedCompile project(':middlewarelibrary')
      来使用其中的代码。
    • 有时插件可能需要访问host里面的资源或者代码(如appname,launcher),可以单独建一个library存放公共资源和代码,并且一些公共的三方库引用也可以放到里面,这样所有插件都只需要以provided的方式引这个library就可以,不用在每个插件里面都引用相同的库。
    1. 官方demo中文件
altas.png
  • RePlugin(360手机卫士)
    https://github.com/Qihoo360/RePlugin
    完整的:让插件运行起来“像单品那样”,支持大部分特性
    稳定的:如此灵活完整的情况下,其框架崩溃率仅为业内很低的“万分之一”
    适合全面使用的:其目的是让应用内的“所有功能皆为插件”
    占坑类:以稳定为前提的Manifest占坑思路
    插件化方案:基于Android原生API和语言来开发,充分利用原生特性
    加载jar

四种方案比较与选择

插件化.png

在 加载耦合插件 方面,VirtualAPK 是开源方案的首选,推荐大家使用。
通俗易懂地说——

  • 如果你是要加载微信、支付宝等第三方 APP,那么推荐选择 RePlugin;
  • 如果你是要加载一个内部业务模块,并且这个业务模块很难从主工程中解耦,那么 VirtualAPK 是最好的选择。

抽象地说——

  • 如果你要加载一个插件,并且这个插件无需和宿主有任何耦合,也无需和宿主进行通信,并且你也不想对这个插件重新打包,那么推荐选择 RePlugin;
  • 除此之外,在同类的开源中,推荐大家选择 VirtualAPK。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容