文档章节

Android碎碎念 -- 组件化、模块化、插件化

淡定的米哥
 淡定的米哥
发布于 2016/07/27 14:56
字数 1570
阅读 2190
收藏 5
点赞 0
评论 0

从事Adroid开发几年来,逐渐对Android应用架构和发展趋势有一点点认识,总结为三个词:“组件化,模块化,插件化”。
 

组件化

为什么需要组件化?

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

不组件化会怎么样?

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

模块化

为什么需要模块化?

起初,一个应用几个人搞定,并不需要模块化这些事情。
但随着业务的发展,应用的迭代,可能出现人员越来越多,业务模块越来越多,越来越复杂的情况。在产品快速迭代过程中,假设某个业务的某个需求,由于外部原因等无法按时开发完成怎么办?或者由于其他原因,导致这部分功能有严重BUG怎么办?下掉这部分功能,又进行全量测试?划不来。硬着头皮修复BUG?万一来不及,错过发布日期怎么办?
这种情况下,应该按照业务,将业务模块分成几大块,同时按照业务模块对人员进行分组。
模块化建议遵循以下原则:
1. 模块之间松耦合。 如果模块之间耦合度很高,应该考虑是不是应该将两个模块合并在一起。
2. 模块之间的约定/接口应该保持稳定。 模块化后,如果由于人员更替,导致模块之间的约定被破坏,或者接口被修改,没有及时同步,可能会造成模块之间的调用出现BUG。所以,这部分约定/接口应该保持稳定。万一要修改,确保通知到其他人,做相应调整。
3. 模块定义清晰。不要为了模块化而强行进行模块化。

怎样进行模块化?

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

底层

包含,基础库和底层库。

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

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

中间层

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

上层

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

插件化

为什么需要插件化?

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

怎么进行插件化?

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

哪些模块需要插件化?

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

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

本文转载自:https://yq.aliyun.com/articles/7239

共有 人打赏支持
淡定的米哥
粉丝 37
博文 68
码字总数 14199
作品 0
朝阳
高级程序员
我的Android重构之旅:插件化篇

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

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

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

code_xzh
04/24
0
0
十分钟认识Activiti6.0工作流引擎

概述 了解Activiti 假如你还不知道Activiti是什么,那么工作流引擎对你来说一定也是新的,解决Activiti和工作流知识盲点,所以看到到这里就对了,还有Android同学会误以为是“Activity”,工...

JimmyNo1
06/13
0
0
Android系统源码分析团体项目BeesAndroid正式上线啦

嗨,BeesAndroid开源技术小组正式成立啦,Bees,即蜜蜂,取义分享、合作与奉献的意思,这也是BeesAndroid小组的宗旨,我们第一个团体项目BeesAndroid也于2018年3月6日同步上线,该项目的前 ...

郭孝星
03/08
0
0
Android动态化框架App Bundles

Android App Bundles 在今年的Google I/O大会上,Google向 Android 引入了新 App 动态化框架(即Android App Bundle,缩写为AAB),与Instant App不同,AAB是借助Split Apk完成动态加载,使用...

code_xzh
05/16
0
0
Android插件化开发,初入殿堂

好久没有写博客了,这次准备写写我这几天的研究成果——Android插件化开发框架CJFrameForAndroid。 背景交代 首先,你需要知道什么是插件化开发。就拿最常见的QQ来说,在第三个界面动态那里有...

kymjs张涛
2014/10/12
0
9
X5跨端移动开发框架开源项目简介[oschina首发托管]

一、X5是什么 X5是跨端移动快速开发框架;只需一次开发,即可发布、运行于各种前端平台上;支持iOS ipa、android apk、微信服务号/企业号应用、web app和其他轻应用的快速开发。 二、X5采用的...

WeX5移动开发云
2015/01/15
0
7
Android开源框架源码鉴赏:VirtualAPK

关于作者 郭孝星,程序员,吉他手,主要从事Android平台基础架构方面的工作,欢迎交流技术方面的问题,可以去我的Github提issue或者发邮件至guoxiaoxingse@163.com与我交流。 文章目录 一 Vi...

郭孝星
02/10
0
0
如何将「插件化」接入到项目之中?

本期移动开发精英社群讨论的主题是「插件化」,上网查了一下,发现一篇 CSDN 博主写的文章《Android 使用动态加载框架DL进行插件化开发》。此处引用原作者的话: 随着应用的不断迭代,应用的...

OneAPM蓝海讯通
2016/03/30
46
0
深入解读Android新特性——App Bundles

App Bundles是2018 Google I/O新引入的一个概念。不同于以往传统的App是以一个完整的Apk作为单位,而App Bundles有下面几个技术特点: 一个App被分割成一个基础APK和多个模块APK。 基础APK在...

万壑
06/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java集合元素的默认大小

当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使...

竹叶青出于蓝
9分钟前
1
0
Java快速开发平台,JEECG 3.7.7闪电版本发布,增加多套主流UI代码生成器模板

JEECG 3.7.7 闪电版本发布,提供5套主流UI代码生成器模板 导读 ⊙平台性能优化,速度闪电般提升 ⊙提供5套新的主流UI代码生成器模板(Bootstrap表单+BootstrapTable列表\ ElementUI列表表单)...

Jeecg
12分钟前
0
0
export 和 module.export 的区别

在浏览器端 js 里面,为了解决各模块变量冲突等问题,往往借助于 js 的闭包把左右模块相关的代码都包装在一个匿名函数里。而 Nodejs 编写模块相当的自由,开发者只需要关注 require,exports,...

孟飞阳
14分钟前
0
0
技术教育的兴起

技术教育的兴起 作者: 阮一峰 1、 有一年,我在台湾环岛旅行。 花莲的海边,我遇到一对台湾青年夫妻,带着女儿在海滩上玩。我们聊了起来。 当时,我还在高校当老师。他们问我,是否觉得台湾...

吕伯文
14分钟前
0
0
Linux服务器下的HTTP抓包分析

说到抓包分析,最简单的办法莫过于在客户端直接安装一个Wireshark或者Fiddler了,但是有时候由于客户端开发人员(可能是第三方)知识欠缺或者其它一些原因,无法顺利的在客户端进行抓包分析,...

mylxsw
19分钟前
0
0
mybatis3-javaapi

sqlSessionFactoryBuilder->sqlSessionFactory->sqlSession<-rowbound<-resultHandler myBatis uses a Java enumeration wrapper for transaction isolation levels, called TransactionIsol......

writeademo
22分钟前
0
0
Java NIO:浅析I/O模型

也许很多朋友在学习NIO的时候都会感觉有点吃力,对里面的很多概念都感觉不是那么明朗。在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型。下面本文先从同步和异步的概念...

yzbty23
23分钟前
0
0
了解iOS消息推送一文就够:史上最全iOS Push技术详解

本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表。 1、引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ、微信等IM界面处于前台时,聊天消息和指令都会...

JackJiang-
24分钟前
0
0
Mysql汉子转拼音

update t_app_city SET CITY_NAME_BEGIN = ELT(INTERVAL(CONV(HEX(LEFT(CONVERT(CITY_NAME USING gbk),1)),16,10), 0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7, 0xBFA......

尘叙缘
26分钟前
0
0
大数据构建智慧城市“新引擎”,加速推进新旧动能转换

——“大数据与智慧城市”技术交流分享会——济南站召开 7月13日,“大数据携手智慧城市,助力山东新旧动能转换”技术交流分享会——济南站在山东信息通信技术研究院会议室成功举办,此次会议...

左手的倒影
28分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部