在模块化开发中如何使各个模块(module)单独运行
在组件化还发中,为了提高开发效率,避免不必要的编译事件浪费,就不得不使单个业务模块独立运行。那如何实现呢?
Android中有源集的概念,源集很好的解决了这类需求问题:有关源集的问题可自行搜索及看我之前的文章。在这里我们用到了源集重定向。
步骤一:
在gradle.properties文件中创建一个变量runModule,如下:
#控制运行哪个模块(1:运行app模块 2:运行dataaccount模块)
runModule=2
步骤二:
在原来的app module(原始的程序入口module)中修改插件:
if (Integer.valueOf(runModule) == 1) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
接下来修改applicationId,如下:
defaultConfig {
if (Integer.valueOf(runModule) == 1) {//当为运行module时才有applicationId属性(可以做到不同module的app能在手机上共存)
applicationId "com.muheda.dataaccount"
}
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
multiDexEnabled true
}
这一步的最后就是修改源集,如下:
android {
if (Integer.valueOf(runModule) != 1) {
sourceSets {
// main源集(source set)的闭包配置。
main {
//每个源集只能有一个AndroidManifest.xml清单文件,
//默认情况下,main源集的清单文件在src/main/ 目录中。
manifest.srcFile 'src/other/AndroidManifest.xml'
}
}
}
}
说明:如上图所示,这里的源集重定向用的是相对路径,因为你要配置的文件是build.gradle,以build.gradle为基准AndroidMainfest.xml的路劲就是src/other/AndroidManifest.xml。
注意在lib中要去掉默认的启动activity如下图:
删除选项框中的代码即可
步骤三:
配置其他Module的build.gradle文件,配置方法和步骤二类似
首先配置插件:
if (Integer.valueOf(runModule) == 2) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
然后配置applicationId
defaultConfig {
if (Integer.valueOf(runModule) == 2) {
applicationId "com.muheda.data"
}
minSdkVersion 17
targetSdkVersion 28
versionCode 1
versionName "1.0"
multiDexEnabled true
}
最后配置源集:
android {
if (Integer.valueOf(runModule) == 2) {
sourceSets {
main {
// 变更Java 的源文件夹,默认的文件夹 = 'src/main/java'.
java.srcDirs = ['src/other/java']
//如果像以下方式一样,列出来多个文件夹,那么Gradle使用所有的这些文件夹来加载资源,
//并赋予这些文件夹相同的优先级。如果不同的文件夹中定义了相同的资源,那么会产生资源合并错误。
//默认的资源文件夹是 'src/main/res'.
res.srcDirs = ['src/other/res']
//每个源集只能有一个AndroidManifest.xml清单文件,
//默认情况下,main源集的清单文件在src/main/ 目录中。
manifest.srcFile 'src/other/AndroidManifest.xml'
}
}
}
}
到此为止大功告成,总体来说配置过程不是很麻烦。接下来只要修改gradle.properties文件中runModule的值就可以自由切换了。