可以参考Android彻底组件化,不过我没有用JIMU框架。
项目发展到一定程度,随着人员的增多,代码越来越臃肿,这时候就必须进行模块化的拆分。在我看来,模块化是一种指导理念,其核心思想就是分而治之、降低耦合。而在Android工程中如何实施,目前有两种途径,也是两大流派,一个是组件化,一个是插件化。
要实现组件化,不论采用什么样的技术路径,需要考虑的问题主要包括下面几个:
- 代码解耦。如何将一个庞大的工程拆分成有机的整体?
- 组件单独运行。上面也讲到了,每个组件都是一个完整的整体,如何让其单独运行和调试呢?
- 数据传递。因为每个组件都会给其他组件提供的服务,那么主项目(Host)与组件、组件与组件之间如何传递数据?
- UI跳转。UI跳转可以认为是一种特殊的数据传递,在实现思路上有啥不同?
- 组件的生命周期。我们的目标是可以做到对组件可以按需、动态的使用,因此就会涉及到组件加载、卸载和降维的生命周期。
- 集成调试。在开发阶段如何做到按需的编译组件?一次调试中可能只有一两个组件参与集成,这样编译的时间就会大大降低,提高开发效率。
- 代码隔离。组件之间的交互如果还是直接引用的话,那么组件之间根本没有做到解耦,如何从根本上避免组件之间的直接引用呢?也就是如何从根本上杜绝耦合的产生呢?只有做到这一点才是彻底的组件化
基于以上目的再gradle中做如下操作
if (isModule.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
android {
compileSdkVersion rootProject.ext.android["compileSdkVersion"]
defaultConfig {
minSdkVersion rootProject.ext.android["minSdkVersion"]
targetSdkVersion rootProject.ext.android["targetSdkVersion"]
versionCode rootProject.ext.android["versionCode"]
versionName rootProject.ext.android["versionName"]
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
sourceSets {
main {
if (isModule.toBoolean()) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
//集成开发模式下排除debug文件夹中的所有Java文件
java {
exclude 'debug/**'
}
}
}
}
isModule我放在工程的gradle.properties中切换时library还是要单独运行
if (isModule.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
下面时阿里的ARouter在模块化使用中在module需要加了
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
下面时切换AndroidManifest,当是单独运行时是有应用名图标等的。如果不分开是有AndroidManifest合并冲突的。
main {
if (isModule.toBoolean()) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
//集成开发模式下排除debug文件夹中的所有Java文件
java {
exclude 'debug/**'
}
}
}
还有就是dependencies中添加依赖的问题。在多个module中添加依赖需要注意的地方。
以前用compile现在分implementation和api,这两个是有区别的。简单说个特例,就是当你有个公共组件module里面还有个公共基础组件。然后你的功能模块的组件添加了公共组件,如果你要使用依赖的公共组件的依赖的基础组件你用implementation就不能使用。你就要用api了。这就是区别。
以上你基本就能进行了。下面再说dagger2,arouter在组件化项目中的如何添加依赖。然后是mvp结合dagger2的使用以及模块化的一些问题,今天先写到这里,后面再继续写。
后篇: