文档章节

组件化,模块化,插件化

雪梦科技
 雪梦科技
发布于 2016/03/01 10:59
字数 1537
阅读 105
收藏 0

同步发布在:http://snowdream.github.io/blog/2016/02/29/widgets-modules-plugins/

从事Adroid开发几年来,逐渐对Android应用架构和发展趋势有一点点认识,总结为三个词:“组件化,模块化,插件化”。
下面以一张图为基础,分别从这个三个方面进行阐述。如有不足,还请指正。

unnamed0_svg

组件化

为什么需要组件化?

Android的原生控件,基本上都没法直接拿来用,太丑了。另外一方面,原生控件在不同的Android版本上可能有不同风格,Holo,Material Design等。而从应用开发者角度来讲,他们需要一个拿来可用的,统一并且可延续的风格。在这种背景下,他们开始自定义系统控件,逐渐形成了自己的风格。比如,微信,支付宝,高德地图等。
这样之后,我们就需要将这种风格应用于TextView,Button,ImageView等标准化控件。组件化后,我们开发新功能,只需要直接引用带有自己风格的标准化控件,再稍微调整宽度,高度,字体大小等,就可以应付大多数情况了。

不组件化会怎么样?

如果没有形成自己的风格,又或者是形成固定风格后,不去进行组件化,会有什么后果呢?那大概的情况可能是这样,整个应用风格不统一。给你的整体印象可能是,你一会是在用苹果应用,一会是在用Android应用。打个不恰当的比方,一个男人,上身西装笔挺,下身大裤衩,脚上又是厚厚的棉鞋。

模块化

为什么需要模块化?

起初,一个应用几个人搞定,并不需要模块化这些事情。
但随着业务的发展,应用的迭代,可能出现人员越来越多,业务模块越来越多,越来越复杂的情况。在产品快速迭代过程中,假设某个业务的某个需求,由于外部原因等无法按时开发完成怎么办?或者由于其他原因,导致这部分功能有严重BUG怎么办?下掉这部分功能,又进行全量测试?划不来。硬着头皮修复BUG?万一来不及,错过发布日期怎么办?
这种情况下,应该按照业务,将业务模块分成几大块,同时按照业务模块对人员进行分组。
模块化建议遵循以下原则:

  1. 模块之间松耦合。 如果模块之间耦合度很高,应该考虑是不是应该将两个模块合并在一起。
  2. 模块之间的约定/接口应该保持稳定。 模块化后,如果由于人员更替,导致模块之间的约定被破坏,或者接口被修改,没有及时同步,可能会造成模块之间的调用出现BUG。所以,这部分约定/接口应该保持稳定。万一要修改,确保通知到其他人,做相应调整。
  3. 模块定义清晰。不要为了模块化而强行进行模块化。

怎样进行模块化?

参考上面的图片。我的建议是这样的,分层进行。

底层

包含,基础库和底层库。

*** 基础库 ***

  1. Http,封装了常用的网络操作,例如:okhttp
  2. Image,封装了图片相关的网络操作。(其中,如何防止内存溢出OOM问题尤其重要。) 例如:Fresco
  3. SQLITE,封装了数据库相关操作,也就是我们常说的ORM。例如:greenDAO
  4. 其他就不一一列举了。

*** 底层库 *** 底层库,主要是使用C/C++开发的跨平台的引擎或者库,以so的形式存在。例如:游戏引擎cocos2d

中间层

每个公司根据业务不同,分成不同的业务模块。在底层的基础上,实现相应的业务功能。

上层

将所有业务模块聚合在一起,加上配置,形成主应用。 一个模块化做的好的应用,主应用应该很简单,并且非常的稳定。

插件化

为什么需要插件化?

  1. 方法数限制的需要 大家都知道,一个dex的最大的方法数是固定的,65536.如果方法数超过这个数目,你根本无法正常的打包了。你可以采用MultiDex方案,但是看起来插件化的方案更靠谱一点。
  2. 安装包大小控制的需要 对于大部分应用来说,应用安装包越小,用户越容易安装。安装包越大,用户下载,安装,升级时,需要等待的时间越长,放弃应用的概率也就越高。通过插件化,可以将较小众的功能/模块进行插件化,用户需要时,点击下载,安装插件。
  3. 灵活性的需要 插件化之前,我们发布patch包总是要针对整个应用。而现在,我们只需要发布某个插件的更新即可。

