文章目录

  • 前言
  • 推荐
  • 模块化需要做什么
  • 一、如何拆分项目
  • 二、模块之间的通信
    • 1. 常用的通信方式
    • 2. 改善通信方式
      • 2.1 使用接口进行通信
      • 2.2 如何对外暴露接口
      • 2.3 使用EventBus时,自建简单的事件索引
  • 三、模块内的代码隔离
  • 四、组件的生命周期管理
  • 五、模块在调试与发布模式之间的切换
  • 推荐文章

前言

在Android开发中,随着项目的不断扩展,项目会变得越来越庞大,而随之带来的便是项目维护成本与开发成本的增加!每次调试时,不得不运行整个项目;每当有新成员加入团队时,需要更多的时间去了解庞大的项目。。。而为了解决这些问题,团队通常会将项目模块化,以此来降低项目的复杂度和耦合度,让团队可以并行开发与测试,让团队成员更加专注于自己所负责的功能模块开发。。。

对于一些大厂如BAT或者美团等这些大型互联网公司,都会自己造轮子,实现项目模块化。而对于中小型公司,限于成本因素,一般都是选用这些大厂造的优秀的轮子来进行项目模块化。本文以及后面一系列文章,将向大家分享我在项目模块化中的实践经验。我的项目模块化方案主要借鉴于饿了么微信美团的模块化技术文章,如有建议,欢迎提出!

推荐

文章将率先在公众号「码途有道」上发布,欢迎大家关注!

模块化需要做什么

首先,在开始项目模块化之前,我们必须要明确模块化需要做些什么?这就等于写书之前必须得有个总纲,否则越写到后面,越是混乱。以下是我认为在模块化时需要注意的几个问题:

  • 如何拆分项目
  • 模块之间的通信
  • 模块内的代码隔离
  • 模块在调试与发布模式之间的切换

在明确了项目模块化中需要解决的问题后,我们需要选定一个优秀的组件化开源框架。在本方案中,我选择阿里的ARouter,也是目前比较流行的组件化框架之一,大家也可以选择其他开源框架。ARouter的具体使用本文就不在介绍了,大家可以在网上自行搜索,下面开始设计项目模块化的架构。

一、如何拆分项目


如上图所示,我将项目大概划分为五层:

  • 宿主层: 不做具体的项目功能实现,只负责集成业务模块,组装成一个完整的APP
  • 业务模块层: 将项目的每个大功能模块拆分成的一个一个单独的module
  • 基础业务组件层: 此层最大的作用是为了复用,例如首页模块新盘模块中都有楼盘搜索这个功能,且UI显示相似,这时在两个模块中都实现楼盘搜索就显得繁琐了,像这种与业务有关联且需要多处使用的情况,我们完全可以将其抽离出来作为基础业务组件
  • 功能组件层: 项目中常用的功能库,如图片加载、网络请求等
  • 底层SDK: 从公司项目中长期积累出来的底层类库

以上是大多数项目模块化时的拆分方式,每个人也可以根据项目的实际情况进行调整。

二、模块之间的通信

1. 常用的通信方式

当项目被拆分成多个模块后,模块之间的良好的通信是我们必须考虑的问题。ARouter本身也提供一套通信机制,但是一般很难满足我们所有的需求,所以我们会容易想到的常用的几种通信方式:EvenBus、协议通信、广播或者是将通信的部分下沉到公共组件库。对于这几种方式,在一些大厂的技术文章中都有提到一些他们的看法,下面我简单总结一下:

  • EventBus: 我们非常熟悉的事件总线型的通信框架,非常灵活,采用注解方式实现,但是难以追溯事件,微信饿了么认为这是个极大的缺点,不是很推荐,但是美团觉得只要自身控制的好就行(自己设计了一套基于LiveData的简易事件总线通信框架)。
  • 协议通信: 通信双发必须得都知晓协议,且协议需要放在一个公共部分保存。虽然解耦能力强,但是协议一旦变化,通讯双方的同步会变的复杂,不方便。
  • 广播: 安卓的四大组件之一,常见的通信方式,但是相对EventBus来说,过重。
  • 下沉到公共组件库: 这是在模块化中常见的做法,不断的将各种方法、数据模型等公共部分下成到公共组件库,这样一来,公共组件库会变的越来越庞大,越来越中心化,违背了项目模块化的初衷。最后,越来越难以维护,不得不在重新拆分公共组件库。

2. 改善通信方式

