Android学习之组件化学习一

做好计划,定期复盘,感知责任,提高执行力

关于组件化的理解大同小异,本文就从个人角度来简单讨论一下组件化,并且将自己学到的信息做以记录。

一、什么是组件化,为什么学习组件化

1、单一分包模式:
描述:此模式是早期开发应用一般采用的模式,所有的代码都写在app模块的不同包里面;
特点:低内聚问题、高耦合、无重用、层次混乱;
2、组件化模式:
描述:如下图所示:

组件化示意图.png

正如上图所示,对于用户来讲,入口为app壳,而下层实现将由product、order、personal三个模块组成,而此三个模块则组成了所谓的组件化,他们可以单独运行,也可以依附于app壳,纵向依赖于公共基础库,横向则不能直接通信,如果横向要通信,则可以通过接口下沉到公共基础库层(类似于后面我们要讲的ARoute)来实现;
特点:不相互依赖、可以相互交互、任意组合、高度解耦、自由拆卸、自由组装、重复利用、分层独立化;

二、集成化/组件化环境部署

在项目开发中,经常会遇到类似于这些场景:在项目上线之前必须测试业务功能,那就必须有测试环境与正式环境之分;随着业务的扩展,全覆盖测试成为痛点,那就必须有模块化单独测试的要求;对于以上要求,我们可以考虑采用Gradle来控制或者实现以上需求;
1、Gradle的简单了解:
众所周知Gradle它的实现语言是Groovy,Groovy是JAVA的一个分支,在一个Android APP工程项目中,gradle文件也是分层级的,比如settings.grade->build.gradle->app.gradle等;具体关于Gradle及Groovy语法等相关知识,我们将在后续文章中体现;
2、公共配置gradle的抽离:
一个APP中会涵盖多个module,比如上图说的product、order、personal每个模块都有自己的gradle文件,这些文件中都含有一些公共部分的设置比如:

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.0"
    defaultConfig {
        applicationId "com.zero.materialdesign"
        minSdkVersion 27
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

这部分,可以通过自定义test.gradle来设置:

ext {
    androidID = [
            compileSdkVersion        : 30,
            buildToolsVersion        : "30.0.1",
            applicationId            : "com.derry.derry",
            minSdkVersion            : 16,
            targetSdkVersion         : 30,
            versionCode              : 1,
            versionName              : "1.0",
            testInstrumentationRunner: "androidx.test.runner.AndroidJUnitRunner"
    ]
 }

然后在build.gradle中引入自定义的test.gradle:

apply from : 'test.gradle'

在app.gralde中的应用:

//先定义(此方式为正确打开方式,有性能方面的优化)
def androidID = rootProject.ext.androidID
//自定义后的应用
android {
    compileSdkVersion androidID.compileSdkVersion
    buildToolsVersion androidID.buildToolsVersion
    defaultConfig {
        applicationId appID.app
        minSdkVersion androidID.minSdkVersion
        targetSdkVersion androidID.targetSdkVersion
        versionCode androidID.versionCode
        versionName androidID.versionName
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

3、测试环境与正式环境的配置:
在test.gradle中的ext扩展块中可添加:

// 扩展快
ext {
    // 正式环境 和 测试环境
    isRelease = false
    // 正式环境 和 测试环境 服务器 URL 配置
    url = [
            "debug"  : "http://192.168.12.229/debug",
            "release": "http://192.168.12.229/release"
    ]

在app.gradle中的应用:

   defaultConfig {
        applicationId appID.app
        minSdkVersion androidID.minSdkVersion
        targetSdkVersion androidID.targetSdkVersion
        versionCode androidID.versionCode
        versionName androidID.versionName
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
        // 让我的Java代码也可以用
        // 给Java代码暴漏,标记,正式环境 和 测试环境 的标记
        // 组件化 和 集成化 的时候需要
        buildConfigField("boolean", "isRelease", String.valueOf(isRelease))
    }

    buildTypes {
        debug {
            buildConfigField("String", "debug", "\"${url.debug}\"")
        }
        release {
            buildConfigField("String", "release", "\"${url.release}\"")

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

注意在调用buildConfigField会自动生成BuildConifg.java文件,并且将此时对应值写入到BuildConfig.java中:

public final class BuildConfig {
  省略...
  // Fields from build type: debug
  public static final String debug = "https://192.188.22.99/debug";
  // Fields from default config.
  public static final boolean isRelease = true;
}

此时即可以在Java代码中直接调用:

String url = BuildConfig.debug;

4、模块单独运行与集成化运行:
在测试中,如果要测试某个模块,那必须要求此module能够单独运行,那可以在对应module的gradle文件中通过以下方式设置:

if (isRelease) { // 如果是发布版本时,各个模块都不能独立运行
    apply plugin: 'com.android.library' // 正式环境  library不能独立运行
} else {
    apply plugin: 'com.android.application' // 测试环境 application独立运行
}

如图所示可查看可运行状态:
模块可单独运行状态.png

另外,也可以通过类似于一下的设置来指定AndroidManifest的加载及集成环境中文件的集成等:

    sourceSets {
        main {
            if (!isRelease) {
                // 如果是组件化模式,需要单独运行时 Debug
                manifest.srcFile 'src/main/debug/AndroidManifest.xml' // 生效
            } else { // 正式环境下
                // 集成化模式,整个项目打包apk
                manifest.srcFile 'src/main/AndroidManifest.xml' // 让我们之前 默认的路径下的清单文件再次生效

                java {
                    // release 时 debug 目录下文件不需要合并到主工程
                    exclude "**/debug/**"
                }
            }
        }
    }

总结一下:简单介绍了一下组件化的意义,同时简单了解了一下通过Gradle来对组件化的一些简单配置,进一步的组件化学习,持续更新中。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容