• 首页
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案
目录

什么是Android组件化,为什么要组件化

Android组件化是指把app按照其业务的不同,划分为不同的Module。组件化的原因:1、提高工程编译速度;2、利于多人团队协作开发;3、组件化是功能重用的基石;4、提高组件复用性;5、降低组件间的耦合。提高工程编译速度是指,组件化将每个业务单独成为一个工程,每个工程的代码量相对较少,编译速度加快。

一、Android组件化含义

组件化是指解耦复杂系统时,将多个功能模板拆分、重组的过程。在Android工程表现上就是把app按照其业务的不同,划分为不同的Module。组件化架构的目的就是让每个业务模块变得相对独立,各个组件在组件模式下可以独立开发调试,集成模式下又可以集成到“app壳工程”中,从而得到一个具有完整功能的APP。

二、为什么要Android组件化

1、提高工程编译速度

进行组件化拆分后,每个业务或者功能都是一个单独的工程,这个单独的工程可以独立编译运行,拆分后的工程通常都比较小,代码量也比较少,我再也不用像以前编译一下得等待好几分钟了。

2、利于多人团队协作开发

业务组件之间不能相互引用,每个组件都把对应的业务功能收敛在一个工程里,彼此互不打扰。 在多人团队里,每个人只负责自己的业务模块,他对业务功能的增删改查,都只限定在自己的这个业务模块里,不会影响其他人的业务,他代码质量的好坏也只会影响到自己的业务模块;对测试来说,也十分方便,大部分情况下,我们只需要着重测试修改过的业务组件即可,而不用老是进行全部回归测试。

3、组件化是功能重用的基石

业务组件类似一个个积木一样,我们可以用积木搭建出不同的房子,同理我们也可以创建多个不同的APP。我们只需要维护好每个组件,需要用到该组件的功能时,一建引用集成就可以了。

4、提高组件复用性

可能有些人会觉得,提高复用性很简单,直接把需要复用的代码做成Android Module,打包AAR并上传代码仓库,那么这部分功能就能被方便地引入和使用。但是我们觉得仅仅这样是不够的,上传仓库的AAR库是否方便被复用,需要组件化的规则来约束,这样才能提高复用的便捷性。

5、降低组件间的耦合

我们需要通过组件化的规则把代码拆分成不同的模块,模块要做到高内聚、低耦合。模块间也不能直接调用,这需要组件化通信框架的支持。降低了组件间的耦合性可以带来两点直接的好处:

  • 代码更便于维护
  • 降低了模块的Bug率

三、Android组件化基础

1、组件之间的跳转

组件化中两个功能模块时不直接依赖的,其依赖规则是通过 Base module 间接依赖,当组件之间的 Activity 进行界面跳转时,由于没有相互依赖的关系,往往会无法引用另一个 module 中的 Activity。

2、隐式跳转

隐式跳转是通过 Android 原生 Intent 匹配机制来实现相应跳转,就是使用 Action 来跳转到对应的 Activity,这样使用隐式跳转的方式就可以跨 module 实现 Activity 之间的跳转了,注意一点,如果移出 Activity 所在的 module 而不移出相应的跳转,如果继续跳转会出现异常,使用隐式 Intent 跳转需要验证是否会接收该 Intent,需要对该 Intent 对象调用 resolveActivity() 方法来判断至少有一个应用能够处理该 Intent,通过隐式跳转的方式还可以设置 exported 为 false 来确保只有自己的 App 才能够启动对应的组件。

3、ARouter跳转

在 Android 开发中可将 module 看成不同的网络,而对应的 Router 就是连接各个 module 的中转站,这个中转站可以对页面跳转的参数等进行统一处理,ARouter 是阿里开源出来的一个页面跳转路由,使用 ARouter 可以替代隐式跳转来完成不同 module、不同组件之间的跳转以及跳转过程的监听、参数的传递等,ARouter 支持路径跳转和 URL 跳转两种方式,使用也非常灵活,ARouter 的具体使用这里不做介绍,其具体使用会在单独一篇文章中详解,ARouter 与 Android 传统跳转方式的对比如下:

  • 显示跳转需要依赖于类,而路由跳转通过指定的路径跳转;
  • 隐式跳转通过 AndroidManifest 集中管理,导致协作开发困难;
  • 原生使用 AndroidManifest 来注册,而路由使用注解注册
  • 原生 startActivity 之后跳转过程交由 Android 系统控制,而路由跳转采用的是 AOP 切面编程可对跳转过程进行拦截和过滤。

4、动态创建

组件化开发中最重要的一点就是各个模块、各个组件之间要尽可能解耦,这样很容易就会想到使用 Java 中的反射机制,使用反射可在运行状态下获取某个类的所有信息,然后就可以动态操作这个类的属性和方法了。如果 Fragment 单独作为一个组件来使用时,当这个 Fragment 组件不需要被移出后,如果是常规的 Fragment 则会因为索引不到该 Fragment 而使得 App 崩溃,想一下如果使用反射创建 Fragment 的方式则至少不会引起 App 崩溃,这里可以捕捉异常完成相关逻辑,这样是不是降低了耦合呢。可见,虽然反射有一定的性能问题,但使用反射确实能在一定程度上降低耦合,学习组件化 Java 反射机制应该是必须的一部分。

延伸阅读1:组件化结构

  • app壳:负责管理各个业务组件和打包APK,没有具体的业务功能;
  • 业务组件层:最上层的业务,每个组件表示一条完整的业务线,彼此之间相互独立;
  • 功能/基础组件层:支撑上层业务组件运行的基础业务服务;
  • 基础库:包含了各种开源库以及和业务无关的一个自研工具库。
相关文章