先上代码ModuleDemo
1. 什么是模块化
将一个APK拆分成多个模块(组件)进行开发,开发阶段可以独立测试,通用模块可以重复使用,开发完成之后可以将所有模块(组件)整合为一个完整的APK。
2. 为什么会出现模块化
在我门进行项目的开发过程中,随着业务的不断增加、代码量越来越多、具有相同功能或者模块出现。从而就会导致以下问题的发生。
1. 各种业务耦合在一起,不利于后期开发人员的维护。
2. 一个小小的改动需要全局编译,而且编译时间过长,浪费时间。
为了解决以上问题,所以就出现了模块化。
3. 为什么要使用模块化
- 模块化可以模块解耦、避免模块耦合、提升团队的开发效率。
- 单独模块可以独立运行、单独模块不依赖其他模块、结构清晰、层次明显、减少维护成本与开发时间。
- 每个组件业务可以由开发者自行决定采取MVP/MVC等架构,而不影响整体项目架构。
- 优秀的代码、组件可以快速的移植使用。
4. 实际操作
1. 创建版本控制
在我们开发过程中,可能多个模块之间会使用到相同的配置例如编译版本,第三方依赖等,这些相同的东西后期如果需要更改,我们可能需要改很多地方,故可以写一个配置文件。
-
首先创建一个文件,起名叫config.gradle
-
创建好配置文件之后,接下来就是如何去写配置文件。
- 写好配置文件,接下来就需要引用配置文件,因为我们这个配置文件需要整个项目都可以使用,故我们需要在整个项目的gradle中去引用。如图在project的gradle中添加下面代码即可。
apply from: "config.gradle"
- 引用完配置文件之后就是,如何去相应的gradle中使用了。红色框中就是在gradle中的使用方法。
/**
1. rootProject.ext是固定不变的。
2. android 是之前写配制文件自己随便命名的东西 。
3. compileSdkVersion 是数组中的key。
**/
compileSdkVersion rootProject.ext.android.compileSdkVersion
好了版本控制文件的创建、书写、引用、使用,就已经完成了。
2. 动态切换lib和App模式
上面为什么使用模块化有提过,每个模块可以独立运行的,所以我没就需要对该模块进行设置,用了控制什么时候该模块是App什么时候该模块是lib
-
首先我们需要在之前的配置文件(config.gradle)中定义一个变量用来控制该模块是App还是lib
- 在相应模块的gradle中添加下面代码,用来判断是APP还是lib
if (rootProject.ext.isApp) {
//当前模块为app
apply plugin: 'com.android.application'
} else {
//当前模块为lib
apply plugin: 'com.android.library'
}
3. AndroidManifest的管理
同上,每个app在运行的时候,需要一个默认的启动页,而在lib中则是不需要的。所以app的AndroidManifest和lib的AndroidManifest是不一样的,所以我们就需要将lib和app的AndroidManifest分开写
-
创建AndroidManifest,我们在每个module的main目录下创建一个文件,这个文件就叫module用来存放App模式下的AndroidManifest,而之前的AndroidManifest则作为lib模式下的AndroidManifest
- 创建好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/**'
}
}
}
}
4. 组件之间资源命名冲突
我们知道有的时候,在不同的Module下,有可能存在着相同名称的资源,例如布局文件,颜色,等等,而出现上面的情况,就会导致我们app中不同module的资源冲突。解决方式就是在相应Module的gradle添加下面代码
resourcePrefix "modulea_"//modulea_根据自己的module进行命名
5. 组件之间Activity的跳转、数据传递、Fragment的使用
- Activity的跳转和Fragment的使用我们可以使用第三方框架ARouter,这里我不多说,不会的可以去网上搜怎么使用
- 数据传递也可以使用EventBus
好了到这里就搭建好一个简单的模块化框架了,我这里只是说下怎么搭建模块化项目,至于项目中的的目录结构我没说多少,不同的人有不同的理解,无非就是多加几个Module。
最后贴上我自己写的代码ModuleDemo