前言:

从个人经历来说的话,从事APP开发这么多年来,所接触的APP的体积变得越来越大,业务的也变得越来越复杂,总来来说只有一句话:这是一个APP臃肿的时代!所以为了告别APP臃肿的时代,让我们进入一个U盘时代,每个业务模块都是一个具备独立运行的U盘,插在哪里都可以完美运行,这就是推进业务组件化的初衷也是一个美好的愿景。

业务组件化相关文章地址:

需求背景:

随着公司的快速发展,版本不断的迭代,业务变得也越来越复杂,业务模块的数量有可能还会继续增加,而且每个模块的代码也会越来越多,这样下去势必影响开发效率,增加项目的维护成本,每个工程师都要熟悉如此之多的代码,而且每次编译如此之多的代码,电脑卡死了有木有?慢的像蜗牛先生有木有?这样以来估计工程师直接疯掉了!然后跳楼go die 了!所以推进公司业务组件化迫在眉睫,这也是实现业务组件化的大背景。

现状分析:

只有知道自己问题出在了哪里?才好寻找解决问题的办法,我们先来看下目前大部分app的单一项目结构原型。大致如下图所示:

一眼望去这结构不是挺清晰的么?每个业务都放在单独的包名下,网络库、图片加载库等第三方库与上层业务都完美的剥离了,我们再来看下他们的直接的依赖关系图:

虽然上面的依赖关系举例有点太过于极端,但是真实场景中是存在的。各个业务之间代码互相引用,所以这种结构也是架构整改的根本动机,也是当务之急应该考虑的事情。为了更好的满足各个业务的迭代而彼此不受影响,更好的解决上面这种让人头疼的依赖关系,开始着手app架构整改。

从上面的分析我们可以得出适合业务组件化的几种情况:

  • 业务较多、而且复杂
  • 业务之间的依赖需要解耦
  • 团队成员较多,需要各自开发相对独立的业务

业务组件化方向:

APP业务组件化架构整改的方向就是告别结构臃肿的时代,让各个业务变得相对独立。模块工程和类库工程之间遵循向下依赖关系,各个模块之间的遵循平级依赖关系。先看下整改后的各个独立业务模块与类库工程之间的向下依赖关系图:

整改的方向由一个项目工程拆分成若干个模块工程,由app壳工程提供统一的入口,每个业务独立的模块module共享项目的依赖库。由壳工程集成需要引入的业务模块,至于各个独立的业务模块之间的调用依赖关系,我们借助一个中间层充当路由功能,这个路由我们放在各个业务模块共同引用的依赖库那一层。由路由统一调度他们之间的依赖关系,路由调度解决平级依赖问题示意图:

通过APP壳工程提供的路由功能,各个模块之间调用不再采用传统的显式调用,而是采用隐式调用的方式。从而使各个模块之间不再存在依赖关系。

APP业务组件化架构整改技术方案:

业务组件化大致需要解决以下几个问题。

1.)业务组件的生命周期

按照理想状态的来看待的话,各个业务组件之间没有任何依赖关系,这时我们可以把每个独立的业务组件看成一个可运行的app,所以业务组件的生命周期和应与独立的app保持一致。

2.)业务组件之间通信

在各个单独业务组件内,基本上保持原来的调用方式,组件之间通信采用URL Schema方式实现页面跳转,格式为 schema://host/action?param1=value1¶m2=value2 。关于schema映射表维护由上面提到的Router(路由)这么一个角色来维护,

schema解析由系统Framework来维护。其中schema映射表可以做成后台配置文件形式。也可以代码维护,不过组件需要预先注册。以上说的对于传递基本参数是没啥问题的。如果要传递对象的话,转成Json 字符串就可以了。

关于schema可以参考我的这篇博客:Android业务组件化之URL Schema使用

APP 业务组件化架构整改带来的好处:

如此规模大的架构整改需要付出更高的成本,还会涉及一些潜在的风险,那么整改后的架构能够带来哪些好处呢?

  • 加快迭代速度,各个业务模块组件更加独立,不再因为业务耦合情况,在发版时候,由于互相等待而迟迟不能发布版本。

  • 稳定的公共模块采用依赖库方式,提供给各个业务线使用,减少重复开发和维护工作量。

  • 迭代频繁的业务模块采用组件方式,各业务线研发可以互不干扰、提升协作效率,并控制产品质量。

  • 为新业务随时集成提供了基础,所有业务可上可下,灵活多变。

  • 降低团队成员熟悉项目的成本,降低项目的维护难度。

  • 加快编译速度,提高开发效率

