架構(gòu)師(三)——組件化部署

接上文

ext {

    // 定義一個項(xiàng)目全局變量isRelease,用于動態(tài)切換:組件化模式 / 集成化模式
    // false: 組件化模式(子模塊可以獨(dú)立運(yùn)行),true :集成化模式(打包整個項(xiàng)目apk,子模塊不可獨(dú)立運(yùn)行)
    isRelease = false
    ......
}

主模塊的build.gradle

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    // 循環(huán)引入第三方庫
    support.each { k, v -> implementation v }

    implementation project(':common') // 公共基礎(chǔ)庫

    // 如果是集成化模式,做發(fā)布版本時。各個模塊都不能獨(dú)立運(yùn)行了
    if (isRelease) {
        implementation project(':order')
        implementation project(':personal')
    }
}

組件的build.gradle

if (isRelease) { // 如果是發(fā)布版本時,各個模塊都不能獨(dú)立運(yùn)行
    apply plugin: 'com.android.library'
} else {
    apply plugin: 'com.android.application'
}

def rootAndroidId = rootProject.ext.androidId
def appId = rootProject.ext.appId
def support = rootProject.ext.dependencies

android {
    compileSdkVersion rootAndroidId.compileSdkVersion
    buildToolsVersion rootAndroidId.buildToolsVersion
    defaultConfig {
        if (!isRelease) { // 如果是集成化模式,不能有applicationId
            applicationId appId.order // 組件化模式能獨(dú)立運(yùn)行才能有applicationId
        }
        minSdkVersion rootAndroidId.minSdkVersion
        targetSdkVersion rootAndroidId.targetSdkVersion
        versionCode rootAndroidId.versionCode
        versionName rootAndroidId.versionName
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        // 這個方法接收三個非空的參數(shù),第一個:確定值的類型,第二個:指定key的名字,第三個:傳值(必須是String)
        // 為什么需要定義這個?因?yàn)閟rc代碼中有可能需要用到跨模塊交互,如果是組件化模塊顯然不行
        // 切記:不能在android根節(jié)點(diǎn),只能在defaultConfig或buildTypes節(jié)點(diǎn)下
        buildConfigField("boolean", "isRelease", String.valueOf(isRelease))
    }
    ......
}

組件化和集成化的區(qū)別在于 apply plugin和applicationId
組件創(chuàng)建的時候,最好創(chuàng)建為module,如果創(chuàng)建成 library,會缺少manifest配置和activity,組件化的時候還要拷貝過去,比較麻煩

測試環(huán)境隔離

// 配置資源路徑,方便測試環(huán)境,打包不集成到正式環(huán)境
sourceSets {
    main {
        if (!isRelease) {
            // 如果是組件化模式,需要單獨(dú)運(yùn)行時
            manifest.srcFile 'src/main/debug/AndroidManifest.xml'
        } else {
            // 集成化模式,整個項(xiàng)目打包apk
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java {
                // release 時 debug 目錄下文件不需要合并到主工程
                exclude '**/debug/**'
            }
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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