[关闭]
@lsyAndroid 2019-03-24T08:31:08.000000Z 字数 4860 阅读 3056

插件化、组件化、模块化的思考——App架构从开发到构建

android


核心参考

从代码组织层面,我们可以参考这样下面的图片去进行。

架构图片

三面立体,上面作为职责划分,前面作为代码层级划分,右面作为功能划分。也就是说,可以从三个维度去思考,然后在每个维度里面,又从三个层次去区别和划分!这个位置是指导我们进行架构内部的模块化设计。

如果从顶层的架构设计考虑的化,这里又有两个维度,一个是架构思维,一个是架构原则。思维是我们的思考方式,是我们解决问题的方法。原则是我们思考问题的方向,是我们解决问题的一些标准。

那么我们为什么要去进行架构?
1. 项目需求扩张,旧的架构不适应新的需求;
2. 开发团队人员增加,协作要求变高;
3. 新技术引入;
4. 更高的软件质量要求;
5. 更灵活的开发;

其优势在于:
1. 进行了模块化的解耦,产品相对独立,应对需求变化、技术更新更加灵活,团队协作更加方便,并减少了许多是无用功,也给团队留下了一些技术积累;
2. 进行了必要的统一规范,组织结构更加清晰,系统更加健康;
3. 引入了新的技术框架,,产品获得更好的体验;
4. 进行了系统的优化工作,软件的品质更高,体验更好;

产出依据

架构设计之前,首先要去确立架构的产出依据,也就是我们设计或者采用这样的架构方式,是根据什么产出的。这里主要有两点:

  1. 产品开发需求
    在目前绝大部分app中,还是以业务驱动为主,首先要做到的是满足需求内容,在这里就需要去解决业务需求和开发之间的矛盾。反映在架构层级,就是做到快速出成果,所以前期可以不考虑复杂的架构设计,可以直接去编写。但是考虑业务系统的发展,当达到一定层次和规模时,当前的架构并不满足业务的变化内容,就可以考虑对当前项目进行架构变更。说这么多还有一层意思,就是不要过度优化和过度架构,也就是不要为了架构而架构

  2. App的性能和质量
    在app上线后,会收到各种各样的反馈意见,以及终端用户对于app内部错误的上报,那么上报后就需要考虑如何去复现、去定位到最终修改,推送用户升级。那么这个过程中,就会涉及到关于app性能的问题,比如卡顿和内存泄漏这样的问题,我们在去复现问题到解决问题的过程中可能会碰到各种各样的困难,这些困难会促使我们重新思考app的架构,是否可测试、是否够清晰、边界是否考虑周全等等这样的问题。各种各样的问题也会反馈给我们,促使我们去变更当前的app架构。

架构之前

  1. 拥抱变化
    拥抱变化并不是指,我们要考虑到所有的会变化的部分去做到一个非常灵活的层次,而是去确定变和不变的层次,再进行编码。要确定在一段时间内不变的东西,考虑到可预见的变化即可。树立不要过度优化的思维!

  2. 没有永远完美的架构
    任何架构都不是完美的,任何架构都不会做到适应所有的场景或者是所有的业务逻辑,但是我们需要考虑在当前有限范围内最合理、最适用的就好。

  3. 选择当下最合适的
    同上

  4. 进化和演变
    随着业务系统的发展,我们需要不断调整自身的架构,适应需求!需求是不断在变化的,但是总会在一定的时间内是不变的。我们需要做的是根据这种变和不变进行架构的调整和进化!

框架/依赖库选型

1.1 稳定性
所有依赖库在选择的时候首先要考虑稳定性的问题,比如在GitHub上找到一个网络请求框架,我们需要考量的是当前该框架是否还有人维护、是否有很多人star或者fork、是否有很多issue待解决、待解决和已解决的比例有多大等等,毕竟用起来出现了问题,还得依靠从GitHub获取的知识去解决。

1.2 学习成本
所有依赖库在选择的时候都要去看看它是如何去使用的,如何去编写,是否快速上手,遇到问题是否可查,源代码要能去读去看,有条件的可以对源码进行分析审查,再决定是否使用。再一个就是组内人员水平不一的情况下,如何进行培训和指导也要考虑在内!