总结:

本篇主要来分析为何要实现业务组件化、组件化的方向、组件化的技术方案简单探讨、组件化带来的好处,由于目前还处于实施初期,很多观点有可能是错误的,很多技术坑还没涉及,后续会跟进更多相关实现方案。

Android业务组件化之现状分析与探讨的更多相关文章

  1. Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现

    前言: 前面分析了APP的现状以及业务组件化的一些探讨(Android业务组件化之现状分析与探讨),以及通信的桥梁Scheme的使用(Android业务组件化之URL Scheme使用),今天重点来聊 ...

  2. Android业务组件化之URL Scheme使用

    前言: 最近公司业务发展迅速,单一的项目工程不再适合公司发展需要,所以开始推进公司APP业务组件化,很荣幸自己能够牵头做这件事,经过研究实现组件化的通信方案通过URL Scheme,所以想着现在还是在 ...

  3. Android业务组件化之Gradle和Sonatype Nexus搭建私有maven仓库

    前言: 公司的业务组件化推进的已经差不多三四个月的时间了,各个业务组件之间的解耦工作已经基本完成,各个业务组件以module的形式存在项目中,然后项目依赖本地的module,多少有点不太利于项目的并行 ...

  4. 【转】Android业务组件化之URL Scheme使用

    前言: 最近公司业务发展迅速,单一的项目工程不再适合公司发展需要,所以开始推进公司APP业务组件化,很荣幸自己能够牵头做这件事,经过研究实现组件化的通信方案通过URL Scheme,所以想着现在还是在 ...

  5. Android 业务组件化开发实践

    组件化并不是新话题,其实很早很早以前我们开始为项目解耦的时候就讨论过的.但那时候我们说的是功能组件化.比如很多公司都常见的,网络请求模块.登录注册模块单独拿出来,交给一个团队开发,而在用的时候只需要接 ...

  6. Android项目架构之业务组件化

    前言: 从个人经历来说的话,从事APP开发这么多年来,所接触的APP的体积变得越来越大,业务的也变得越来越复杂,总来来说只有一句话:这是一个APP臃肿的时代!所以为了告别APP臃肿的时代,让我们进入一 ...

  7. Android彻底组件化demo发布

    今年6月份开始,我开始负责对"得到app"的android代码进行组件化拆分,在动手之前我查阅了很多组件化或者模块化的文章,虽然有一些收获,但是很少有文章能够给出一个整体且有效的方 ...

  8. Android的组件化和模块化

    Android随着业务的增多,而且后续新的需求的增加,代码的修改会变得非常频繁 然后最近在看组件化和模块化 公司的业务没有那么大,所以这种方式我并没有采取 但是还是需要了解下他的使用机制 还有优缺点之 ...

  9. [Android Pro] 组件化:企业级大型项目必经之路

    cp : https://www.csdn.net/article/2011-02-11/291667 摘要:超过一年以上.活跃开发的项目往往到后期陷入了一些共性的问题: 构建速度慢,往往生成一次最终 ...

随机推荐

  1. Fis3的前端工程化之路[三大特性篇之资源定位]

    Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...

  2. nodejs进阶(3)—路由处理

    1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...

  3. Asp.net Core中使用Session

    前言 2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Cor ...

  4. xamarin DependencyService源码阅读

    xamarin在面对PCL无法实现的各平台特有功能时使用了一种叫[DependencyService]的方式来实现.它使得xamarin能像原生平台一样做平台能做到的事情!主要分四个部分 接口:定义功 ...

  5. JavaScript常见的五种数组去重的方式

    ▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...

  6. Node.js:理解stream

    Stream在node.js中是一个抽象的接口,基于EventEmitter,也是一种Buffer的高级封装,用来处理流数据.流模块便是提供各种API让我们可以很简单的使用Stream. 流分为四种类 ...

  7. 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~

    一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...

  8. animate.css(第三方动画使用方法)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Monaco; color: #a5b2b9 } animation 语法: animatio ...

  9. C语言可以开发哪些项目?

    C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,比如:不知道C语言可以开发哪些项目,可以应用在哪些实际的开发中--,这些迷茫也导致了我们在学习的过程 ...

  10. jQuery中取消后续执行内容

    <html xmlns="http://www.w3.org/1999/xhtml"><head>    <title></title&g ...