怎么进行插件化?

并没有一个官方的插件化方案。各个大的互联网公司内部通常会搞一个插件化方案。庆幸的时,有一部分插件化方案被开源出来,供大家参考,使用。具体怎么进行插件化,超出了本人的讨论范围。如果大家有兴趣的话,可以到这里了解。awesome-android

哪些模块需要插件化?

对于核心底层模块,不建议进行插件化。即使要进行插件化,也要在最初的安装时,给全部安装完毕。
对于核心业务模块,可以进行插件化。要在最初的安装时,给全部安装完毕。
对于非核心业务模块,建议进行插件化。用户从网络下载,按需安装。

PS:facebook推出react native之后,移动应用又刮起了一阵Web风。苦于对Android平台和Windows开发环境的支持不足,暂时没法紧跟时代步伐了。

© 著作权归作者所有

共有 人打赏支持
雪梦科技

雪梦科技

粉丝 20
博文 12
码字总数 6591
作品 16
海淀
程序员
私信 提问
Android碎碎念 -- 组件化、模块化、插件化

从事Adroid开发几年来,逐渐对Android应用架构和发展趋势有一点点认识,总结为三个词:“组件化,模块化,插件化”。 组件化 为什么需要组件化? Android的原生控件,基本上都没法直接拿来用...

淡定的米哥
2016/07/27
2.1K
0
Apkplug-FAQ

FAQ ①什么是Apkplug插件化解决方法? 安织云-apkplug框架为开发者提供插件化,模块化,轻应用开发方案。你可利用它解决apk文件过大,代码臃肿,更新代价大等问题.以及支持应用内更新,支持第三方...

梁大帅
2014/11/10
4
0
CoreThink_v1.1 Beta2 版本发布啦!

CoreThink_v1.1Beta2版本发布啦! 更新:全新的架构,彻底模块化,核心不再臃肿 新增:后台多标签让内容修改更高效 更新:用户模块独立成单独的模块 更新:CMS模块独立成单独的模块 CoreThin...

ijry
2015/11/04
1K
12
我的Android重构之旅:插件化篇

随着项目的不断成长,即便项目采用了 MVP 或是 MVVM 这类优秀的架构,也很难跟得上迭代的脚步,当 APP 端功能越来越庞大、繁琐,人员不断加入后,牵一发而动全局的事情时常发生,后续人员如同...

codeGoogle
2018/07/09
0
0
阿里ARouter路由实现Android模块化开发

概述 从 2016 年开始,模块化在 Android 社区越来越多的被提及。随着移动平台的不断发展,移动平台上的软件慢慢走向复杂化,体积也变得臃肿庞大,为了降低大型软件复杂性和耦合度,同时也为了...

code_xzh
2018/04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

安卓constraintLayout中app:srcCompat设置的图片显示不出来

使用 app:srcCompat 的时候 引入的图片显示不出来的解决方案 首先查看的你的Activity 继承的是那个Activity 如果是继承AppcompatActivity 使用 ImageView的 app:srcCompat 是没有问题的 如果...

雨焰
40分钟前
1
0
MySQL mysqldump数据导出详解

MySQL mysqldump数据导出详解 2016-04-07 11:14 by pursuer.chen, 114348 阅读, 0 评论, 收藏, 编辑 介绍 在日常维护工作当中经常会需要对数据进行导出操作,而mysqldump是导出数据过程中使用...

linjin200
40分钟前
0
0
Lucene 检索时的步骤

用户输入查询语句:lucene AND learned NOT hadoop 搜索主要分为以下几步 第一步、对查询语句进行词法分析,语法分析,及语言处理 词法分析主要用来识别单词和关键字 语法分析主要是根据查询...

kdy1994
40分钟前
2
0
Gradle Implementation vs API configuration

注: 可以把 Implementation理解为java类的private, 使用Implementation则外部依赖本库的代码引用不到本库Implementation的代码, 也就是降低依赖树的层级, 这样就可以避免外部代码编译时候, 导...

SuShine
44分钟前
2
0
pdf安卓手机适配以及ie的兼容 以及隐藏掉下载打印按钮的方式

这是我目前遇到pdf方面最多的问题。 在百度上搜了很多答案,结果都是建议使用插件。而目前百度能搜的插件基本上都是有缺陷的。自己测试了很多插件。最后使用了pdf.js这个插件。这个插件目前完...

流年那么伤
50分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部