Android組件化專題 - 組件化配置

demo地址java

Android組件化專題,詳細講解組件化的使用及配置,以及實現的原理。android

本文章講解了組件化的由來及配置,下期講解頁面路由跳轉及路由原理與aptgit

1. 組件化的由來

模塊化、組件化和插件化的關係?

(摘自百度百科)模塊化是指解決一個複雜的問題時自頂向下逐層把系統劃分爲若干個模塊的過程,各個模塊可獨立工做。github

在技術開發領域,模塊化是指拆分代碼,當代碼特別臃腫的時候,用模塊化將代碼分而治之、解耦分層。bash

在Android的領域模塊化具體的實施方法爲:組件化和插件化。app

更加詳細的講解框架

組件化和插件化的區別

一套完整的插件化或組件化都必須可以實現單獨調試、集成編譯、數據傳輸、UI 跳轉、生命週期和代碼邊界這六大功能。插件化和組件化最重要並且是惟一的區別的就是:插件化能夠動態增長和修改線上的模塊,組件化的動態能力相對較弱,只能對線上已有模塊進行動態的加載和卸載,不能新增和修改。模塊化

2. 怎樣實現組件化

要實現組件化須要考慮的問題主要包括下面幾個:組件化

  • 代碼解耦。將一個龐大的工程拆分解耦,這是很是耗時耗力的工做,但這也是最基礎最重要的一步
  • 數據傳遞。每一個組件都有可能提供給其餘組件使用,主項目與組件、組件與組件之間的數據傳遞
  • UI跳轉。
  • 組件的生命週期。組件加載、卸載和降維的生命週期
  • 集成調試。在開發階段如何作到按需的編譯組件?一次調試中可能只有一兩個組件參與集成,這樣編譯的時間就會大大下降,提升開發效率。
  • 代碼隔離。如何杜絕耦合的產生。

實現組件化的第一步 整理代碼拆分結構

實現組件化的第一步首先是,整理項目工程結構,明確哪些功能是能夠做爲組件。gradle

建議畫圖整理項目結構,以下圖:

image.png

實現組件化的第二步 在拆分代碼以前進行基礎配置

統一整理builde配置以及組件/集成模式的切換,實現組件的單獨調試

  1. 在項目根部新建 config.build
ext {
    // false 集成模式

    // true 組件模式

    isComponent = false

    androidConfig = [
            compileSdkVersion: 27,
            minSdkVersion    : 19,
            targetSdkVersion : 27,
            versionCode      : 1,
            versionName      : "1.0"
    ]

    appIdConfig = [
            app   : "com.prim.component.demo",
            moudle1: "demo.prim.com.moudle1"
    ]

    supportLibrary = "27.1.1"

    dependencies = [
            appcompatv7: "com.android.support:appcompat-v7:${supportLibrary}"
    ]
}
複製代碼
  1. 主build中加入配置
apply from: "config.gradle"

複製代碼
  1. moudle 配置,調用config.gradle 中的配置
//配置apply
if (isComponent) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}

//獲取config文件中的配置 rootProject 項目的主對象
def config = rootProject.ext.androidConfig

def appIdConfig = rootProject.ext.appIdConfig

def dependenciesConfig = rootProject.ext.dependencies

android {
    compileSdkVersion config.compileSdkVersion

    defaultConfig {
        minSdkVersion config.minSdkVersion
        targetSdkVersion config.targetSdkVersion
        versionCode config.versionCode
        versionName config.versionName

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"


        //若是moudle爲組件  配置組件的app ID
        if (isComponent) {
            applicationId appIdConfig.app
        }

        //配置BuildConfig 代碼中能夠調用判斷moudle是否爲組件
        buildConfigField("boolean","isComponent",String.valueOf(isComponent))

        //配置資源文件
        sourceSets {
            main {
                if (isComponent) {//若是moudle爲組件則配置 AndroidManifest 
                    manifest.srcFile 'src/main/moudle/AndroidManifest.xml'
                    // 配置組件模式下的java代碼主文件
                    java.srcDirs 'src/main/java','src/main/moudle/java'
                } else {
                    manifest.srcFile 'src/main/AndroidManifest.xml'
                }
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation dependenciesConfig.appcompatv7
    implementation 'com.android.support.constraint:constraint-layout:+'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:+'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

複製代碼
  1. app 配置,調用組件
apply plugin: 'com.android.application'

def config = rootProject.ext.androidConfig

def appIdConfig = rootProject.ext.appIdConfig

def dependenciesConfig = rootProject.ext.dependencies

android {
    compileSdkVersion config.compileSdkVersion
    defaultConfig {
        applicationId appIdConfig.app
        minSdkVersion config.minSdkVersion
        targetSdkVersion config.targetSdkVersion
        versionCode config.versionCode
        versionName config.versionName
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         //配置BuildConfig 代碼中能夠調用判斷moudle是否爲組件
        buildConfigField("boolean","isComponent",String.valueOf(isComponent))
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation dependenciesConfig.appcompatv7
    implementation 'com.android.support.constraint:constraint-layout:+'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    if (!isComponent){//當moudle1 不爲組件時才容許導入
        implementation project(':moudle1')
    }
}

複製代碼

下期講解頁面路由跳轉及路由原理與apt。

Android的組件化專題: 組件化配置

APT實戰

路由框架原理

模塊間的業務通訊

相關文章
相關標籤/搜索