组件化与模块化
组件
组件指的是单一的功能组件,如视频组件(VideoSDK)、支付组件(PaySDK)、路由组件(Router)等,每个组件都能单独抽出来制作成SDK
模块
模块指的是独立的业务模块,如直播模块(LiveModule)、首页模块(HomeModule)、即时通信模块(IMModule)等。模块相对于组件来说粒度更大,模块可能包含多种不用的组件。
组件化开发的好处
(1)避免重复造轮子,可以节省开发和维护的成本。
(2)可以通过组件和模块为业务基准合理地安排人力,提高开发效率。
(3)不同的项目可以共用一个组件或模块,确保整体技术方案的统一性。
(4)为未来插件化共同用一套底层模型做准备
模块化开发的好处
(1)业务模块解耦,业务移植更加简单。
(2)多团队根据业务内容进行并行开发和测试。
(3)单个业务可以单独编译打包,加快编译速度。
(4)多个App共用模块,降低研发和维护成本。
多Module划分业务和基础功能,这个概念将作为组件化的基础。
组件化和模块化的本质思想是一样的,都是为了代码重用和业务解耦,区别在于模块化是业务导向,组件化是功能导向。组件化和模块化的划分将更好地为项目插件化开路。插件化的模块发布和正常发布有着非常大的差异,已经脱离了组件化和模块化的构建机制,插件化拥有更高效的业务解耦。
项目搭建
1.首先我们新建一个项目然后新建一个library(componentlib)和两个组件(logincomponent、minecomponent),如下图:
(1)app:应用层用于统筹全部组件,并输出生成App
(2)logincomponent和minecomponent作为组件来使用,包含一些简单的业务、比如登录、我的。
(3)componentlib:包含一些基础库和对基础库的封装,包含图片加载、网络加载,数据存储(正常是再抽离一层出来,作为Base层);还有作为通讯层,来进行各个组件的数据交互。
引用关系是app引用logincomponent和mincomponent,然后logincomponent和mincomponent引用componentlib;
2、项目中的配置
(1)在gradle.properties配置全局gradle环境
(2)app build.gradle的配置
logincomponent和minecomponent配置一样,下面是logincomponent build.gradle的配置
注意这里必须要配置两个AndroidManifest.xml,一个用于独立运行,一个用做组件
独立运行下的AndroidManifest如下:
作为组件的AndroidManifest.xml如下
minecomponent组件的配置一样,这里就不贴图了。
代码实现
配置完成后,我们就可以开始重头戏,撸代码。
组件化的时候我们首先要解决两个问题
1、回头看下项目结构图,由于App引用了logincomponent和minecomponent这个两个组件,而他们两个作为组件要怎么拿到App的Application这个项目唯一的全局上下文。
2、组件间如何通讯。
组件获取到上下文
对于问题1,我们可以在App层,通过反射将Application设置到两个组建中,这样组件就可以使用到App层的Application。
(1)首先在componentlib中定义接口IAppComponent:
public interface IAppComponent {
void initializa(Application application);
}
(2)然后组件的Application继承该接口:
public class LoginApp extends Application implements IAppComponent {
private static Application application;
public static Application getApplicatoin(){
return application;
}
//独立运行的时候,这里是入口
@Override
public void onCreate() {
super.onCreate();
initializa(this);
}
//这里获取到了全局的Application
@Override
public void initializa(Application application) {
this.application = application;
}
}
注意上面的onCreate()方法,作为组件的时候是不会被调用的,但是独立运行的时候onCreate就是入口了。
(3)App的Application通过反射进行组件的实例化
public class AppConfig {
public static final String[] COMPONENTS = {
"com.kangjj.logincomponent.LoginApp",
"com.kangjj.manecomponent.MineApp"
};
}
public class MainApp extends Application implements IAppComponent {
private MainApp application;
public MainApp getApplication() {
return application;
}
@Override
public void onCreate() {
super