Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android组件化专题 - 组件化配置

Android组件化专题 - 组件化配置

原创
作者头像
没关系再继续努力
修改于 2021-11-12 07:47:30
修改于 2021-11-12 07:47:30
9420
举报
文章被收录于专栏:Android面试Android面试

Android组件化专题,详细讲解组件化的使用及配置,以及实现的原理。

本文章讲解了组件化的由来及配置,下期讲解页面路由跳转及路由原理与apt

1. 组件化的由来


模块化、组件化和插件化的关系?

(摘自百度百科)模块化是指解决一个复杂的问题时自顶向下逐层把系统划分为若干个模块的过程,各个模块可独立工作。

在技术开发领域,模块化是指拆分代码,当代码特别臃肿的时候,用模块化将代码分而治之、解耦分层。

在Android的领域模块化具体的实施方法为:组件化和插件化。

组件化和插件化的区别

一套完整的插件化或组件化都必须能够实现单独调试、集成编译、数据传输、UI 跳转、生命周期和代码边界这六大功能。插件化和组件化最重要而且是唯一的区别的就是:插件化可以动态增加和修改线上的模块,组件化的动态能力相对较弱,只能对线上已有模块进行动态的加载和卸载,不能新增和修改。

2. 怎样实现组件化


要实现组件化需要考虑的问题主要包括下面几个:

  • 代码解耦。将一个庞大的工程拆分解耦,这是非常耗时耗力的工作,但这也是最基础最重要的一步
  • 数据传递。每个组件都有可能提供给其他组件使用,主项目与组件、组件与组件之间的数据传递
  • UI跳转。
  • 组件的生命周期。组件加载、卸载和降维的生命周期
  • 集成调试。在开发阶段如何做到按需的编译组件?一次调试中可能只有一两个组件参与集成,这样编译的时间就会大大降低,提高开发效率。
  • 代码隔离。如何杜绝耦合的产生。

实现组件化的第一步 整理代码拆分结构


实现组件化的第一步首先是,整理项目工程结构,明确哪些功能是可以作为组件。

建议画图整理项目结构,如下图:

image.png
image.png

实现组件化的第二步 在拆分代码之前进行基础配置


统一整理builde配置以及组件/集成模式的切换,实现组件的单独调试

  1. 在项目根部新建 config.build
代码语言:txt
AI代码解释
复制
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中加入配置
代码语言:txt
AI代码解释
复制
apply from: "config.gradle"
  1. moudle 配置,调用config.gradle 中的配置
代码语言:txt
AI代码解释
复制
//配置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 配置,调用组件
代码语言:txt
AI代码解释
复制
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')
    }
}

