Android組件開發(fā)

一、背景

一個app隨著業(yè)務(wù)增加驾孔,代碼放在同一個模塊中會越來越臃腫芍秆,同時也導(dǎo)致多人開發(fā)的一個難度惯疙。組件化可以把業(yè)務(wù)單獨分出來,形成一個單獨模塊妖啥,可單獨運行霉颠、測試等,相互之間不會影響荆虱。另外一個優(yōu)勢掉分,如果一個公司有多個app,總會出現(xiàn)一些相同業(yè)務(wù)克伊,如登錄/注冊酥郭。我們可以單獨把公共業(yè)務(wù)封裝成一個單獨模塊,供所以app使用愿吹,提高了開發(fā)成本

二不从、項目結(jié)構(gòu)

如下圖1,項目分成了4層犁跪,第一層app殼椿息,這個也就是我們主工程, 里面包含application,啟動頁坷衍,以及一些初始化操作寝优。第二層為module層,也就是我們的具體業(yè)務(wù)模塊枫耳,具體需要看業(yè)務(wù)乏矾。第三層公共資源庫,所有module都依賴此lib庫迁杨。第四層為工具層钻心,我們可以封裝一些常用的網(wǎng)絡(luò)請求,圖片框架等

圖1

三铅协、組件開發(fā)代碼配置

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

ext{
    //組件獨立調(diào)試開關(guān), 每次更改值后要同步工程
    isDebug = false
    //統(tǒng)一管理Android配置
    android = [
            // 編譯 SDK 版本
            compileSdkVersion: 32,
            // 最低兼容 Android 版本
            minSdkVersion: 22,
            // 最高兼容 Android 版本
            targetSdkVersion: 31,
            // 當前版本編號
            versionCode: 1,
            // 當前版本信息
            versionName: "1.0.0"
    ]
    //組件唯一包名
    applicationid = [
            "app":"com.example.demo",
            "lgoin":"com.test.login",
    ]
    //請求測試服/正式服
    url = [
            "debug": "http://v.juhe.cn",
            "release":"http://v.juhe.cn"
    ]
    //統(tǒng)一管理module的第三方依賴
    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痒给,通過全局配置文件中的 isDebug 控制,來實現(xiàn)module和library之間的轉(zhuǎn)換骏全,我們對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。當module作為library庫時吟温,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單獨運行突颊,目錄位置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依照配置就可以了。另外需要注意爬橡,組件開發(fā)治唤,一般會引入路由框架ARoute,實現(xiàn)模塊之間的的跳轉(zhuǎn)糙申。具體怎么實現(xiàn)宾添,請看ARoute使用

四、具體效果展示

  1. 當config.gradle配置文件中的 isDebug=true 時
    圖2
  1. 當config.gradle配置文件中的 isDebug=false 時
    圖3

五柜裸、總結(jié)

總的來說還算順利缕陕,期間就出現(xiàn)了些小問題,但還是值得注意

  1. 包重名問題疙挺,創(chuàng)建項目時沒注意扛邑,導(dǎo)致包重名了。Android修改包名
  2. 路由ARoute配置铐然,跳轉(zhuǎn)提示找不到路徑蔬崩,主要時因為我當時想試試java和kotlin不同配置,詳細請看Android路由ARoute使用
  3. 組件開發(fā)特別需要注意資源重名搀暑,為了避免這個問題沥阳,可以在module中的build.gradle中添加resourcePrefix "xxx_" 前綴提示,這樣每次添加資源自点,系統(tǒng)會提示加前綴
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桐罕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子桂敛,更是在濱河造成了極大的恐慌冈绊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件埠啃,死亡現(xiàn)場離奇詭異死宣,居然都是意外死亡,警方通過查閱死者的電腦和手機碴开,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門毅该,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人潦牛,你說我怎么就攤上這事眶掌。” “怎么了巴碗?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵朴爬,是天一觀的道長。 經(jīng)常有香客問我橡淆,道長召噩,這世上最難降的妖魔是什么母赵? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮具滴,結(jié)果婚禮上凹嘲,老公的妹妹穿的比我還像新娘。我一直安慰自己构韵,他們只是感情好周蹭,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疲恢,像睡著了一般凶朗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上显拳,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天俱尼,我揣著相機與錄音,去河邊找鬼萎攒。 笑死遇八,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的耍休。 我是一名探鬼主播刃永,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼羊精!你這毒婦竟也來了斯够?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤喧锦,失蹤者是張志新(化名)和其女友劉穎读规,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體燃少,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡束亏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了阵具。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碍遍。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖阳液,靈堂內(nèi)的尸體忽然破棺而出怕敬,到底是詐尸還是另有隱情,我是刑警寧澤帘皿,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布东跪,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏虽填。R本人自食惡果不足惜丁恭,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卤唉。 院中可真熱鬧涩惑,春花似錦仁期、人聲如沸桑驱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熬的。三九已至,卻和暖如春赊级,著一層夾襖步出監(jiān)牢的瞬間押框,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工理逊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留橡伞,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓晋被,卻偏偏與公主長得像兑徘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子羡洛,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348