【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )
一、组件模式下为组件 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{
// 集成模式 下使用默认设置
}
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
集成模式 下的目录效果 : src/main/component/java 目录是灰色的 , 并不是 Java 源码目录 ; ( 该模式下 依赖工程 是 Library Module )
组件模式 下的目录效果 : src/main/component/java 目录是蓝色的 , 是正式的 Java 源码目录 ; ( 该模式下 依赖工程 是 Application Module )
二、主应用的角色
组件化中的主应用 , 仅作为一个壳存在 , 一般不实现实际功能 , 应用的功能都是由各个组件进行实现的 ;
在主应用的 build.gradle 中配置了如下依赖库 ;
dependencies {
if (isModuleMode){
// 集成模式下才能引用这两个 Library Module
implementation project(':library1')
implementation project(':library2')
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
如果是在 集成模式 中 , 会引入两个 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))
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
生成的 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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
在 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}")
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
四、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'
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
4、组件模式 下的 Application 类
package kim.hsl.library1
import android.app.Application
class Library1Application: Application() {
override fun onCreate() {
super.onCreate()
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
五、博客资源
博客源码 :
- GitHub : https://github.com/han1202012/Component
- CSDN 下载 : https://download.csdn.net/download/han1202012/18755837
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/116845118
- 点赞
- 收藏
- 关注作者
评论(0)