本文转自 https://juejin.cn/post/6844903743918440462,如有侵权,请联系删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android组件化专题 - 组件化配置
(摘自百度百科)模块化是指解决一个复杂的问题时自顶向下逐层把系统划分为若干个模块的过程,各个模块可独立工作。
用户3045442
2018/09/11
1K0
Android组件化专题 - 组件化配置
【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )
上一篇博客 【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 ) 中 , 在顶层的 build.gradle 中定义了相关参数变量 ;
韩曙亮
2023/03/29
8290
【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )
【Android进阶】Android使用 flutter
1.在其他目录中依赖flutter SDK [1240] plugins { id 'com.android.library' id 'kotlin-android' } // 在其他目录中依赖flutter SDK def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) {
易寒
2022/01/24
8630
Android工程师,不理解模块化、组件化、插件化的区别怎么行?
上次,我们讲了MVC、MVP、MVVM,其实从狭义上来讲,Android的架构概念就在这儿,无论怎么变,都是加加减减一些边边角角的东西,不足在意。
没关系再继续努力
2021/12/29
1.6K0
Android组件化入门:一步步搭建组件化架构
最近因为业务需求变更,有考虑采用组件化架构进行开发,这方面我之前没有接触过。关于组件化的文章很多,各方大神更是提出了各种的组件化方案,我也看了很多相关文章。但是学习新东西看的再多,不如动手做一次,先不考虑复杂的东西,先动手做个简单的Demo更有助于理解组件化的思想。废话不多说,直接动手开码。
Android技术干货分享
2019/05/14
8620
Android组件化入门:一步步搭建组件化架构
Android组件化框架项目详解
简介 什么是组件化? 项目发展到一定阶段时,随着需求的增加以及频繁地变更,项目会越来越大,代码变得越来越臃肿,耦合会越来越多,开发效率也会降低,这个时候我们就需要对旧项目进行重构即模块的拆分,官方的说法就是组件化。 组件化带来的好处 那么,采用组件化能带来什么好处呢?主要有以下两点: 1、现在Android项目中代码量达到一定程度,编译将是一件非常痛苦的事情,一般都需要编译5到6分钟。Android Studio 推出 instant run 由于各种缺陷和限制条件(比如采用热修复tinker)一般情况
xiangzhihong
2018/02/08
3.4K0
Android组件化框架项目详解
Android|模块化探索抽取 basic 简化子 module 冗余
Android 的历史中,各种各样的技术一波接着一波,模块化,插件化,组件化等等。可怜的我,还依然观望,停滞不前。
贺biubiu
2020/05/22
9030
Android组件化架构
在项目开发中,将公用的代码提取到common_module中,将某些单独功能封装到lib_module中,再根据业务划分module,团队成员分别开发各自的模块。 但随着项目的迭代,功能越来越多,增加了一些业务模块后,相互调用的情况会增多,就会发生各个业务模块之间的耦合非常严重,导致代码难以维护且扩展性很差。组件化就应用而生了。 组件化基础:多module划分业务和基础功能。 组件:单一的功能组件,如适配,支付,路由组件等,可单独抽出来形成SDK。 模块:独立的业务模块,如直播,首页模块等。模块可能包含多个不同组件。
八归少年
2022/06/29
1.2K0
Android组件化架构
【Android 组件化】使用 ARoute 实现组件化 ( 完整组件化项目框架 )
使用 ARouter 第三方库实现组件化 : https://github.com/alibaba/ARouter
韩曙亮
2023/03/29
2.5K0
【Android 组件化】使用 ARoute 实现组件化 ( 完整组件化项目框架 )
Android 重构 | 统一管理 Gradle 依赖版本
好代码,总是要经历多个阶段,从匆忙赶工上线,到慢慢细致打磨,折腾的过程,美好的结果。
贺biubiu
2020/05/22
1.2K0
【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 )
在 Project 层级的 build.gradle 中 , 使用 apply from: “component.gradle” , 引入 component.gradle 配置 ;
韩曙亮
2023/03/29
1.3K0
【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 )
Android studio新建工程报错:Error:Execution failed for task ':app:preDebugAndroidTestBuild'. > Conflict wit
1.点击Build - Rebuild project,错误消除,但是重启AS,再次打开项目的时候还会出现该错误,虽然不影响,但是看着难受。
JaneYork
2023/10/11
3430
Android studio新建工程报错:Error:Execution failed for task ':app:preDebugAndroidTestBuild'. > Conflict wit
Kotlin学习之路(1)环境介绍及安装
最近发现很多公司对于Android开发者都要求又提升了一些,比如熟悉Kotlin的开发,会使用React Native,会使用Flutter开发语言,要么就会对前端有一定的基础小程序 Vue等等。。。 在众多知识中我选择学习Kotlin,其原因Kotlin作为谷歌霸霸主推的语言,而且它是一种兼容Java的语言,还有就是看到很多Android开发者都在使用Kotlin写项目。在大环境的驱使下,我选择学习这门新语言。
全栈程序员站长
2021/04/07
1.1K0
Gradle之Project Api 使用
在根工程下自定义config.gradle可以直接在根project引用apply from:'config.gradle' 如果需要在app project中引用,需要加rootProject,表明当前gradle路径在根工程下,apply from: this.rootProject.file('releaseinfo.gradle')
Yif
2019/12/26
1.2K0
Android 组件化(一)项目模式管理、模式切换
  在进行安装开发的时候我们经常会对项目进行不同业务逻辑处理分包,例如专门处理网络、数据库、业务逻辑代码的,如果我们不分包则所有东西写在一起,势必在开发过程中会浪费很多时间在寻找文件上,而分包的思想源于模块化,例如一些utils类,专门放到一个包下面,这样在使用的时候就能很快找到。节省开发时间,降低后期维护成本,那么组件化是什么?
晨曦_LLW
2022/11/21
9180
Android 组件化(一)项目模式管理、模式切换
android之gradle配置仓库与引入依赖
勿以恶小而为之,勿以善小而不为。——《三国志》刘备语 安卓配置gradle镜像地址 在不同的视图中找到这个build.gradle // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { maven { url 'https://maven.aliyun.com/repos
阿超
2022/08/16
2.2K0
android之gradle配置仓库与引入依赖
【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )
在 1 个 Android 应用中只能存在 1 个 Application 类 , 但是组件化开发时 , 如果 Library 模块动态修改成 Application 模块 , 还想自己定义一个 Application 类 , 这里参考上一篇博客 【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 ) 三、使用 sourceSets 配置组件模式下使用的清单文件 章节 , 使用 sourceSets 资源配置 , 配置 Java 代码 ;
韩曙亮
2023/03/29
7660
【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )
推荐阅读
相关推荐
Android组件化专题 - 组件化配置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档