1.3 优缺点
这一点主要针对多个相同或者相似功能的依赖库对比时,需要明确各个依赖库的优缺点,简单的可以根据上面学习成本中概述的几点去考虑,复杂一些的需要阅读源代码进行。

1.4 应用场景
比如说,各种相似功能的控件应用在界面上是否合适,各种网络请求框架是否符合现在的架构场景。这个需要具体问题具体分析!

1.5 选择标准
1.业界著名的(如Square, Google的)且经过大量使用验证的框架
2. 长期维护且比较活跃(如提交issue)的框架
3. 选择合适的框架,尽量小而精,不要大而全。这可能有些矛盾,因为大部分框架都会考虑通用性,如果仅需要其中一两个功能,就需要权衡了
4. 根据开源级别,尽量选择允许修改源码的,这样一旦框架出现问题,可自行修改
5. 对于国内的库,千万不要只相信star数量

2.1 基础框架
基础框架的分类如下:

挑选参考:
- awesome-android-ui
- 自己总结的Android开源项目及库
- Android第三方库收藏汇总

2.2 第三方服务
- 地图
高德/百度
- 推送
极光/友盟/各大厂商自有(不止集成一个,提高到达率)
- 数据统计
友盟/百度统计
- 分享
ShareSDK/友盟
- 第三方登录
QQ/微信/微博
- IM
- 支付
支付宝/微信/银联/聚合支付
- 广告变现
有米/百度推广首页开屏
- 短信验证码
- 直播平台

3.1 WebView
- 腾讯X5浏览内核
- CrossWalk
- AgentWeb(轻量级)

3.2 网页加载优化/预加载
- VasSonic--网页预加载秒开

3.3 和原生代码交互——JsBridge

3.4 混合开发框架
- PhoneGap
- Ionic/Cordova
- AppCan/ApiCloud/mui(国产)
- Weex
- ReactNative (可直接嵌入原生)
- Flutter(独立渲染,可直接嵌入原生)

注: 混合开发这块需要开新坑来研究讲解

4.1 变更成本评估
主要评估下面三个维度:
- 对当前业务逻辑的影响
- 对当前项目运行的影响
- 对内部项目成员的影响

4.2 替换
对当前不符合应用场景的内容进行替换,使其符合当下编写需要

4.3 保留
可用内容要延续,并且可以考虑适当重构

4.4 新增
增加符合业务场景的框架

4.5 是否需要自研替代
对于开源库/框架不满意的情况下,考虑自研内容来代替,可以去改造开源框架来实现,也可以自己造轮子!

代码架构编织

上述方式可根据需要进行挑选,或者团队内部分工编写每一层的代码。

插件化和组件化的异同:

相同点:

都必须能够实现单独调试、集成编译、数据传输、UI 跳转、生命周期和代码边界这六大功能。

不同点:

根据需要,建议优先进行组件化的工作,先进行代码分层和抽取,然后再进行插件化和模块化的工作。切记不可提前优化

参考文章:[Android] 组件化 & 模块化 & 插件化演进

持续构建

总结

试着将我们的工作任务进行分离,减少每项任务之间的交叉,避免东一榔头西一棒子,有条理的完成各项工作。这样一来,你的工作目标是清晰的,也更加容易的完成既定目标。同样的,我们可以通过这一理论还规划自己的人生。将我们的事业、家庭、兴趣爱好分离,再对每一项分离出更细的关注点,每个关注点在不同的阶段定下自己小目标。这样,我们对自己就可以有了更清晰的认识,认识自己已经拥有什么?最终想要什么?计划怎么做?当前怎么做?当然,并不是每一步都是能够按照既定目标走的,我们需要不断的更新对自己的认识,做出更加合适的决策。

最后,需要注意的是
1. 切记不要提前/过度优化
2. 适应当前需要
3. 结合团队实际情况
4. 仅总结了大体的思路和框架,细节尚需去具体讨论,需要各位的补充信息

参考文章

Android开发架构思考及经验总结
模块化?组件化?插件化?热更新?热修复?

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注