返回

组件化:代码隔离也难不倒组件的按序初始化

Android

时至今日,Android 项目中的组件化已人尽皆知,但在细微处依然隐藏着一些门道。如果没有得心应手的中间件,组件化的推进之路定会布满荆棘。

2017 年,逻辑思维得到项目团队慷慨地开源了他们的组件化解决方案思路和核心 Gradle 构建插件。自此,笔者便全情投入其中,潜心钻研插件的功能和扩展可能。

组件化,顾名思义,就是将庞大复杂的项目拆分为一个个粒度更小的组件,每个组件各司其职,互不干扰,既简化了代码结构,又提高了复用性和维护性。

而组件按序初始化,则是组件化中的一项重要课题。组件之间存在依赖关系,A 组件需要先初始化才能保证 B 组件的正常运行。因此,我们必须找到一种方法,让组件按照预先设定的顺序逐一初始化。

传统的初始化方式是通过在 Application 中注册各组件,再在 Application 的 onCreate() 方法中依次调用组件的初始化方法。这种方式简单易行,但存在以下不足:

  • 耦合度高。 组件之间紧密耦合,一旦某个组件发生变更,其他组件也需要随之调整,灵活性较差。
  • 初始化时机难控。 组件初始化时机依赖于 Application 的 onCreate() 方法,无法满足组件跨进程初始化的需求。

为此,我们需要一种更灵活、更易于控制的初始化方式。在对 Gradle 构建插件进行深入研究后,我们发现了一个鲜为人知的特性:组件的按序初始化依赖关系管理

该特性允许我们在 Gradle 构建文件中指定组件之间的依赖关系,从而实现组件按序初始化。具体实现方式如下:

android {
    defaultConfig {
        // 省略其他配置
    }

    // 组件化配置
    component {
        applicationId "com.example.myapp"
        components {
            main {
                dependencies {
                    compile project(':component-base')
                    compile project(':component-login')
                    compile project(':component-setting')
                }
            }
            login {
                dependencies {
                    compile project(':component-base')
                }
            }
            setting {
                dependencies {
                    compile project(':component-base')
                }
            }
        }
    }
}

在这个配置中,我们定义了三个组件:主组件、登录组件和设置组件。登录组件和设置组件依赖于基础组件。当项目编译时,Gradle 会自动解析组件之间的依赖关系,并生成相应的初始化代码。

这样一来,组件的初始化顺序就由 Gradle 构建文件中的依赖关系决定了,既解耦了组件,又保证了初始化的正确性。