1.解耦性强:随着业务的增多,代码变的越来越复杂,每个模块之间的代码耦合变得越来越严重,解耦问题急需解决。
2. 编译时间大大减少:以为业务场景对,代码越来越大,同时编译时间也会越来越长。
3.提高团队协同开发: 团队协同开发存在较多的冲突.不得不花费更多的时间去沟通和协调,影响开发效率 。
模块化的定义:
Modular programming is a software design technique that emphasizes separating the functionality of a program into independent, interchangeable modules, such that each contains everything necessary to execute only one aspect of the desired functionality.
英文好的同学自己就自己看英文了,具体意思就是,模块化就是将一个程序按照其功能做拆分,分成相互独立的模块,以便于每个模块只包含与其功能相关的内容。比如登录功能可以是一个模块。
主要的思想:(从网上找的)
android 模块化开发主要是以module来拆分,觉的来代码直接一点。
首先看一下demo的studio结构:
简单说明一下,这里我只要是分成三个部分,一个肯定是我们的宿主APP模块,第二个就是Base模块,这个模块是我们的基础模块,也就是各个module的库,第三个是FirstModule(module的写错了),这个是我模拟的一个功能模块module(实际的业务模块)。
在FirstModule的gradle文件中
//在文件的顶部
if(isBuildModule.toBoolean()){
apply plugin: 'com.android.application'
}else{
apply plugin: 'com.android.library'
}
//在Android模块中
sourceSets {
main {
if (isBuildModule.toBoolean()) {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/release/AndroidManifest.xml'
}
}
}
//isBuildModule是在gradle.properties中声明
isBuildModule=false
在然后是配置AndroidManifest.xml文件,以为当isBuildModule=true时,FirstModule是一个可以运行的模块,为false时是一个库,所以要配置一个AndroidManifest.xml
false就是debug的AndroidManifest.xml,true就是release的AndroidManifest.xml
两个代码是分别是
//debug
//release
FirstModule 基本就完成了,APP的宿主和我们平时一样,不用改什么,我在APP中创建MainActivity,在FirstModule中坚决了firstActivity。然后用intent跳转
Intent intent = new Intent(MainActivity.this, FristActivity.class); startActivity(intent);
单isBuildModule=false是项目成功了跳转到FirstActivity了,可单isBuildModule=true时,也就是FirstModule为一个可运行的demo时,APP模块FirstActivity应用爆红了,找不到这个class。原因就是FirstModule不是一个库所以在不到这类,所以我们不能用intent,当然可以用隐式跳转,但是麻烦容易出错,所以在这里我采用了阿里的路由,GitHub的地址:https://github.com/alibaba/ARouter,具体内容的自己去看。
我把这个ARouter依赖带Base module库中,配置的时候有2个需要注意的是:
1:gradle的版本<2.2是是用apt的compilel的,版本>2.2的用api。
2:api 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar' 这个是阿里的插件,每个module都要添加同样还有在gradle的Android模块加
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
然后在各个module中应用Base库
implementation project(':Base')
最后就按ARouter的规则来跳转。
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ARouter.getInstance().build("/frist/fristactivity").navigation();
}
});
@Route(path = "/frist/fristactivity")
public class FristActivity extends AppCompatActivity {...}
demo下载