Android组件化模块化在移动应用开发中 (序)

image

组件化模块化

[TOC]
在移动应用上由于应用本身与使用者相贴近,日常开发中难免的需求变更朝令夕改、朝三暮四,尤其遇到没啥规范流程的或者形式主义流程;

关于组件化模块化是什么及其优点不再赘述,在此补充点优点而已:减少名言的联想

Linus:Read the fucking source code

我们的终极目标不仅是解耦等。简化、轻量化框架,减少过分约束而给予组件/模块内充分的自由,从初始设计已有两年余,由于重复搬砖没得时间记录,
文章中尽量不贴fucking code,有良好的思路大家都会有很好合适自身需求的实现。

组件 模块

鉴于网上很多文章对于组件模块的定义众说纷纭,再次声明本文定义,参考资料来源维基百科

基于组件的软件工程(Component-based software engineering,简称CBSE)或基于组件的开发(Component-Based Development,简称CBD**)是一种软件开发范型。它是现今软件复用理论实用化的研究热点,在组件对象模型的支持下,通过复用已有的构件,软件开发者可以“即插即用”地快速构造应用软件。这样不仅可以节省时间和经费,提高工作效率,而且可以产生更加规范、更加可靠的应用软件

模块 是指由数个基础功能组件组成的特定功能组件,可用来组成具完整功能之系统、设备或程序。模块通常都会具有相同的制程逻辑,更改其组成组件可调适其功能或用途。

综上组件Component是一种工具功能性质,而模块Module具有系统功能性质。例如jetpack中的构架组件.

模型model与模块还是区分对待。

由简单到复杂

长 短之相形,难 易之相成

任何系统都是由简单到复杂逐渐演化构成。类似于生态系统。稳定而强大的系统均是由简单的逐渐进化为复杂的系统。简单系统需要具备可进化性,其高一级系统需要有可退化性。而进化的必要因素时间

从AndroidX JetPack开始,构件一个兼具进化与退化的弹性系统框架。适应目的,分离表现层显示层,重复常用功能视图层操作形式已经定型的提取VM/模型组件,如视频播放 已知用户需求暂停,快进,声音,亮度;接口提供给了UI层,但UI层又要重新写SeekBar,Button 等UI控件,进一步看Seek Bar等也有自身的一些约定成俗的习惯性响应,这种VM组件是否可以直接包含这些UI控件,由视图层使用时传入,VM层仅仅与控件互动与Seek Bar的进度和与Button点击,而不关心UI层传入的是什么样子的控件,也不关心控件的位置,这些全都是UI层的事情。其实可以传入对应的接口控件,但当前控件没有进化到这一代。

Model模型层做提供实质性需求的业务。如视频播放,用什么播放器,自带的第三方的由mondel接管。用户需求是从视图层发起请求,VM层处理视图发起后的请求给Model去处理,Model处理后结果由VM层得知,VM又由更新数据去更新UI。

完成于此后。除非播放器更新换代,添加了其他功能(预览帧,GIF截取)VM,与M均不需要更新code.重复的搬砖仅仅是将UI搬运。

我们的组件化目标

首先肯定是解耦,防止代码污染;其次单模块调试,方便调试加快编译速度,提高专注效率;然后是框架轻量尽量不入侵,不过分限制模块,给模块内自由;能快速构建其一个基础功能齐全的Hello World;

最终效果

外核保护内核,仅暴露少量Base类接口,这些类的具体实现都在内核包中实现,可混淆后发布aar到项目私有maven,由开发版的外核配置依赖具体版本的内核;外核包中的少量类仅有及少量代码;

image
image

网络请求

    //登录请求
    private void click() {
        getViewModel(LoginViewModel.class)
                .sendAction(new RequestAction()
                        .setTipsArgs(new VmTipsArgs.Builder().tipMessage("请求失败了").build())).
                doOnData((action, data) -> {
                    AppLog.d(TAG, "发起登录成功 doOnData1=", data);
                    showToast("登录成功1" + data);
                })
                .doOnData((action, data) -> {
                    AppLog.d(TAG, "发起登录成功 doOnData2=", data);
                    showToast("登录成功2" + data);
                })
                .doOnDone(action -> {
                    AppLog.d(TAG, "发起登录完成1");
                    showToast("登录结束");
                })
                .doOnListener(action -> {
                    AppLog.d(TAG, "开始登录 loading....");
                    showToast("loading....");
                })
                .doOnDone(action -> {
                    AppLog.d(TAG, "发起登录完成2");
                })
                .doOnError((action, e) -> {
                    AppLog.d(TAG, "登录失败");
                })
        ;
    }

日志

MainActivity  doOnListener开始登录 loading....  
MainActivity  doOnData发起登录成功 doOnData1=  "{uid:123}" 
MainActivity  doOnData发起登录成功 doOnData2=  "{uid:123}"  
MainActivity  doOnDone发起登录完成1  
MainActivity  doOnDone发起登录完成2  

组件化模块化需要解决的问题

  1. 组件隔离,模块独立,模块可单独调试;

    每人只能看到框架代码和调试外壳代码,其他人的代码眼不见心不烦;(组件隔离:A组件的部分功能可抛出由其他组件B完成;模块独立:模块有自己的小生态,我在此为其添加统一的调试外壳,而不是变身app,浪费转换时间,也不需要写两份清单文件)

  2. 模块初始化注册【代码插桩;反射初始化等;ASM】推荐模块初始化注册插件

  3. 组件/模块之间的通讯,相互调用,数据传递【modular-event ,LiveData-Bus ,本地广播等】

  4. 组件/模块怎么通知其他组件响应某个事件(组件的视听功能)

  5. 模块界面之间的跳转,因为为了解耦,组件间不可以直接互相调用【ARouter等】

  6. 主项目获取并显示组件的fragment

  7. 组件间如何集成并调试

  8. 获取其他组件的数据或服务(发派信使携带任务,完成返回)

  9. 资源命名重复,资源本身重复冗余

  10. 组件之间避免过度依赖年轻的组件,基础组件避免依赖不成熟的第三方

  11. 其他...

举例包含其中3,4,5,6的一个业务场景:

多个模块中的UI需要组合显示在某同一个界面中,牵扯数据刷新,模块间数据传递,及相互调用等问题

image

解决问题

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

推荐阅读更多精彩内容