代码Github:
文章目录
- 1 配置config.gradle
- 2 配置app的build.gradle
- 3 配置module1的build.gradle
- 4 配置module2的build.gradle
- 5 配置isModule的值
- 5.1 isModule = true
- 5.2 isModule = false
配置流程简介
- 在项目根目录中新建
config.gradle
,并添加需要统一配置的属性值 - 在项目的build.gradle中引入配置好的config.gradle
- 在app的build.gradle中使用config.gradle中统一配置好的属性值。其中通过
isModule
可以控制项目是否需要依赖我们的module - 在我们的Module中需要使用isModule来决定我们的Module是组件模式还是集成模式。当然在不同的模式下,我们还需要配置不同的SourceSet。
Gradle组件化配置
简介: gradle 是一个构建工具。负责管理项目依赖,组织项目结构,完成项目构建的工作。基于Groovy语言(Groovy是一种基于JVM的敏捷开发语言,可以简单的理解为强类型语言java的弱类型版本)。
- build.gradle // 构建脚本文件,主要的构建配置都在这里写
- gradle // 存放gradle wrapper 执行配置和工具的文件夹,
- gradlew // gradle wrapper 执行脚本文件,用来在没有安装 gradle 的情况下执行 gradle 命令。当然,第一次执行时会下载 gradle。
- gradlew.bat // gradle wrapper 执行脚本文件的 windows 版
- settings.gradle // 项目配置,指明根项目名字和引入的 module
1 配置config.gradle
config.gradle配置工程下所有module配置
1 新建config.gradle (和Project的build.gradle同级).
2 在Project的build.gradle文件中引入config.gradle,如下:
//相当于引入头文件 将 config中的内容引入进来
apply from: "config.gradle"
3 config.gradle中添加内容,如下:
ext { //extend
// false: 组件模式
// true :集成模式
isModule = false
android = [
compileSdkVersion: 28,
minSdkVersion : 15,
targetSdkVersion : 28,
versionCode : 1,
versionName : "1.0"
]
appId = ["app" : "com.hongx.host",
"module1": "com.hongx.module1",
"module2" : "com.hongx.module2" ]
supportLibrary = "28.0.0"
dependencies = [
"appcompat-v7" : "com.android.support:appcompat-v7:${supportLibrary}",
]
}
2 配置app的build.gradle
apply plugin: 'com.android.application'
//赋值与引用
def cfg = rootProject.ext.android
def appId = rootProject.ext.appId
android {
compileSdkVersion cfg.compileSdkVersion
defaultConfig {
applicationId appId["app"]
minSdkVersion cfg.minSdkVersion
targetSdkVersion cfg.targetSdkVersion
versionCode cfg.versionCode
versionName cfg.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
...
}
dependencies {
...
//false: 组件模式 ; true :集成模式
if(isModule){//如果isModule为true,就将module1和module2依赖到app中
implementation project(':module1')
implementation project(':module2')
}
}
3 配置module1的build.gradle
module1是一个android的library,其build.gradle配置如下:
apply plugin: 'com.android.library'
//赋值与引用
def cfg = rootProject.ext.android
android {
compileSdkVersion cfg.compileSdkVersion
defaultConfig {
minSdkVersion cfg.minSdkVersion
targetSdkVersion cfg.targetSdkVersion
versionCode cfg.versionCode
versionName cfg.versionName
...
}
...
}
...
4 配置module2的build.gradle
module2是library还是application由isModule决定,如下:
//根据isModule标签动态的切换 集成/组件模式
if(isModule){
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
//赋值与引用
def cfg = rootProject.ext.android
def appId = rootProject.ext.appId
android {
compileSdkVersion cfg.compileSdkVersion
defaultConfig {
minSdkVersion cfg.minSdkVersion
targetSdkVersion cfg.targetSdkVersion
versionCode cfg.versionCode
versionName cfg.versionName
...
//组件模式下
if(!isModule){
applicationId appId['module2']//com.hongx.module2
}
//资源配置
sourceSets{
main{
//在组件模式下 使用不同的manifest文件
if(!isModule){
manifest.srcFile 'src/main/module/AndroidManifest.xml'
java.srcDirs 'src/main/module/java','src/main/java'
}else{
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
}
...
}
...
5 配置isModule的值
5.1 isModule = true
当config.gradle中的isModule = true时,此时module1和module2将作为依赖库导入到app中。
在app的MainActivity中设置两个按钮,一个跳转到module1中的某个Activity,一个跳转到module2中的某个Activity。
import com.hongx.module1.Module1Activity;
import com.hongx.module2.Module2Activity;
public void module1Jump(View view) {
Intent intent = new Intent(MainActivity.this, Module1Activity.class);
startActivity(intent);
}
public void module2Jump(View view) {
Intent intent = new Intent(MainActivity.this, Module2Activity.class);
startActivity(intent);
}
在module1中的AndroidManifest.xml中添加Module1Activity,如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hongx.module1">
<application>
<activity android:name=".Module1Activity" />
</application>
</manifest>
在module2中的AndroidManifest.xml中添加Module2Activity,如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hongx.module2">
<application>
<activity android:name=".Module2Activity" />
</application>
</manifest>
Make Project后,module1和module2前都有一个红叉,说明module1和module2都不能单独作为app运行。
运行app后,都能跳转到module1和module2的Activity中。
5.2 isModule = false
当config.gradle中的isModule = true时,此时app将不再依赖module1和module2。
如果再运行app会报错,如下:
当然我们可以将module2作为一个单独的app运行
添加红色框中代码,对应的就是在build.gradle中配置的,如下:
在AndroidManifest.xml中就是和正常的一样,如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hongx.module2">
<application
android:name=".Module2Application"
...
<activity android:name=".Module2MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
此时,Make Project后
module2已经可以作为一个app单独运行了。
代码Github: