前言
架构,又名软件架构,是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。
软件架构设计目标:
1.可靠性(Reliable)。软件架构的可靠是产品设计的前提。
2.安全性(Secure)。软件架构的安全性是产品可持续发展的条件。
3.可扩展性(Scalable)。软件架构必须能够不同的功能需求情况下,支持可扩散性。
4.可定制化(Customizable)。同样的一套软件,可以根据客户群的不同和市场需求的变化进行调整。
5.可伸缩 (Extensible)。在新技术出现的时候,一个软件架构应当允许导入新技术,从而对现有系统进行功能和性能的扩展。
6.可维护性(Maintainable)。软件系统的维护包括两方面,一是排除现有的错误,二是将新的软件需求反映到现有系统中去。一个易于维护的系统可以有效地降低技术支持的花费。
架构是项目形成到一定阶段的趋势。是对整个产品是否合格的有效保证。对于很多项目设计人员,在不考虑产品本身,不考虑团队,不考虑时间周期的前提下,一味的强调软件构架,是不合理的,也不利于整个产品的发展。当然,一个好的项目架构师,是很能清楚,项目在不同阶段,所需要处理的不同职责。能够最大限度的发挥能效,将产品周期,与功能模块做出最合适的匹配规划,这才是一个架构师所必须追求的。
以下是个人对Android移动项目架构设计简单的经验之谈。欢迎与更多的朋友交流,若有疑问,或不合理之处,都可以随时交流。
从项目功能开始
每一个项目架构师,在拿到一个新项目的时候,都会不同的着重点。在项目规划风格上,都会有不同的考虑。而我个人在着手项目时,都会从功能上去着手。先了解项目整体的功能模块,区分出主体功能模块有哪些类,对不同的功能模块进行细致的划分。这是我开始的第一步。因为,只有对项目整体有个把握,才能更快的对项目有了解,才能知道怎样去合理安排项目的研发,才能更好的去安排项目进度流程,和人员的安排调度。
功能划分之后,接下来就是项目的实际研发阶段。这个阶段就是项目实际进展阶段了。必须要有合理的安排调度,才是保证项目的高效。比如:我们进行的大部分项目,都有网络交互的部分,也有本地功能部分,还有一些基础数据模块部分,这些功能必须要有合理的时间安排。
项目研发之前,几点提要说明:
一、团队之间统一编码规范。
二、需求文档统一管理。
三、多人协同开发,根据文档开发(一切以文档为主)。
项目以功能划分,功能以模块划分。在项目初期,除了产品原型可能是提前设计成形外,其它的项目文档都还未出来,产品也是有个确定功能,但是细节文档还未成形,这个时候已经是项目开始阶段,即使在有一些文档还未成形前,也可以开始项目的基础开发了。
功能模块
网络模块,数据库存储模块,数据加密模块,数据缓存模块,数据解析器,日志信息收集模块等。这些都是项目的基本模块,也可以独立于功能的模块,可以提前开发,测试。便于后期直接使用。
移动安全机制
做过移动项目的都知道,移动安全是项目前期需要考虑的一个重要环节。所以,在项目之初,就应该对自身的数据存储做必要的数据加密,对网络传输的数据进行必要加密。
移动数据加密分为两种:
一种是本地数据加密,只是本机存储的信息,本地加密保存。
一种是网络传输数据加密,这是涉及到网络协议,与服务器之间的加密协议。
本地加密方式有很多种:
一、MD5加密算法。 MD5是个不可逆的算法 没有解密的算法(目前据说也有方法破解)。
二、DES加密。可逆。
三、RSA加密。可逆
对于不是需要绝对足够安全的项目,以上三种加密足够用。
网络数据加密主要从两个方面考虑:
1. 保证API的调用者是经过自己授权的App;
2. 保证数据传输的安全。
保证API是自己授权的App,采用设计签名的方式。对每个移动平台,都会有不同的AppKey和AppSecret。在调用API时,将AppKey加入到请求参数中,然后,把AppSecret与其它参数,通过某种签名算法生成一个签名字符串,把数据传输给服务器端。而服务器根据AppKey和AppSecret,用相同的签名算法生成的签名与之一致,则说明请求安全。签名算法可以采用自己规定的一套签名算法(更安全),也可采用外部公开的签名算法(初期使用)。另外,在参数列表中再加入一个时间戳,还可以防止部分重放攻击。
对于数据传输安全,可以使用HTTPS。因为HTTPS添加了ssl安全协议。但是android项目开发,大部分都没有去实现。主要是没有对ssl证书进行安全性检查。
API协议标准化
项目开发,协议一定需要标准化,并且需要严格执行接口协议。完成每个版本的协议文档更新,方便后续使用者查看。
目前协议都是使用Json格式传输。需要注意的是,JSON数据和实体对象在传输时,序列化和反序列化因平台不同,会产生不同的区别。比如:JSON库将Date类型的数据序列化时会转为String,传输到服务器时,服务器反序列化经常会出现不同的结果。
API接口版本控制
一般解决接口更新变化问题,我们采取的做法是,每个API接口,都会带有协议的版本,若是协议发生改变,则版本号相应改变,在处理数据请求时,则可以根据不同协议的版本进行处理,解决了版本的兼容性问题。
架构分层
架构设计,主要的目的就解决功能和代码的复用,减少重复开发,方便功能扩展,降低功能和代码层级的耦合。
目前移动设计框架,主流的有三种:MVC、MVP、MVVM三种方式。
任何的框架设计都是在满足开发需求为前提,千万不能为了设计而设计,不要问我这三种设计,哪种最合适开发?如果你还这样去问,那只能说你还不是一个成熟的产品设计者。三种框架都有各自的利弊,是应该在不同的阶段和不同人员的配备情况下,选择更合理的方式。我曾经参与一个创业团队开发视频项目,前期只有两个移动开发人员,项目时间紧的情况下。项目负责人就只会天天在那里修改需求,谈项目架构。初期的项目,在产品验证功能阶段,在项目需要快速迭代阶段,应该使用最有效的框架,才是合理的选择。而且项目的发展,一定是随着项目功能的确立,产品的定型和需求完善,对项目本身的稳定性和性能的要求,才是一个逐步提高的过程。想要一步达到完美的产品,不仅是在设计上很难做到,而且在目前所有的产品中,都是很难达到的。
任何框架都是在此三层数据模型上。View,Model,Controller/Presenter/ViewModel。上层View:用户行为操作,数据结果显示。底层Model:数据处理,提供显示数据。中间的就是业务逻辑层。
Android项目设计,重在对项目的理解,重在对需求功能的划分,重在对团队合理分配。高效的产出,快速的迭代,才是移动项目的生存之道。
Android测试
移动开发,为保证质量产出,需要进行必须要逻辑测试。而在项目框架设计中,简单的mvc模式,若view和model中混有业务逻辑,则不利于接口测试。所以,在后续版本的迭代中,需要逐渐使用mvp或mvvm框架设计,让view和model与业务逻辑实现完整的解耦合。
Android环境
自从Android提供了更高效稳定的android studio之后,对于开发者来说是更便捷,更方便了。在android gradle多平台打包。proguard代码优化,混淆。随着android studio的越来越强大,越来越稳定,相信开发android项目也会变得越来越so easy了。
总结在最后
一个合格的移动项目架构师,必须是在不断的项目开发中成长的。不仅仅懂得项目的高效快速部署,也懂得怎样合理优化团队,才能有更优质的产品产出。移动产品,是一个快速产出的产品,怎样做出适合团队产出的产品,才是移动架构师的学习之道。