背景
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()方法。批量进行子模块的初始化即可。
实现代码类图:
这样,我们在Application 中的代码就变成了:
for(IModuleInit module : moduleInitSDK.moduleInitImpls){
module.init();
}
这样,我们就把需要在子模块中初始化的内容,从主 App 中移出,而是放到了子模块中初始化。
整个世界终于清净了。
待优化和解决的问题:
- 每个模块的启动耗时统计上报功能,如耗时较多,会引起 ANR。
- 子模块加载失败异常监控。
- 代码混淆保护。
如有任何疑问,欢迎给我留言反馈。
赛文市场营销