上面说了一些常用的通信方式,可以看到大厂并不是很满意,那么大厂都是怎么解决的呢?没错,大厂往往都会有重造一个符合他们要求的通信框架!然而这不是我们想要的(中小型公司的实力和成本不允许啊

Android:项目模块化/组件化的架构之路(一)相关推荐

  1. iOS组件化及架构设计

    关于组件化 网上组件化的文章很多.很多文章一提到组件化,就会说解耦,一说到解耦就会说路由或者runtime.好像组件化 == 解耦 == 路由/Runtime,然而这是一个非常错误的观念.持有这一观点 ...

  2. 模块化 组件化 工程化_软件工程中的模块和软件组件

    模块化 组件化 工程化 The module in software is a small part of the software that is responsible for performin ...

  3. 面向接口编程实施模块化/组件化解耦,以友盟、极光等统计分析为例

    模块化/组件化 通过模块化/组件化组织代码,面向接口编程,尽可能做到高内聚.低耦合.重复用. 模块可分为多种类型,一般分为:基础库(日志打印.网络请求.图片加载等).三方包(微信登录.统计分析.消息推 ...

  4. 百度App Objective-C/Swift 组件化混编之路(二)- 工程化

    作者丨张渝.郭金 来源丨百度App技术 前文<百度App Objective-C/Swift 组件化混编之路>已经介绍了百度App 引入 Swift 的影响面评估以及落地的实施步骤,本文主 ...

  5. [Android Pro] 终极组件化框架项目方案详解

    cp from : https://blog.csdn.net/pochenpiji159/article/details/78660844 前言 本文所讲的组件化案例是基于自己开源的组件化框架项目 ...

  6. android最新面试题及答案,Android项目开发如何设计整体架构

    首先,讲讲为什么我们要讲JAVA的语言进阶,从整体来讲,Java和Android的区别在于Android程序是基于组件和配置的,而且Android开发以Java语言为开发工具,表面上看他们有点同宗不同 ...

  7. Android项目开发如何设计整体架构?大牛最佳总结

    前言 金九银十面试季,相信大家肯定急需一套Android面试宝典,今天小编就给大家准备了我珍藏已久的Android高阶面试宝典,一份超级详细的Android面试必备知识点,供大家学习 ! 想必每一个安 ...

  8. Android项目开发如何设计整体架构?

    前言 想要设计App的整体框架,首先要 清楚我们做的是什么 一般我们与网络交互数据的方式有两种:主动请求(http),长连接推送 结合网络交互数据的方式来说一下我们开发的App的类型和特点: 数据展示 ...

  9. 医动力Android基于CC组件化框架的探索与实践

    为什么要组件化? 医动力App作为公司的核心产品已经有多年历史了,随着版本的不断迭代,功能越来越多,代码量越来越大,不可避免的会产生一下问题: 业务越来越复杂,维护成本高; 业务耦合度高,代码越来越臃 ...

最新文章

  1. Linux下使用system()函数一定要谨慎
  2. 2018 年中国科学院大学生数学夏令营试题
  3. 大数据分析之Hadoop
  4. 禁止修改varchar到int|[运维规范]
  5. 帝国扩展变量是哪个php,帝国CMS后台系统设置里面的扩展变量是干什么的?
  6. wireshark 抓 grpc 包
  7. iOS开发 IAP苹果内购
  8. web 折线图大数据量拉取展示方案_对比多种微前端方案
  9. java 快排_秋招|字节跳动Java后台已上岸,发个面经回馈牛油
  10. “Hello World!“”团队第七周召开的第二次会议
  11. Google 最高级别工程师的教育梦
  12. windows下用linux系统,如何在Windows下使用Linux操作系统
  13. 计算机键盘打字基础知识,电脑打字入门基础知识
  14. Vue项目首页---开发周末游组件
  15. Caused by: org.apache.phoenix.shaded.org.apache.zookeeper.KeeperException$NoNodeException: KeeperErr
  16. 【原创】使用 Linux IO (LIO) 创建 SCSI target
  17. python五种标准数据类型_python标准数据类型--数值
  18. linux dd 填充全ff,用shell命令tr dd生成内容为FF指定大小的命令。
  19. Pandas输出文件使用Excel打开时中文出现乱码的解决方法
  20. Latex实践:一个零Latex基础的术渣花了一天半的时间用Latex完成一篇SCI论文编辑

热门文章

  1. imx8的源码开发方式非yocto方式(一)——ATF可信固件编译
  2. 云计算基本概念IaaS,PaaS,SaaS和Serverless
  3. flink 学习(一)java 整合 flink
  4. FSM(状态机)、HFSM(分层状态机)、BT(行为树)
  5. java编程心得(十五)——将Unicode编码转换为汉字
  6. 邵东一中2021年高考成绩查询,邵东市2020年高考捷报全市文科理科状元在一中 创新一本上线破千...
  7. 任意文件上传mysql_[代码审计]XiaoCms(后台任意文件上传至getshell,任意目录删除,会话固定漏洞)...
  8. 爬虫第五章 selenium模块的应用
  9. 高考不分文理了!8省市高考综合改革方案“出炉”!
  10. python开发专属表情包_Python开发个人专属的表情包网站