组件化框架调研和思考

1、百链 CC

核心代码量:3K(±) line (&插件)

源码阅读难度(10分制):8(Socket&ASM)

组件自动注册方案: 自动注册

TrasnformAPI + ASM扫描组件类(IComponent接口实现类)并注册到ComponentMananger中,

无需手动维护组件列表

模块间通信机制:

事件总线

组件间跨进程通信机制: Socket

广播 + Service + LocalSocket

组件向外提供服务: 自动注册

在IComponent中实现,自动注册到ComponentMananger

组件依赖隔离:

无需依赖、完全隔离

特点:

  1. 可以跨app调用,初期改造时即可单独编译组件运行
  2. 提供统一的组件调用及实现方式(不管是否跨app调用、页面跳转、服务调用、同步/异步调用)
  3. 组件自动注册,无需维护
  4. 提供了ActionProcessor按需加载的支持

综合成本:中

 侵入性低 
 无混淆
 改造成本中  
 学习成本低  
 维护成本中 

缺点:

 1、使用Socket实现组件间通信,逻辑略复杂,且只支持string
 2、Socket未使用NIO,只能一对一通信
 3、组件与非组件状态下通信机制不统一
 4、无法自动唤醒目标,目标组件被杀后无法通信

2、得到 DDComponentForAndroid 现更名为JIMU

核心代码量:1.2K(±) line (&插件)

源码阅读难度:5(Javassisit)

组件自动注册方案: 自动注册

apt生成各module的路由表

TrasnformAPI + javassist将IApplicationLike的注册代码生成到自定义application.onCreate方法中,

无需手动维护组件列表

模块间通信机制:

路由 + 接口下沉

组件间跨进程通信机制:

不支持

组件向外提供服务: 手动注册

接口下沉到base中,组件中实现接口并在IApplicationLike中手动注册到Router中

组件依赖隔离:

通过插件实现只在打apk包时才添加依赖,编码期间不能直接调用其它组件的代码

特点:

自动添加依赖,只在运行assemble任务的才会添加依赖,因此在开发期间组件之间是完全感知不到的,这是做到完全隔离的关键
支持两种语法:module或者groupId:artifactId:version(@aar),前者之间引用module工程,后者使用maven中已经发布的aar

  1. 编码期间组件依赖通过插件进行隔离,避免直接调用其它组件的代码
  2. 提供了兼容ARouter的方案
  3. 组件自动注册,无需维护

综合成本:中

 侵入性一般
 混淆所有下沉接口、框架中相关接口的实现类等 
 改造成本一般  
 学习成本一般  
 维护成本一般

缺点:

 1、不支持组件间的跨进程通信,这个期望后续能有进展
 2、javassisit经常会占用代码资源无法释放,导致编译失败(mac下不会,wins下经常,无解)
 3、组件与组件联合测试时需要集成打包到一起,而不是两个独立的组件通信

3、58赶集 ModularizationArchitecture

核心代码量:2K(±) line

源码阅读难度:7(AIDL)

组件自动注册方案: 手动注册

1. Action列表在其所属的Provider中注册
2. Provider在其所属的ApplicationLogic中注册
3. ApplicationLogic在主app的Application中注册

模块间通信机制:

 事件总线

组件间跨进程通信机制: AIDL

组件同时安装在设备上即可,实际开发中一般是当前正在开发的组件和主app中的组件互相调用.

组件向外提供服务: 手动注册

实现一个对应的Action并在其所属的Provider中手动注册

组件依赖隔离:

无需依赖、完全隔离

特点:

  1. 可以跨app、app内跨进程调用
  2. 组件运行在各自进程中,单独运行与联合打包切换时需要修改进程名称
  3. 组件需指定同步实现还是异步实现,调用组件时统一拿到RouterResponse作为返回值,可以自行决定同步还是异步方式调用RouterResponse.getData()来获取结果,但异步获取时需要自己维护线程

综合成本:高

 侵入性高
 混淆所有下沉接口、框架中相关接口的实现类等 
 改造成本高 
 学习成本高 
 维护成本高

缺点:

 1、使用AIDL实现组件间通信,逻辑略复杂
 2、组件与非组件状态下通信机制不统一

4、阿里Arouter

组件自动注册方案: 半自动+反射

   1. apt生成各module的路由表
   2. Arouter初始化时扫描所有dex找出指定包名下的路由表,通过反射进行统一注册

模块间通信机制:

路由 + 接口下沉

组件间跨进程通信机制:

urlScheme来统一转发

组件向外提供服务: 反射

接口继承IProvider并下沉到base中,组件中实现接口并通过注解来暴露服务

组件依赖隔离:

未隔离

特点:

 1. 阿里出品,使用者众多,QQ群里交流比较活跃
 2. 自动注册插件正式启用之前扫描所有dex完成注册的方式效率较低且有加固厂商兼容性问题
 3. 分级按需加载

综合成本:一般

 侵入性高
 混淆框架中的所有类及框架相关接口的实现类
 改造成本一般
 学习成本一般 
 维护成本低

5、美团

组件自动注册方案: SPI+javassit

        1. 使用servieloader进行解耦---非显式的调用服务实现类
        2. javassit预处理:大体流程是
            在build的某个阶段拿到所有编译后的class文件(夹)和jar包。
            使用javassit确定哪些类被@autoService修饰,配置文件中如果不存在,在其添加。
            查看serviceConfig配置文件里面的格式是不是正确。
            通过javassit来确定serviceConfig配置文件里面的类是不是在项目中存在,接口类是不是实现了Iprovider接口。

模块间通信机制:

     LocalBroadcast取代eventbus

组件间跨进程通信机制:

     contentProvider

组件向外提供服务: 反射

     接口继承IProvider并下沉到base中,组件中实现接口并通过注解来暴露服务

组件依赖隔离:

     无需依赖、完全隔离

特点:

      1. 解耦使用serviceloader,而不是路由进行
      2. 可以无侵入式的配置各种服务
      3. lib快速便捷多端使用

综合成本:高

      侵入性低
      混淆框架中的所有类及框架相关接口的实现类
      改造成本高
      学习成本高
      维护成本高

6、其它

聚美Router

APT+反射

51信用卡路由方案OkDeepLink

使用aspectJ来实现路由表的自动注册

美柚路由方案RouterKit

通过apt生成每个module的路由表,然后复制到app的assets目录,
运行的时候遍历asset目录,反射对应的activity

7、思考总结

1、组件自动注册方案:

现有APT实现的Router  只需要完成中央注册即可
可选方案复杂度:10分制
        javassisit   7
        ASM           8
        SPI              0
        AspectJ     9
        反射           6

2、组件间通信方案:

 可选方案复杂度:
   ContentProvider   7
   Socket         8
   AIDL             7
   Messenger  3
 
 由于现在的组建内通信方案OkBus  传递的是Message  
 
 进程间通信可以使用Messenger(IPC)来扩展OkBus实现组建间的Message的双向传递  几乎0成本

8、最终实现 Moduler

原理篇: https://www.jianshu.com/p/a73fd5e4cad1

核心代码量:1K(±) line

源码阅读难度(10分制):3(Messenger)

组件自动注册方案: 自动注册

 APT+SPI

模块间通信机制:

 OkBus

组件间跨进程通信机制: Messenger扩展的 OkBus

 OkBus

组件向外提供服务: 自动注册

 OkBus+SPI

组件依赖隔离:

无需依赖、完全隔离

特点:按需加载,自动唤醒

1、最小代价组件化,最简单的配置、最灵活的切换
 2、组件路由自动化注册,中央路由自动化采集
3、服务自动注册,兼容同异步,兼容跨/同进程,经典C/S架 构,一对多通信
4、OkBus实现的通信机制,兼容同异步,兼容跨/同进程,与传统使用方式完全一样,无感知无差别
5、跨组件调用时自动唤醒,单个组件调试时无需手动打开目标组件,即使目标开启后被杀掉进程,同样可以唤醒加通信一步到位

跨进程的优点

 考虑到,a,b两个模块同时修改,联合调试时,编译过程比较麻烦,因此,所有的组件化框架都不建议开发阶段使用aar,而建议直接依赖

 而跨进程通信则完全没有这个烦恼,两个组件单独安装即可,不存在任何依赖

 前者的时间复杂度是2+2  后者的时间复杂度是1+1


 开发初期,多个模块联合改动,分别测试时,使用aar时间成本是指数增长,使用跨进程只是简单的线性增长。

 真正复杂的流程也不是组件化之后的开发过程,而是组件化过程中拆分的各个组件时联合测试的过程,所以一般组件化的过程都会分为两个阶段,组件化开发期,和组件化稳定期

  目前的demo给出的解决方案就是组件化开发期的解决方案,稳定之后,会有后续的aar依赖优化方案

综合成本:低

 侵入性低 
 无混淆
 改造成本低  
 学习成本低  
 维护成本低 

QQ群:AndroidMVP 555343041

参考&致谢:

总结一波安卓组件化开源方案

美团猫眼电影android模块化实战

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,811评论 25 707
  • 跟蔡家乐生气。 气到单词都背不下去。 我很少有情绪失控的时候,在他身上倒是常常发生。大概是因为互...
    顾相阅读 192评论 0 0
  • 刚开始学习写作时,老师告诉我们一个方法,就按照这样的一个方法去写,不能说一下子写出多好的上乘文章来,但至少能让读者...
    小剧在成长阅读 241评论 3 6
  • #星际播报 2018/01/27 NS1.30.07.18 #Kin249月亮红月 我要净化原生家庭的业力 突破过...
    塔罗先生三哥阅读 280评论 0 0