QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

苏宁易购 Android 架构演进史

  • 2018-04-16
  • 本文字数:3749 字

    阅读完需:约 12 分钟

摘要

一个电商类 APP,对用户而言,是琳琅满目的商品,是层出不穷的优惠,既是社交导购,更是交易售后;而对于开发者来说,用户行为的背后,或许仅仅是一次次数据的存储、处理、传输和展示。

在苏宁易购 android 客户端不断发展的过程中,也出现了许多的问题:

  • 如何高效、安全的处理数据流向的各个环节?
  • 如何规避软件升级、硬件差异、网络环境等携带的风险?
  • 如何合理的解决产品快速迭代和开发应接不暇之间的矛盾?
  • 如果最大限度的提高开发效率,降低开发、管理和运营的成本?

有问题,就有对应的技术方案,就需要合理的架构去支撑。

本文将根据移动发展各个阶段的时代特点,结合移动电商 app 业务的特质,以移动数据交互全景的视角,讲述苏宁易购 android 客户端在不同阶段出现的问题,采取的技术应对方案,以及如何衍生出最终的 android 运行架构。

移动青铜时代(2012-2014)

时代特点:

  • 移动特征,2G~3G 网络为主,数据传输效率低,电商类 APP 用户的活跃性低;
  • 发布模式,传统的软件生命周期,需求收集、评审 → 测试案例生成、评审 → 开发设计、编码、评审 → 测试 → 发布 → 运营,单团队单线发布;
  • Android 生态,Android 2.0~3.0,行业内都处于探索阶段,技术交流少,多以系统 API 为主;开发工具 Eclipse。

APP 业务特征:

  • 业务系统,以 PC 业务为主,没有针对移动业务数据的 API,需要单独研发一个数据中转系统,以保持移动业务的正常运转;
  • 产品逻辑,展示、交互简洁,业务复杂度低,以商品的搜索、展示、购买等核心流程为主;

移动应用数据交互全景:

研发过程中的问题:

由于业务逻辑简单,页面展示、交互的复杂低,通过 Android 原生的 Activity+WebView 即可以满足绝大部分的产品需求;需求、开发、测试、发布、运营都在正常的版本周期内有条不紊的进行着;在 Android 发展初期,最主要的问题就是:

如何提高开发者的编码质量。

技术应对方案:

资深人力资源对核心技术进行封装,高内聚,低耦合;以最精简的 API 对外,降低使用复杂度,让开发人员专心于业务逻辑的研发。

应用架构生成:

采用最基本的软件设计理念,即分层 + 解耦:

  • 分层,数据流转处理采用责任链模式,保证各个环节的逻辑清晰明了;
  • 解耦,各层之间添加标准的 API 代理,确保被依赖层可以正常的维护、升级。

移动白银时代(2014-2016)

时代特点:

  • 移动特征,3G~4G 网络为主,数据传输效率高,高效便捷的购物体验,让手机购物成为了主流;
  • 发布模式,单线已经无法满足各条产品线的快速迭代,敏捷开发应运而生,多团队多线发布;
  • Android 生态,Android 4.0~5.0,移动技术交流百花齐放,插件化、热修复、APK 加固等黑科技如虎添翼;开发工具 Eclipse → Android Studio。

APP 业务特征:

  • 业务系统,以移动业务为主,提供针对移动业务特征的 API,废弃原有的转接系统,一方面提高移动数据的传输、处理速度,一方面降低单一系统异常带来的移动体验风险;
  • 产品逻辑,除了核心的商品搜索、展示、交易,评价、社交、导购、物流等都开辟出单独的产品线,以满足用户使用过程的各种需求;

移动应用数据交互全景:

研发过程中的问题:

如果说一个产品从出现到成熟,一定要经过一个“战争期”的话,我想一定是这个时期了,摘要里列出的大多数问题都爆发在这个阶段,

1 软\硬件差异方面:

  • App 在 Android_x.x 上是可以运行的,在 Android_y.y 就不行
  • App 在其他手机上都可以跑,就 XXX 手机不行

2 网络环境方面:

  • App 在 WIFI 正常显示数据,切到 3G 显示异常
  • App 在运营商 1 网络下正常显示,在运营商 2 网络下一片空白
  • XX 省请求数据超时严重,其他地区正常

3 产品运营方面:

  • XX 需求一定要跟着 App 版本走么,能不能明天就上,不然活动就过期了
  • HTML5 体验太差了,能不能让开发优化下
  • 这个页面在 App 已经做好了,让开发直接用,这个不算开发时间

4 开发测试方面:

  • 这个控件能不能抽出来公用,每次都是各自复制代码
  • 页面跳转都是写死的,抽离代码,都是报错,改动太多
  • 会员数据、手机软硬件数据能不能提供 API,现在都是另起炉灶,代码冗余太多
  • 跑一次工程太慢了,65535 是什么情况
  • 为啥商品页面的改动,还需要把会员相关的场景都测试一遍
  • 线上不能直接修改已发布 APP 的 bug,每次有问题都要重新发布,严重浪费资源

5 APP 性能方面:

  • 有用户反馈,点击 XX 页面就闪退
  • 用户又反馈,首页展示的非常慢
  • 还有用户反馈,浏览了几页就提示 APP 未响应

技术应对方案:

虽然出现了很多问题,但是这个阶段出现的技术方案,针对性并不强,都是根据生产版本出现的问题,施加的通用手段,具体如下:

  1. 完善 App 的监控机制,对 App 的奔溃、HTTP、内存、CPU 等指标数据,进行全面采集分析,确保问题的快速响应、定位、解决;
  2. 完善的用户反馈机制,让用户可以便捷的反馈,让开发者可以第一时间收到反馈并解决问题;
  3. HTTP 加速(MAA),优化请求链路,确保各项业务数据的快速响应;
  4. HTTPDNS,降低 DNS 劫持的风险;
  5. Chromium 引擎,使用 Chromium 引擎的 WebView 替代原生的 Webview,保证 HTML5 的快速渲染,提升用户的购物体验;
  6. 热修复,对已发布 APP 的问题,进行在线修复,最大程度的减少问题影响;
  7. VR/AR,增加现实、虚拟现实技术的运用,用“神奇”进一步提升促销推广的影响力。
  8. Android Studio,伴随着 Android Studio 的出现,一方面通过 gradle 提升编译速度,另一方面配合 MultiDex 同步解决 Dex 容量的问题;

而相比 app 的性能问题,产品缺陷、开发缺陷以及体验问题,才是这个阶段最主要的问题,所以在这个阶段,项目里面的所有人,每天都在看监控、看用户反馈,发现问题解决问题。

应用架构生成:

而对于客户端,也在想法设法的在架构上提高开发质量,主要手段如下:

  1. 路由、消息机制,用户模块间跳转,去除不同业务模块之间的耦合,同时也是为了业务的模块化、插件化做准备;
  2. 模块化、插件化,物理隔离不同性质的业务代码,一方面满足产品快速迭代的需求,另一方面减少蝴蝶效应,同时责任明确,促进高效开发;
  3. 服务化,通用 UI,抽离成高独立的控件,形成 UI 服务;对于通用的数据获取、处理、存储,按性质抽离成可拓展的数据处理机制,形成数据服务;

移动黄金时代(2016 至今)

时代特点:

  • 移动特征,4G 网络为主,数据传输速度 + 流量已经不在是移动 APP 的瓶颈,移动设备的物理性能大幅度提高;
  • 发布模式,敏捷开发模式运用成熟,多产品线灵活发布,可集成发布、也可独立发布;
  • Android 生态,Android 6.0~7.0,插件手段运用成熟,前端页面渲染更加高效,Weex/ReactNative、微信小程序等成为新趋势;开发工具 Android Studio。

APP 业务特征:

  • 业务系统,在传统的业务系统上,系统更加安全、高效、多样、智能,接入、升级更加灵活;
  • 产品逻辑,视频直播、虚拟现实、人工智能成为主流元素,商品销售定位更加精细。

移动应用数据交互全景:

研发过程中的问题:

不同于前面的发展阶段,这个阶段出现问题(或者说是技术需求)针对性都非常强,主要如下:

  1. 数据安全方面,APP 界面出现广告;用户信息被抓包获取;
  2. HTTP 速度方面,有些偏远地区,移动请求速度长达 3~5s,如何解决;
  3. 消息推送方面,客服的消息、活动的信息、物流的状态如何在第一时间告诉用户;
  4. 前端体验方面,前端页面滑动卡段、加载慢、交互延迟,如何优化。
  5. 产品独立方面,有些产品功能做大做强,如何快速形成独立 APP。

技术应对方案:

  1. 全站 HTTPS,加强数据安全,减少内容劫持,保障用户隐私,促进购物体验;
  2. HTTP2.0,在统一接入层(域名收敛)的基础上支持 HTTP2.0,减少 DNS 解析、请求链路复用,进一步加快移动 APP 的数据交互;
  3. 云信系统,一方面满足客服消息、活动信息、物流状态的推送,另一方面结合大数据、人工智能,实现真正的精准营销;
  4. Weex + 静态资源缓存,引入 Weex 技术,配合 Webview 的静态资源缓存技术,让前端页面体验更加原生化。

与此同时,Google 在 Android Studio 上推出 Instant Run 用来加速 gradle 的编译速度,进一步提升开发效率。

应用架构生成:

