Android組件開(kāi)發(fā)

一、背景

一個(gè)app隨著業(yè)務(wù)增加,代碼放在同一個(gè)模塊中會(huì)越來(lái)越臃腫,同時(shí)也導(dǎo)致多人開(kāi)發(fā)的一個(gè)難度。組件化可以把業(yè)務(wù)單獨(dú)分出來(lái),形成一個(gè)單獨(dú)模塊,可單獨(dú)運(yùn)行、測(cè)試等,相互之間不會(huì)影響。另外一個(gè)優(yōu)勢(shì),如果一個(gè)公司有多個(gè)app,總會(huì)出現(xiàn)一些相同業(yè)務(wù),如登錄/注冊(cè)。我們可以單獨(dú)把公共業(yè)務(wù)封裝成一個(gè)單獨(dú)模塊,供所以app使用,提高了開(kāi)發(fā)成本

二、項(xiàng)目結(jié)構(gòu)

如下圖1,項(xiàng)目分成了4層,第一層app殼,這個(gè)也就是我們主工程, 里面包含application,啟動(dòng)頁(yè),以及一些初始化操作。第二層為module層,也就是我們的具體業(yè)務(wù)模塊,具體需要看業(yè)務(wù)。第三層公共資源庫(kù),所有module都依賴(lài)此lib庫(kù)。第四層為工具層,我們可以封裝一些常用的網(wǎng)絡(luò)請(qǐng)求,圖片框架等

圖1

三、組件開(kāi)發(fā)代碼配置

  1. 先給大家看下工程主要目錄結(jié)構(gòu)
    圖2
  2. 在project目錄下創(chuàng)建一個(gè)全局的config.gradle配置文件。具體每個(gè)字段作用,看代碼注釋?zhuān)@里就不作講解了

ext{
    //組件獨(dú)立調(diào)試開(kāi)關(guān), 每次更改值后要同步工程
    isDebug = false
    //統(tǒng)一管理Android配置
    android = [
            // 編譯 SDK 版本
            compileSdkVersion: 32,
            // 最低兼容 Android 版本
            minSdkVersion: 22,
            // 最高兼容 Android 版本
            targetSdkVersion: 31,
            // 當(dāng)前版本編號(hào)
            versionCode: 1,
            // 當(dāng)前版本信息
            versionName: "1.0.0"
    ]
    //組件唯一包名
    applicationid = [
            "app":"com.example.demo",
            "lgoin":"com.test.login",
    ]
    //請(qǐng)求測(cè)試服/正式服
    url = [
            "debug": "http://v.juhe.cn",
            "release":"http://v.juhe.cn"
    ]
    //統(tǒng)一管理module的第三方依賴(lài)
    dependencies = [
            corektx: 'androidx.core:core-ktx:1.7.0',
            appcompat: 'androidx.appcompat:appcompat:1.3.0',
            material: 'com.google.android.material:material:1.4.0',
            constraintlayout: 'androidx.constraintlayout:constraintlayout:2.0.4',
            junit: 'junit:junit:4.13.2',
            junittest: 'androidx.test.ext:junit:1.1.3',
            espressocore: 'androidx.test.espresso:espresso-core:3.4.0',
    ]
    //路由
    libARouter= 'com.alibaba:arouter-api:1.5.2'
    libARouterCompiler = 'com.alibaba:arouter-compiler:1.5.2'
    //Gson解析
    libGson = 'com.google.code.gson:gson:2.8.9'
}
  1. 引入config.gradle配置文件,在project全局中build.grale文件添加 apply from:"config.gradle"
plugins {
    id 'com.android.application' version '7.2.1' apply false
    id 'com.android.library' version '7.2.1' apply false
    id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
}

//引入config全局配置文件
apply from:"config.gradle"

task clean(type: Delete) {
    delete rootProject.buildDir
}
  1. 配置module,通過(guò)全局配置文件中的 isDebug 控制,來(lái)實(shí)現(xiàn)module和library之間的轉(zhuǎn)換,我們對(duì)module中的build.grale文件作一下修改(這里修改的是module_login下面的)
apply from: '../config.gradle'
if (isDebug){
    apply plugin: 'com.android.application'
}else {
    apply plugin: 'com.android.library'
}
apply plugin:'org.jetbrains.kotlin.android'
apply plugin: 'kotlin-kapt'
android {
    compileSdk rootProject.ext.android.compileSdkVersion

    defaultConfig {
        if (isDebug){
            applicationId rootProject.ext.applicationid.lgoin
        }
        minSdk rootProject.ext.android.minSdkVersion
        targetSdk  rootProject.ext.android.targetSdkVersion
        versionCode  rootProject.ext.android.versionCode
        versionName rootProject.ext. android.versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"


        //kotlin 路由配置
        kapt {
            arguments {
                arg("AROUTER_MODULE_NAME", project.getName())
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    sourceSets{
        main{
            if (isDebug){
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
            }else {
                manifest.srcFile 'src/main/AndroidManifest.xml'
            }
        }
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {
    implementation rootProject.ext.dependencies.corektx
    implementation rootProject.ext.dependencies.appcompat
    implementation rootProject.ext.dependencies.material
    implementation rootProject.ext.dependencies.constraintlayout
    testImplementation rootProject.ext.dependencies.junit
    androidTestImplementation rootProject.ext.dependencies.junittest
    androidTestImplementation rootProject.ext.dependencies.espressocore
    implementation project(path: ':lib_common')

    //kotlin路由配置
    implementation rootProject.ext.libARouter
    kapt rootProject.ext.libARouterCompiler
}
  1. 添加AndroidManifest.xml文件,這里解釋下為什么要添加AndroidManifest.xml。當(dāng)module作為library庫(kù)時(shí),AndroidManifest.xml里面的內(nèi)容是有區(qū)別的
  • 作為library,目錄位置src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.module.login">

    <application>
        <activity
            android:name="com.module.login.TestActivity" />
    </application>

</manifest>
  • 作為module單獨(dú)運(yùn)行,目錄位置src/main/debug/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.module.login">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:name="com.module.login.App"
        android:theme="@style/Theme.Demo">
        <activity
            android:name="com.module.login.TestActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>
  1. 完成上面幾步,module_login模塊就配置完了,其他module依照配置就可以了。另外需要注意,組件開(kāi)發(fā),一般會(huì)引入路由框架ARoute,實(shí)現(xiàn)模塊之間的的跳轉(zhuǎn)。具體怎么實(shí)現(xiàn),請(qǐng)看ARoute使用

四、具體效果展示

  1. 當(dāng)config.gradle配置文件中的 isDebug=true 時(shí)
    圖2
  1. 當(dāng)config.gradle配置文件中的 isDebug=false 時(shí)
    圖3

五、總結(jié)

總的來(lái)說(shuō)還算順利,期間就出現(xiàn)了些小問(wèn)題,但還是值得注意

  1. 包重名問(wèn)題,創(chuàng)建項(xiàng)目時(shí)沒(méi)注意,導(dǎo)致包重名了。Android修改包名
  2. 路由ARoute配置,跳轉(zhuǎn)提示找不到路徑,主要時(shí)因?yàn)槲耶?dāng)時(shí)想試試java和kotlin不同配置,詳細(xì)請(qǐng)看Android路由ARoute使用
  3. 組件開(kāi)發(fā)特別需要注意資源重名,為了避免這個(gè)問(wèn)題,可以在module中的build.gradle中添加resourcePrefix "xxx_" 前綴提示,這樣每次添加資源,系統(tǒng)會(huì)提示加前綴
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容