手把手教你撸一个简单的模块化框架项目

先上代码ModuleDemo

1. 什么是模块化

将一个APK拆分成多个模块(组件)进行开发,开发阶段可以独立测试,通用模块可以重复使用,开发完成之后可以将所有模块(组件)整合为一个完整的APK。

2. 为什么会出现模块化

在我门进行项目的开发过程中,随着业务的不断增加、代码量越来越多、具有相同功能或者模块出现。从而就会导致以下问题的发生。
1. 各种业务耦合在一起,不利于后期开发人员的维护。
2. 一个小小的改动需要全局编译,而且编译时间过长,浪费时间。
为了解决以上问题,所以就出现了模块化。

3. 为什么要使用模块化

  1. 模块化可以模块解耦、避免模块耦合、提升团队的开发效率。
  2. 单独模块可以独立运行、单独模块不依赖其他模块、结构清晰、层次明显、减少维护成本与开发时间。
  3. 每个组件业务可以由开发者自行决定采取MVP/MVC等架构,而不影响整体项目架构。
  4. 优秀的代码、组件可以快速的移植使用。

4. 实际操作

1. 创建版本控制

在我们开发过程中,可能多个模块之间会使用到相同的配置例如编译版本,第三方依赖等,这些相同的东西后期如果需要更改,我们可能需要改很多地方,故可以写一个配置文件。

  1. 首先创建一个文件,起名叫config.gradle


    创建配置文件
  2. 创建好配置文件之后,接下来就是如何去写配置文件。


    配置文件的写法
  3. 写好配置文件,接下来就需要引用配置文件,因为我们这个配置文件需要整个项目都可以使用,故我们需要在整个项目的gradle中去引用。如图在project的gradle中添加下面代码即可。
apply from: "config.gradle"
配置文件引用
  1. 引用完配置文件之后就是,如何去相应的gradle中使用了。红色框中就是在gradle中的使用方法。
/**
    1. rootProject.ext是固定不变的。
    2. android 是之前写配制文件自己随便命名的东西 。
    3. compileSdkVersion 是数组中的key。
**/
compileSdkVersion rootProject.ext.android.compileSdkVersion
在相应的gradle中使用配置文件

好了版本控制文件的创建、书写、引用、使用,就已经完成了。

2. 动态切换lib和App模式

上面为什么使用模块化有提过,每个模块可以独立运行的,所以我没就需要对该模块进行设置,用了控制什么时候该模块是App什么时候该模块是lib

  1. 首先我们需要在之前的配置文件(config.gradle)中定义一个变量用来控制该模块是App还是lib


    定义用来控制该模块是App还是lib的变量
  2. 在相应模块的gradle中添加下面代码,用来判断是APP还是lib
if (rootProject.ext.isApp) {
    //当前模块为app
    apply plugin: 'com.android.application'
} else {
    //当前模块为lib
    apply plugin: 'com.android.library'
}
用来判断当前模块是APP还是lib
3. AndroidManifest的管理

同上,每个app在运行的时候,需要一个默认的启动页,而在lib中则是不需要的。所以app的AndroidManifest和lib的AndroidManifest是不一样的,所以我们就需要将lib和app的AndroidManifest分开写

  1. 创建AndroidManifest,我们在每个module的main目录下创建一个文件,这个文件就叫module用来存放App模式下的AndroidManifest,而之前的AndroidManifest则作为lib模式下的AndroidManifest


    分别创建app模式下的AndroidManifest和lib模式下的AndroidManifest
  2. 创建好AndroidManifest下来就是使用了,在相应的moudle的gradle添加下面代码
 sourceSets {
        main {
            if (rootProject.ext.isApp) {
                //  这里需要注意manifest.srcFile中的manifest的m为小写,大写M会报错,下面也是一样
                manifest.srcFile 'src/main/module/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/AndroidManifest.xml'
                //  lib模式下,去除多余的debug包
               java{
                   exclude 'debug/**'
               }

            }
        }
    }
配置AndroidManifest
4. 组件之间资源命名冲突

我们知道有的时候,在不同的Module下,有可能存在着相同名称的资源,例如布局文件,颜色,等等,而出现上面的情况,就会导致我们app中不同module的资源冲突。解决方式就是在相应Module的gradle添加下面代码

  resourcePrefix "modulea_"//modulea_根据自己的module进行命名
资源冲突解决方式
5. 组件之间Activity的跳转、数据传递、Fragment的使用
  1. Activity的跳转和Fragment的使用我们可以使用第三方框架ARouter,这里我不多说,不会的可以去网上搜怎么使用
  2. 数据传递也可以使用EventBus

好了到这里就搭建好一个简单的模块化框架了,我这里只是说下怎么搭建模块化项目,至于项目中的的目录结构我没说多少,不同的人有不同的理解,无非就是多加几个Module。
最后贴上我自己写的代码ModuleDemo

你可能感兴趣的:(手把手教你撸一个简单的模块化框架项目)