Android组件化1-Gradle组件化配置

代码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

配置流程简介

  1. 在项目根目录中新建config.gradle,并添加需要统一配置的属性值
  2. 在项目的build.gradle中引入配置好的config.gradle
  3. 在app的build.gradle中使用config.gradle中统一配置好的属性值。其中通过isModule可以控制项目是否需要依赖我们的module
  4. 在我们的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同级).
Android组件化1-Gradle组件化配置_第1张图片
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运行。
Android组件化1-Gradle组件化配置_第2张图片

运行app后,都能跳转到module1和module2的Activity中。

5.2 isModule = false

当config.gradle中的isModule = true时,此时app将不再依赖module1和module2。

如果再运行app会报错,如下:
在这里插入图片描述

当然我们可以将module2作为一个单独的app运行
Android组件化1-Gradle组件化配置_第3张图片

添加红色框中代码,对应的就是在build.gradle中配置的,如下:
Android组件化1-Gradle组件化配置_第4张图片

在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后
Android组件化1-Gradle组件化配置_第5张图片
module2已经可以作为一个app单独运行了。

代码Github:

你可能感兴趣的:(#,Android,IOC和组件化,android,组件化,Gradle)