BT

你的观点很重要! 快来参与InfoQ调研吧!

微信Mars:客户端跨平台组件的开发经验

| 作者 徐川 关注 3 他的粉丝 发布于 2016年11月28日. 估计阅读时间: 7 分钟 | ArchSummit社交架构图谱:Facebook、Snapchat、Tumblr等背后的核心技术

A note to our readers: As per your request we have developed a set of features that allow you to reduce the noise, while not losing sight of anything that is important. Get email and web notifications by choosing the topics you are interested in.

12月9日,由InfoQ主办的中国技术开放日广州站将在广州四季酒店举行。我们邀请了来自腾讯、阿里、百度、唯品会的技术专家前来分享一线开发实践。本次开放日上,来自微信的高级工程师周志杰将分享《微信Mars:移动互联网下的高质量网络连接探索》,对于这个话题,InfoQ采访了周志杰,了解微信Mars是什么,以及微信在跨平台组件开发上的一些经验总结。

Mars 是微信官方的终端基础组件,是一个使用 C++ 编写的业务性无关,平台性无关的基础组件。目前已接入微信 Android、iOS、Mac、Windows、WP 等客户端。现正在筹备开源中,它主要包括以下几个部分:

  • COMM:基础库,包括socket、线程、消息队列、协程等基础工具;
  • XLOG:通用日志模块,充分考虑移动终端的特点,提供高性能、高可用、安全性、容错性的日志功能;
  • SDT:网络诊断模块;
  • STN:信令传输网络模块,负责终端与服务器的小数据信令通道。包含了微信终端在移动网络上的大量优化经验与成果,经历了微信海量用户的考验。

其中STN(信令传输网络)为核心模块。

Mars最早起源于微信的实际发展需要。由于微信多平台、亿级用户,微信基础功能的修改影响重大。但不同平台不同的实现导致众多平台上很难统一,一方面不利于质量把关,可能存在重大隐患,一方面也不利于微信对基础研究的深入。因此,微信开始了跨平台基础组件的开发,并且在微信中沉淀多年。随着基础组件的发展与稳定,他们希望通过开源的力量进一步的提升微信的基础,并且也期待行业的互相交流与促进,因此启动了Mars项目。

微信的网络层设计到很多不同的业务,在微信中使用到的绝大部分功能,都是基于Mars提供的网络组件,包括文本消息、语音消息、朋友圈等核心功能。只有少部分业务不在范围内,例如VOIP、Webview等。微信中使用到的网络服务,大体分为两种类型:信令网络、数据网络。其中STN负责信令网络,CDN组件则负责数据网络。但由于CDN涉及到腾讯内部的CDN服务,因此在Mars的开源列表中并没有包含CDN部分。

SDT网络诊断模块提供了最基础的检测能力,需要由使用者自己组合使用。各个平台的Reachability API能反映的情况有局限,无法应对复杂的网络诊断,事实上有一些开源项目就是为了替换系统API。微信由于自身特点对网络诊断要求很高,因此将它作为基础的跨平台组件进行开发维护。

STN是微信的信令传输网络,也可以认为是小数据传输网络,是微信日常中使用最频繁的网络通道。在开源设计上,STN抽象了微信的使用模型,使得STN成为业务无关的网络通道,并且应用到了包括微信在内的多个腾讯内部应用中。与AFNetworking、Retrofit、Okhttp等框架不同,STN不仅是跨平台的网络解决框架,更是着重了“移动互联网“这一特点,结合移动互联网的不稳定特性,做了大量的优化工作,并且这些优化都是经过了微信长时间的验证和使用的。除此之外,STN中还包含了很多其他方面的实用设计,包括自定义DNS、容灾设计、负载考量、APP的前后台考量、休眠机制考量、省电机制等等。

在实际的使用上,STN也提供了比其它网络框架更多的空间:

  1. 数据监控:STN提供了许多数据回调接口,使得应用可以基于这些网络数据,建立统计分析、监控等工具来管理应用的实际网络情况;
  2. 问题定位:STN中含有很多关键日志,并且日志的设计已经帮助微信定位了很多的网络层问题。结合Mars提供的XLOG日志机制,应用可以运行时也打开日志,非常方便定位;
  3. 参数配置:STN中将很多参数抽离为配置,使得应用可以根据自己的情况进行修改。

网络通道上,目前STN提供了长连、短连两种类型的通道,用于满足不同的需求。使用STN后,应用开发者只需关注业务开发。移动互联网的各种“坑”则可以交由STN帮你处理。

微信Mars跨平台组件开发经验

客户端的跨平台组件一般是指由C++等编写的代码,编译为各个平台的二进制链接库,然后通过平台提供的SDK调用和打包进App内。跨平台组件一般都是底层功能,特点是与平台无关、与UI界面无关,像第三方的游戏引擎、数据库等一般都以跨平台形式出现。

跨平台组件可以实现一份代码到处运行,减少开发和维护的精力,因此,当移动开发团队扩大、业务规模膨胀的时候,将一些通用的、易出问题的底层功能提取出来做成跨平台组件很有必要。

网络层其实和系统以及UI界面的耦合很小,除了硬件设备相关、WebView等需要依赖系统的部分外,网络层几乎都可以实现跨平台,一份代码。但微信会将能抽象成通用模型、通用能力的部分考虑以组件的形式跨平台。

跨平台组件在开发过程中需要注意的地方,也和一般的移动开发有所不同。微信在Mars的开发中,会以高可用、高性能、低负载、容灾性等目标来要求。

跨平台组件开发的难点在于,跨平台方案需要考虑各种平台上的API兼容性问题,在技术选型上需要付出更多的努力;需要考虑不同平台的特性,例如休眠机制等,根据不同的特性进行设计;跨平台的基础组件需要将问题进行更加本质的思考,避免复杂方案,避免方案的频繁变更等。

另外,跨平台组件由于对应用的影响很大,对它的稳定性和测试都要求更高。不过,只要设计良好,跨平台组件并不会对应用的稳定性造成威胁。从目前微信的使用情况来看,跨平台组件带来的Crash在总体中占比较小。测试方面,微信在各平台上有相应的测试工具,同时也有较多的自动化测试,能保障组件的稳健性。同时针对组件的某些特性,他们也有设计专门的测试场景。

Mars将在不久的将来进行开源,并且微信会持续的维护Mars开源项目。

参考链接:

GMTC PPT:微信客户端怎样应对弱网络

微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT