Android:简单组件化架构步骤

本文详细介绍了Android组件化开发的步骤,包括创建业务组件层、基础组件层和功能组件层,进行版本管理,依赖LibBase,修改各组件配置,实现业务组件层的debug模式切换,以及如何切换Module单独运行。通过这些操作,可以有效地管理和组织项目结构,解决依赖冲突,提高开发效率。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

复习Android组件化开发架构步骤

一、创建

业务组件层

业务组件层创建的Module采用Phone&Table,也就是创建Module的第一个选项,因为我们将要在此对每个Module进行调试
在这里插入图片描述
为了让分层结构更加清晰,通常在命名Module name时,将其的分层名置于Module真正的name之前
在这里插入图片描述

基础组件层

基础组件层创建的Module通常采用Library进行创建,同样使其放在指定分层文件夹下
在这里插入图片描述

功能组件层

功能组件层通过对基础组件层依赖,不需要从Module和Application进行切换,所以采用Library进行构建

二、进行版本管理

目的

不同的Module依赖库的版本可能不一致,如果不进行统一的版本管理,则可能会因为依赖库的版本不一导致依赖冲突

实施方案如下:

1.在Project的build.gradle下加入以下代码

在这里插入图片描述
包含如下信息

  • isDebug 判断组件能否单独运行
  • android 编译调试版本信息
  • applicationId 包含能够单独进行Module运行的包名
  • library SDK中依赖库的相关信息
  • 其他第三方依赖库信息
2.进行其他Module的信息修改

例如,我们在对业务组件层的main的build.gradle信息进行修改,修改过后如下

def cfg = rootProject.ext

//plugins {
//    id 'com.android.application'
//}

if (cfg.isDebug) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}

android {
    compileSdkVersion cfg.android.compileSdkVersion
    buildToolsVersion cfg.android.buildToolsVersion

    defaultConfig {
        if (cfg.isDebug) {
            applicationId cfg.applicationId.login
        }
        minSdkVersion cfg.android.minSdkVersion
        targetSdkVersion cfg.android.targetSdkVersion
        versionCode cfg.android.versionCode
        versionName cfg.android.versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [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 (cfg.isDebug) {
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/AndroidManifest.xml'
            }
        }
    }
}

dependencies {

    implementation project(':modulesBase:libBase')

    annotationProcessor cfg.libARouterCompiler

    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

定义cfg变量引用Project目录下的build.gradle文件,而后在剩下的代码中进行引用修改

需要注意的是,如果是Debug模式下,每个Module才可以拥有各自的application id,否则则会进行报错

三、依赖LibBase

在需要LibBase的组件的build.gradle中的dependencies中添加如下代码

    implementation project(':modulesBase:libBase')

修改LibBase的build.gradle文件,对dependencies中的依赖使用api进行代替,从而使其方便向上传递;从而防止重复依赖
具体代码如下:

def cfg = rootProject.ext

apply plugin: 'com.android.library'

android {
    compileSdkVersion cfg.android.compileSdkVersion
    buildToolsVersion cfg.android.buildToolsVersion

    defaultConfig {
        minSdkVersion cfg.android.minSdkVersion
        targetSdkVersion cfg.android.targetSdkVersion
        versionCode cfg.android.versionCode
        versionName cfg.android.versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}


dependencies {

    api cfg.library.appcompat
    api cfg.library.material
    api cfg.library.constraintlayout

    api cfg.libARouter

    api project(':modulesBase:libRouter')

    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

四、修改功能组件层

修改功能组件层的build.gradle,但是不进行传递依赖,因为其他Module可能既依赖基础组件层,也依赖功能组件层

def cfg = rootProject.ext

//plugins {
//    id 'com.android.application'
//}

if (cfg.isDebug) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}

android {
    compileSdkVersion cfg.android.compileSdkVersion
    buildToolsVersion cfg.android.buildToolsVersion

    defaultConfig {
        if (cfg.isDebug) {
            applicationId cfg.applicationId.login
        }
        minSdkVersion cfg.android.minSdkVersion
        targetSdkVersion cfg.android.targetSdkVersion
        versionCode cfg.android.versionCode
        versionName cfg.android.versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [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 (cfg.isDebug) {
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/AndroidManifest.xml'
            }
        }
    }
}

dependencies {

    implementation project(':modulesBase:libBase')

    annotationProcessor cfg.libARouterCompiler

    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

五、修改主工程

plugins {
    id 'com.android.application'
}

def cfg = rootProject.ext

android {
    compileSdkVersion cfg.android.compileSdkVersion
    buildToolsVersion cfg.android.buildToolsVersion

    defaultConfig {
        applicationId cfg.applicationId.app
        minSdkVersion cfg.android.minSdkVersion
        targetSdkVersion cfg.android.targetSdkVersion
        versionCode cfg.android.versionCode
        versionName cfg.android.versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    implementation project(':modulesBase:libBase')

    if (!cfg.isDebug) {
        implementation project(':modulesCore:main')
        implementation project(':modulesCore:login')
    }

    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.google.android.material:material:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

六、业务组件层debug模式切换

业务组件层,在调试的时候,是需要能够有自己的Activity启动入口,而在真正运行的时候,整个APP的运行入口只能有一个,因此对应不同的AndroidManifest.xml文件
我们可以在业务组件层中创建不同的AndroidManifest文件,而后在Build.gradle中进行调试切换(利用SourceSet进行设置切换)

在这里插入图片描述
debug目录下的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.dongnaoedu.module.main">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Component_demo">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

作为library运行的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.dongnaoedu.module.main">

    <application>
        <activity android:name=".MainActivity" />
    </application>

</manifest>

七、切换Module能否单独运行

通过对Project下的isDebug属性进行修改

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值