文章目录

  • 一、组件模式下为组件 Module 指定 Java 源码路径
  • 二、主应用的角色
  • 三、BuildConfig 中生成当前 组件 / 集成 模式字段
  • 四、Library Module 中的代码示例
  • 1、build.gradle 完整代码
  • 2、集成模式 下的 清单文件
  • 3、组件模式 下的 清单文件
  • 4、组件模式 下的 Application 类
  • 五、博客资源

一、组件模式下为组件 Module 指定 Java 源码路径


在 1 1 1 个 Android 应用中只能存在 1 1 1 个 Application 类 , 但是组件化开发时 , 如果 Library 模块动态修改成 Application 模块 , 还想自己定义一个 Application 类 , 这里参考上一篇博客 【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 ) 三、使用 sourceSets 配置组件模式下使用的清单文件 章节 , 使用 sourceSets 资源配置 , 配置 Java 代码 ;

在组件模式下 , 如果需要配置一些额外的 Java 类 , 可以在 sourceSets 中进行配置 ;

Java 源文件目录 , 默认是在 " Component\app\src\main\java " 目录下 , 该目录也是可以自定义的 ;

在 sourceSets 的 main 中 , 使用 java.srcDirs 可以配置多个目录 , 路径字符串之间使用逗号隔开 ;

android {
defaultConfig {
if (!isModuleMode){
// 组件模式 : 必须配置 applicationId
applicationId appId["library1"]
}

// 资源配置
sourceSets{
main{
if (!isModuleMode){
// 组件化模式下使用 ComponentAndroidManifest.xml 作为清单文件
manifest.srcFile 'src/main/component/AndroidManifest.xml'

// 配置额外的 Java 源文件目录
java.srcDirs 'src/main/component/java', 'src/main/java'
}else{
// 集成模式 下使用默认设置
}
}
}
}
}

​集成模式 下的目录效果 :​ src/main/component/java 目录是灰色的 , 并不是 Java 源码目录 ; ( 该模式下 依赖工程 是 Library Module )

【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )_集成模式

​组件模式 下的目录效果 :​ src/main/component/java 目录是蓝色的 , 是正式的 Java 源码目录 ; ( 该模式下 依赖工程 是 Application Module )

【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )_集成模式_02

二、主应用的角色


组件化中的主应用 , 仅作为一个壳存在 , 一般不实现实际功能 , 应用的功能都是由各个组件进行实现的 ;

在主应用的 build.gradle 中配置了如下依赖库 ;

dependencies {
if (isModuleMode){
// 集成模式下才能引用这两个 Library Module
implementation project(':library1')
implementation project(':library2')
}
}

如果是在 集成模式 中 , 会引入两个 Library 模块 ; 在 组件模式 中 , 两个模块是 Application 模块 , 不能引入到应用中 , 因此就不能依赖这两个 Module ;

这里就需要 主应用 与 2 2 2 个 Library 模块 的 耦合性不能太高 ;

三、BuildConfig 中生成当前 组件 / 集成 模式字段


如果想要在代码中 , 根据当前的组件化状态 ( 组件模式 / 集成模式 ) 进行不同的开发 , 就需在代码中获取当前 Module 是 Library Module ( 集成模式 ) 还是 Application Module ( 组件模式 ) ;

这里可以在 build.gradle 进行一些配置 , 在 BuildConfig.java 配置中 , 生成一些选项 , 如下代码就可以在 BuildConfig.java 类中生成 public static final boolean isModuleMode = false; 字段 ;

android {
defaultConfig {
// 在 BuildConfig 中生成如下字段
// public static final boolean isModuleMode = false;
buildConfigField("boolean", "isModuleMode", String.valueOf(isModuleMode))
}
}

​生成的 BuildConfig.java 类 :​

/**
* Automatically generated file. DO NOT MODIFY
*/
package kim.hsl.library1;

public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "kim.hsl.library1";
public static final String BUILD_TYPE = "debug";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
// Field from default config.
public static final boolean isModuleMode = false;
}

【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )_集成模式_03

在 Java 代码中通过调用 BuildConfig.isModuleMode 获取当前 Module 是 Library Module ( 集成模式 ) 还是 Application Module ( 组件模式 ) ;

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

Log.i("MainActivity", "当前的模式状态 ${BuildConfig.isModuleMode}")
}
}

四、Library Module 中的代码示例


1、build.gradle 完整代码

// 根据 isModuleMode 动态切换 集成模式 / 组件模式
if (isModuleMode){
// 集成模式
apply plugin: 'com.android.library'
}else{
// 组件模式
apply plugin: 'com.android.application'
}
apply plugin: 'kotlin-android'


println("Print Variable : rootProject.ext.androidConfig : ${rootProject.ext.androidConfig}")

// def 相当于 Java 中的 Object
// 声明 config 和 appId 变量 , 并为其赋值
def androidConfig = rootProject.ext.androidConfig
def appId = rootProject.ext.applicationId

android {
compileSdkVersion androidConfig.compileSdkVersion
buildToolsVersion "30.0.3"

defaultConfig {
if (!isModuleMode){
// 组件模式 : 必须配置 applicationId
applicationId appId["library1"]
}

minSdkVersion androidConfig.minSdkVersion
targetSdkVersion androidConfig.targetSdkVersion
versionCode androidConfig.versionCode
versionName androidConfig.versionName

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

// 在 BuildConfig 中生成如下字段
// public static final boolean isModuleMode = false;
buildConfigField("boolean", "isModuleMode", String.valueOf(isModuleMode))

// 资源配置
sourceSets{
main{
if (!isModuleMode){
// 组件化模式下使用 ComponentAndroidManifest.xml 作为清单文件
manifest.srcFile 'src/main/component/AndroidManifest.xml'

// 配置额外的 Java 源文件目录
java.srcDirs 'src/main/component/java', 'src/main/java'
}else{
// 集成模式 下使用默认设置
}
}
}
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}

dependencies {

implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

2、集成模式 下的 清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="kim.hsl.library1">

<application>
<activity android:name=".MainActivity"/>
</application>

</manifest>

3、组件模式 下的 清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="kim.hsl.library1">

<application
android:name=".Library1Application"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Component">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

4、组件模式 下的 Application 类

package kim.hsl.library1

import android.app.Application

class Library1Application: Application() {
override fun onCreate() {
super.onCreate()
}
}

五、博客资源


​博客源码 :​

  • ​GitHub :​ https://github.com/han1202012/Component