本文只是自己在学习组件化时,做的随手笔记,便于以后自己再次学习。内容有瑕疵,大家包涵。
项目地址:
github -> github.com/joe-kai/crm…
gitee -> gitee.com/JoeKaiy/crm…
一、创建config.gradle
编写config.gradle
/**
* 全局共享文件,方便统一管理依赖和Maven*/
ext {
isModule = false
isModuleCommon = false
app_versions = [
minSdkVersion : 26,
compileSdkVersion: 33,
targetSdkVersion : 33,
versionCode : 1,
versionName : '1.0',
]
appcompat_version = "1.5.0"
constraint_version = "2.1.4"
datastore_version = "1.0.0"
paging_version = "3.1.1"
aRouter_version = "1.5.2"
refresh_version = "2.0.5"
loadSir_version = "1.3.8"
retrofit_version = "2.9.0"
eventbus_version = "3.3.1"
lifecycle_version = "2.6.0-alpha01"
banner_version = "2.2.2"
glide_version = "4.13.2"
immersionBar_version = "3.2.2"
autoSize_version = "v1.2.1"
circleImage_version = "3.1.0"
hiltVersion = "2.42"
activity_version = "1.6.0"
fragment_version = "1.5.4"
library = [
"activity_ktx" : "androidx.activity:activity-ktx:$activity_version",
"fragment_ktx" : "androidx.fragment:fragment-ktx:$fragment_version",
"material" : 'com.google.android.material:material:1.4.0',
"recyclerview" : "androidx.recyclerview:recyclerview:1.2.1",
"appcompat" : "androidx.appcompat:appcompat:${appcompat_version}",
"constraintlayout" : "androidx.constraintlayout:constraintlayout:$constraint_version",
"datastore" : "androidx.datastore:datastore:$datastore_version",
"datastore_core" : "androidx.datastore:datastore-core:$datastore_version",
"datastore_preferences": "androidx.datastore:datastore-preferences:$datastore_version",
//paging3
"paging_runtime" : "androidx.paging:paging-runtime:$paging_version",
"paging_common" : "androidx.paging:paging-common:$paging_version",
"arouter_api" : "com.alibaba:arouter-api:$aRouter_version",
"refresh-layout" : "io.github.scwang90:refresh-layout-kernel:$refresh_version",
//经典刷新头
"refresh-header" : "io.github.scwang90:refresh-header-classics:$refresh_version",
"loadsir" : "com.kingja.loadsir:loadsir:$loadSir_version",
//网络请求
"retrofit" : "com.squareup.retrofit2:retrofit:$retrofit_version",
"converter-gson" : "com.squareup.retrofit2:converter-gson:$retrofit_version",
"logging-interceptor" : "com.squareup.okhttp3:logging-interceptor:4.10.0",
"eventbus" : "org.greenrobot:eventbus:$eventbus_version",
//Androidx lifecycle
"viewmodel" : "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version",
"livedata" : "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version",
"banner" : "io.github.youth5201314:banner:$banner_version",
//图片加载
"glide" : "com.github.bumptech.glide:glide:$glide_version",
"brvah" : "io.github.cymchad:BaseRecyclerViewAdapterHelper:3.0.8",
//今日头条屏幕适配
"AndroidAutoSize" : "com.github.JessYanCoding:AndroidAutoSize:$autoSize_version",
//圆形图像
"circleimageview" : "de.hdodenhof:circleimageview:$circleImage_version",
"fastjson2" : 'com.alibaba.fastjson2:fastjson2:2.0.14',
"XPopup" : 'com.github.li-xiaojun:XPopup:2.9.0',
"flexbox" : 'com.google.android.flexbox:flexbox:3.0.0',
]
library_arouter_compiler = "com.alibaba:arouter-compiler:$aRouter_version"
library_glide_compiler = "com.github.bumptech.glide:compiler:$glide_version"
}
二、使用config.gradle
1.在主build.gradle添加
buildscript {
apply from: file('config.gradle')
...
}
2.在module的build.gradle中使用
- 判断application Or library
if (isModule) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
- app版本信息
android {
compileSdk app_versions.compileSdkVersion
defaultConfig {
minSdk app_versions.minSdkVersion
targetSdk app_versions.targetSdkVersion
versionCode app_versions.versionCode
versionName app_versions.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
......
}
- 判断AndroidManifest使用
android {
...
sourceSets {
main {
if (isModule) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
//集成开发模式下排除debug文件夹中的所有Java文件
java {
exclude '*module'
}
}
}
}
...
}
- 引入第三方库
在lib_base中引入即可
def libraryList = library
dependencies {
...
libraryList.each { k, v -> api v }
kapt library_glide_compiler
kapt library_arouter_compiler
}
三、声明AndroidManifest
1、新建文件夹
- module_xxx -> main -> module(新建)
- src/main/module/AndroidManifest.xml
- 当module_xxx为application时使用
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.joekai.module_user">
//内容自行修改
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:name=".App.UserApp"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme.NoActionBar">
<activity android:name=".ui.login.LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
- src/main/AndroidManifest.xml
- 当module_xxx为library时使用
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.joekai.module_user">
<application>
<activity android:name=".ui.login.LoginActivity">
</activity>
<activity android:name=".ui.register.RegisterActivity"></activity>
</application>
</manifest>
四、Kotlin使用ARouter
- 注意,在modeule->build.gradle配置
apply plugin: 'kotlin-kapt'
android {
......
}
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
dependencies {
api project(':base_library')
kapt library.arouter_compiler
}
五、补充
由于每次新建moudle_xxx时,都要再次编写modeule->build.gradle,所以可以新建一个module.gradle,用来管理所有的module配置
if (isModule) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
apply plugin: 'org.jetbrains.kotlin.android'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.alibaba.arouter'
apply plugin: 'kotlin-android'
apply plugin: 'dagger.hilt.android.plugin'
android {
compileSdk app_versions.compileSdkVersion
defaultConfig {
minSdk app_versions.minSdkVersion
targetSdk app_versions.targetSdkVersion
versionCode app_versions.versionCode
versionName app_versions.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
configurations.all {
resolutionStrategy { force 'android.code:code-ktx:1.6.0' }
}
}
sourceSets {
main {
if (isModule) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
//集成开发模式下排除debug文件夹中的所有Java文件
java {
exclude '*module'
}
}
}
}
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'
}
buildFeatures {
dataBinding = true
viewBinding = true
}
}
kapt {
javacOptions {
// These options are normally set automatically via the Hilt Gradle plugin, but we
// set them manually to workaround a bug in the Kotlin 1.5.20
option("-Adagger.fastInit=ENABLED")
option("-Adagger.hilt.android.internal.disableAndroidSuperclassValidation=true")
}
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
dependencies {
api project(':lib_base')
kapt library_arouter_compiler
implementation "com.google.dagger:hilt-android:$hiltVersion"
kapt "com.google.dagger:hilt-android-compiler:$hiltVersion"
if (!isModuleCommon){
api project(':module_common')
}
}
在module中build.gradle直接引用
apply from: "../base_module.gradle"
到此,组件化基本的空壳搭建完成,具体内容以后再慢慢更新。我也是刚开始学习组件化,不足之处大家多多包涵!