Android 组件化概念

01.什么是组件化

  • 什么是组件化呢?
    • 组件(Component)是对数据和方法的简单封装,功能单一,高内聚,并且是业务能划分的最小粒度。
    • 组件化是基于组件可重用的目的上,将一个大的软件系统按照分离关注点的形式,拆分成多个独立的组件,使得整个软件系统也做到电路板一样,是单个或多个组件元件组装起来,哪个组件坏了,整个系统可继续运行,而不出现崩溃或不正常现象,做到更少的耦合和更高的内聚。

02.区分模块化与组件化

  • 模块化
    • 模块化就是将一个程序按照其功能做拆分,分成相互独立的模块,以便于每个模块只包含与其功能相关的内容,模块我们相对熟悉,比如登录功能可以是一个模块,搜索功能可以是一个模块等等。
  • 组件化
    • 组件化就是更关注可复用性,更注重关注点分离,如果从集合角度来看的话,可以说往往一个模块包含了一个或多个组件,或者说模块是一个容器,由组件组装而成。简单来说,组件化相比模块化粒度更小,两者的本质思想都是一致的,都是把大往小的方向拆分,都是为了复用和解耦,只不过模块化更加侧重于业务功能的划分,偏向于复用,组件化更加侧重于单一功能的内聚,偏向于解耦。

03.组件化优势好处

  • 简单来说就是提高工作效率,解放生产力,好处如下:
    • 1.提高编译速度,从而提高并行开发效率。
      • 问题:那么如何提高编译速度的呢?组件化框架可以使模块单独编译调试,可以有效地减少编译的时间。
    • 2.稳定的公共模块采用依赖库方式
      • 提供给各个业务线使用,减少重复开发和维护工作量。代码简洁,冗余量少,维护方便,易扩展新功能。
    • 3.每个组件有自己独立的版本,可以独立编译、测试、打包和部署。
      • 针对开发程序员多的公司,组件化很有必要,每个人负责自己的模块,可以较少提交代码冲突。
      • 为新业务随时集成提供了基础,所有业务可上可下,灵活多变。
      • 各业务线研发可以互不干扰、提升协作效率,并控制产品质量。
    • 4.避免模块之间的交叉依赖,做到低耦合、高内聚。
    • 5.引用的第三方库代码统一管理,避免版本统一,减少引入冗余库。
      • 这个可以创建一个公共的gradle管理的文件,比如一个项目有十几个组件,想要改下某个库或者版本号,总不至于一个个修改吧。这个时候提取公共十分有必要
    • 6.定制项目可按需加载,组件之间可以灵活组建,快速生成不同类型的定制产品。

04.区分组件化和插件化

  • 组件化和插件化的区别
    • 组件化不是插件化,插件化是在【运行时】,而组件化是在【编译时】。换句话说,插件化是基于多APK的,而组件化本质上还是只有一个 APK。
    • 组件化和插件化的最大区别(应该也是唯一区别)就是组件化在运行时不具备动态添加和修改组件的功能,但是插件化是可以的。
  • 组件化的目标
    • 组件化的目标之一就是降低整体工程(app)与组件的依赖关系,缺少任何一个组件都是可以存在并正常运行的。app主工程具有和组件进行绑定和解绑的功能。

05.application和library

  • 在studio中,对两种module进行区分,如下所示

    • 一种是基础库library,比如常见第三方库都是lib,这些代码被其他组件直接引用。
    • 另一种是application,也称之为Component,这种module是一个完整的功能模块。比如分享module就是一个Component。
    • 为了方便,统一把library称之为依赖库,而把Component称之为组件,下面所讲的组件化也主要是针对Component这种类型。
  • 在项目的build.gradle文件中

    1
    2
    3
    4
    5
    6
    7
    8
    //控制组件模式和集成模式
    if (rootProject.ext.isDouBanApplication) {
    //是Component,可以独立运行
    apply plugin: 'com.android.application'
    } else {
    //是lib,被依赖
    apply plugin: 'com.android.library'
    }

06.注意第三方sdk拆分问题

  • 看了很多博客,几乎没有博客说出在拆分业务组件时,遇到第三方sdk集成的问题。比如:当你的app可以使用微信登陆,在app主工程时,登陆是正常的,这个时候你是通过主工程app的包名去微信开放平台申请id和key值。但是当你将登陆注册拆分出独立的业务组件时,则该组件的包名是跟app主工程包名不一样的,那么这个时候,如果切换成组件模式则第三方登陆就有可能出现问题。
  • 也就是说,你使用某些第三方sdk时,当初用app的包名去申请得到key值[这个值是根据包名生成的],然后当你拆分业务组件时,自然组件包名和app包名不一样,那么当切换成组件application可以独立运行时,则可能会出现bug,由包名导致的问题。个人建议,涉及到第三方sdk拆分,可以封装成lib被依赖即可,或者你刻意把包名弄成一样的。