【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )
文章目錄
- 一、組件模式下為組件 Module 指定 Java 源碼路徑
- 二、主應用的角色
- 三、BuildConfig 中生成當前 組件 / 集成 模式字段
- 四、Library Module 中的代碼示例
- 1、build.gradle 完整代碼
- 2、集成模式 下的 清單文件
- 3、組件模式 下的 清單文件
- 4、組件模式 下的 Application 類
- 五、博客資源
一、組件模式下為組件 Module 指定 Java 源碼路徑
在 111 個 Android 應用中只能存在 111 個 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){// 組件模式 : 必須配置 applicationIdapplicationId 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 )
組件模式 下的目錄效果 : src/main/component/java 目錄是藍色的 , 是正式的 Java 源碼目錄 ; ( 該模式下 依賴工程 是 Application Module )
二、主應用的角色
組件化中的主應用 , 僅作為一個殼存在 , 一般不實現實際功能 , 應用的功能都是由各個組件進行實現的 ;
在主應用的 build.gradle 中配置了如下依賴庫 ;
dependencies {if (isModuleMode){// 集成模式下才能引用這兩個 Library Moduleimplementation project(':library1')implementation project(':library2')} }如果是在 集成模式 中 , 會引入兩個 Library 模塊 ; 在 組件模式 中 , 兩個模塊是 Application 模塊 , 不能引入到應用中 , 因此就不能依賴這兩個 Module ;
這里就需要 主應用 與 222 個 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; }
在 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.applicationIdandroid {compileSdkVersion androidConfig.compileSdkVersionbuildToolsVersion "30.0.3"defaultConfig {if (!isModuleMode){// 組件模式 : 必須配置 applicationIdapplicationId appId["library1"]}minSdkVersion androidConfig.minSdkVersiontargetSdkVersion androidConfig.targetSdkVersionversionCode androidConfig.versionCodeversionName androidConfig.versionNametestInstrumentationRunner "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 falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility 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"?> <manifestxmlns: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"><applicationandroid: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.library1import android.app.Applicationclass Library1Application: Application() {override fun onCreate() {super.onCreate()} }
五、博客資源
博客源碼 :
- GitHub : https://github.com/han1202012/Component
- CSDN 下載 : https://download.csdn.net/download/han1202012/18755837
總結
以上是生活随笔為你收集整理的【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 组件化】使用 Grad
- 下一篇: 【Android 组件化】路由组件 (