这个阶段的架构调整,针对上述问题 5 做了很多精细的工作,一方面要颗粒化业务层、服务层、ADK 层,另一方面还要调整原有的单向依赖关系,让应用工程本身容器化,满足产品线的快速集成、快速独立,实现 APP 研发的 DIY,主要调整如下:

  1. 彻底落实模块化、插件化,所有产品线开辟独立工程,业务代码完全物理隔离,以 Android Library(aar) + Plugin(apk)的方式对外提供;
  2. UI 控件、数据服务精细化,即保证所有 UI 控件、数据服务的高度独立,让使用方(业务层)自由取舍;
  3. 基础 ADK 标准化,收集集团所有 APP 的技术需求,集中优秀人力资源打造超高性能 ADK,生成开发文档并推广,促进各产业 APP 高效研发。

后记

5G 时代即将到来,有人说那是人工智能的时代,有人说那是物联网的时代,也有人说那是虚拟现实的时代,技术改变人们生活习惯的同时,也给开发者带来的各色各样的问题,时代在变,技术方案在变,支撑技术的架构也在变。

千变万化的背后,唯一不变的、也是我们锲而不舍追求的,就是:“在掌握时代特点、业务特征、软硬件限制的前提下,合理利用各种资源,设计出最高效的开发方案。”

作者介绍

李呈武,苏宁易购前端技术专家,资深 Android 开发者,深度掌握 Android 虚拟机、插件化、Weex 等技术,熟悉移动网络的特质,对移动端的架构设计有独特的见解,一直致力于通过优秀的架构设计,减少开发成本,提升开发质量。

感谢徐川对本文的审校。

2018-04-16 18:282611

评论

发布
暂无评论
发现更多内容

如何管理项目干系人?

敏捷开发

项目管理 项目干系人

跨域:后端工程师最熟悉的陌生“人”

华为云开发者联盟

后端 华为云 跨域 企业号 1 月 PK 榜

10分钟在 Rainbond 上部署 mall 电商项目

北京好雨科技有限公司

当你输入网址,小手一点,然后发生了什么

华为云开发者联盟

前端 HTTP 华为云 企业号 1 月 PK 榜

SpringBoot实例

Geek_7ubdnf

Java springboot

Java基本语法

Geek_7ubdnf

Java

备份谷歌或其他浏览器插件

Geek_7ubdnf

浏览器 Google

MegCC 新版本来啦!新增 Benchmark 等工具,性能大幅提升!有奖征文活动同步启动

MegEngineBot

深度学习 benchmark MegEngine MegCC 模型编译器

软件测试/测试开发 | Jenkins 持续集成体系介绍

测试人

软件测试 持续集成 jenkins 自动化测试 测试开发

怎样快速地迁移 MySQL 中的数据?

C++后台开发

MySQL 数据库 中间件 后端开发 C++开发

写作的“收益”超乎想象

王中阳Go

深度思考 学习方法 写作 写作技巧 写作感悟

使用 DataEase 制作动态轮播仪表板

搞大屏的小北

软件测试/测试开发 | Jenkins 如何参数化job ?

测试人

软件测试 持续集成 jenkins 测试开发 测试开发自动化测试

阿里内部面试手册,Github 上获赞 80K,按这个学,找工作没问题!

架构师之道

Java 程序员 面试

【碎碎念】下雪了

Firshare

年终总结

软件测试/测试开发 | Jenkins job 机制该如何使用?

测试人

软件测试 jenkins 自动化测试 测试开发

Halcon快速入门教程

嵌入式视觉

定位 算子 测量 HALCON 工业智慧视觉

pip安装后仍有ImportError No module named XX问题解决

Geek_7ubdnf

Python

Linux下OpenCV出现错误:ASSERT false in file qasciikey.cpp, line 501

Geek_7ubdnf

Linux OpenCV

性能再升级,XMeter Cloud专业版正式上线

EMQ映云科技

物联网 IoT 云服务 mqtt 企业号 1 月 PK 榜

华为云发布CodeArts Check代码检查服务 守护软件质量和安全

科技热闻

ModuleNotFoundError No module named 'PIL'问题解决

Geek_7ubdnf

Python

Java中Get和Post的使用

Geek_7ubdnf

Java

pip安装报错:Command python setup.py egg_info failed with error code 1

Geek_7ubdnf

Python

redis.conf 7.0 生产配置详解,全网最全

码哥字节

NoSQL 数据库 redis 底层原理 Redis 7

从TMMI角度谈谈质量度量

老张

软件测试 质量度量

服务网格|如何使用 Amesh 配置插件

API7.ai 技术团队

Service Mesh 服务网格 APISIX 网关 Kubernetes Serverless

透视华为云云原生数据库的演进,能给行业带来哪些启发?

华为云开发者联盟

数据库 云原生 后端 华为云 企业号 1 月 PK 榜

【HA小知识】DRBD数据不一致怎么办?怎么处理?

行云管家

高可用 ha 高可用软件

屡获殊荣|旺链科技亮相2022中国双链年会并喜获佳绩

旺链科技

区块链 区块链技术 双链年会

我理解的金融级数据库

宫博

分布式数据库 金融行业 oceanbase 金融信创 金融科技创新

苏宁易购Android架构演进史_Android/iOS_李呈武_InfoQ精选文章