Android 组件化案例

为什么组件化
随着移动互联网的发展,或许中小型项目还可以用单工程+MVC/MVP/MVVM的架构来完成,但当项目到了一定程度之后,编译时间 原来越长,测试或者开发任何一个模块功能都需要整个项目重启运行。

常规单工程+MVC/MVP/MVVM项目:

乍一看,这样的结构只要咱们模块分层明确,是不存在大问题的,但是随着业务的快速迭代,面临以下问题:

1.需求疯狂变化,上周刚讨论出一套方案,你花了两天搞定,这个时候PM告诉你,这个咱们修改或者不要了,是否想抓狂呢。

2.所有业务都在一个项目,不管基于什么原因,有时候咱们为了快速完成一个功能,或多或少存在耦合,任何改动都可能显的比较吃力,解决了一个BUG又出现另外一个BUG。

3.团队人数达到一定程度后,并行开发过程中,如果某个成员不小心犯错并且提交了代码,可能导致项目暂时无法运行,不得不停下来协同查找问题,严重影响开发效率

4.业务越来越多,项目越来越大,编译运行一次要10秒…20秒…1分钟…5分钟…累计几个月下来的时间说不得抽出来都可以去找个女朋友了…

基于以上问题,咱们的组件化应运而生。

组件化结构图

对比上张图,这里的APP主要由业务组件构成,严格来说这5个业务组件也可以是5个App,当实现以上架构图,看看组件化的优缺点:

组件化优点

  • 业务组件可以单独分配并行开发

  • 单个组件业务可以由开发者自行决定采取MVC/MVP/MVVM架构而不影响整体大局

  • 新人接手项目分配任务可单独分配某一个模块任务,不必关心整个项目

  • 开发效率提升,开发过程仅仅需要维护开发自己的组件内容

  • 若公司有多个团队,优秀代码组件可快速移植复用

  • 积累个人的组件仓库,摆脱粘贴复制的“搬砖工”身份

  • 测试可单独测试某个模块

组件化的坑

  • 组件与组件之间的调用,数据等交互

  • 多个组件,在使用application的时候怎办

  • 多个组件资源命名重复

  • 多个组件引用不同版本的相同的库

了解了优缺点,咱们进入正式的组件化开发集成,后续将会描述如何解决组件化的一些坑。

前文说过,咱们的5个组件可以理解为5个app,下面开始集成。


先看看咱们的组件化效果,手机展示效果,


1:首先统一组件之间的版本以及第三方库版本
利用Gradle统一版本号,可参考 android使用Gradle统一配置依赖版本

2:咱们的组件又是Lib,又是application,如何控制调试,如何在主APP选择

在config.build处新增一个布尔isBuildApp作为标志判断依赖,true表示作为application存在,false表示lib存在

ext {
    isBuildApp=false;//false:作为Lib组件存在, true:作为application存在
    ...
}

在每个组件的build根据isBuildApp来选择依赖

if(rootProject.ext.isBuildApp){
    apply plugin: "com.android.application"
}else{
    apply plugin: 'com.android.library'

}
android{
...
 defaultConfig {
        if(rootProject.ext.isBuildApp){
            applicationId "com.allure.shop"
        }
        ...
    }
}

ibrary与application运行时需要manifest,依然根据isBuildApp判断

   sourceSets {
        main {
            if (rootProject.ext.isBuildApp) {
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/release/AndroidManifest.xml'
                java {
                    exclude 'debug/**'
                }
            }
        }
    }

资源的命名为了避免重复,建议按照组件名开头,如Login组件,命名login_xxx,BaiDuMap组件命bd_map_xxx
可用gradle进行强制检测

resourcePrefix "login_"

主项目的引用

 if (rootProject.ext.isBuildApp) {
        compile project(':modulebase')
    } else {
        compile project(':modulecore:moduleLogin')
        compile project(':modulecore:moduleShop')
    }

解决组件与组件的交互:
方案1:可采用建立中间件的方式来统一管理组件之间的交互,如电影组件与首页组件需要跳转传值等可采用开源的ActivityRouterEventBus来完成

方案2:在主项目APP建立统一的入口类,针对组件与组件的交互建立方法,实现接口等,但此方式有一定沟通成本,组件与组件之间的交互维护可能需要一份文档来约束。

application的使用:
方案1:统一使用基础库的单例BaseApplication
方案2:反射ActivityThread

Lib与Application的切换
修改config.build里的isBuildApp属性并且重新sync

项目结构图:
作为组件Lib

作为单独的application

总结

组件化技术难度不大,难点在于业务的解耦。具体是否选择组件化方式还是要根据项目大小来确定。 当然采取了组件化是极好的。

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

推荐阅读更多精彩内容