android

Android 模块化 子模块初始化

背景

Android 模块化之路,第一步路由选型,第二步模块间调用,搞完了这两部分后,模块化逐渐显现规模。代码变成如下图的样式。

Android模块化架构
Android模块化架构

然后这个时候,我们再想一想,最初的梦想是什么?

嗯,想起来了,就是任何一个模块拿掉,我们的主工程都可以运行,然后任意一个子模块都可以独立运行。

现在我们拿这个尺子去量:

功能验证 验证结果 备注
任意模块独立运行 OK 这不是啥难事,无非改一App 入口的事
可以拿掉任意业务模块 待确认 实际去掉试试呗

然后我们发现:一些子模块依赖的组件的初始化代码竟然放到了主 App 的 Application的onCreate的初始化中。

如果想拿掉子模块,那主App 的依赖也就不在了,还要修改代码主App 的代码才能跑起来。比如:产品模块的 服务器选择之类的初始化或功能开关。需要在启动 App 的时候就搞好,然后在使用时直接开搞就 OK 了。如果去掉产品模块的代码,那 Application 的 onCreate也需要注掉相应的代码才能保证编译通过。
这个时候,就涉及到一个子模块的初始化。

子模块初始化

核心思想:接口 + 注册 + 循环遍历调用。类似于观察者模式。

底层ComonFramework声明模块初始化接口如下:

public interface IModuleInit {    
    protected  boolean init(Application var1);
}

在子模块中去实现

public class ProductModuleInitImpl impl IModuleInit {
    @Override
    protected boolean onLoad(final Application application) {
           VideoServerSDK.init(application);
        }
    return true;
    }
}

然后在主工程properties中,增加一行

productModule=com.example.module.product.ProductModuleInitImpl

在 Application 中读取properties文件,并通过Class.forName获取到实体类,通过接口,调用ModuleInit.init()方法。批量进行子模块的初始化即可。

实现代码类图:

Android子模块初始化
Android子模块初始化

这样,我们在Application 中的代码就变成了:

for(IModuleInit module : moduleInitSDK.moduleInitImpls){
    module.init();
}

这样,我们就把需要在子模块中初始化的内容,从主 App 中移出,而是放到了子模块中初始化。

整个世界终于清净了。

待优化和解决的问题:

  1. 每个模块的启动耗时统计上报功能,如耗时较多,会引起 ANR。
  2. 子模块加载失败异常监控。
  3. 代码混淆保护。

如有任何疑问,欢迎给我留言反馈。

类似文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注