Android组件化开发基础搭建

171 阅读2分钟

本文只是自己在学习组件化时,做的随手笔记,便于以后自己再次学习。内容有瑕疵,大家包涵。

项目地址:

github -> github.com/joe-kai/crm…

gitee -> gitee.com/JoeKaiy/crm…

一、创建config.gradle

image.png

编写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配置 image.png


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"

到此,组件化基本的空壳搭建完成,具体内容以后再慢慢更新。我也是刚开始学习组件化,不足之处大家多多包涵!