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

12月9日,由InfoQ主办的中国技术开放日广州站将在广州四季酒店举行(欢迎广州的同学免费报名参加,报名地址见文末阅读原文)。我们邀请了来自腾讯、阿里、百度、唯品会的技术专家前来分享一线移动开发实践。本次开放日上,来自微信的高级工程师周志杰将分享《微信Mars:移动互联网下的高质量网络连接探索》,对于这个话题,我采访了周志杰,了解微信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开源项目。

作者:徐川

来源:51CTO

时间: 2024-09-10 11:57:24

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

微信Mars——xlog使用全解析

微信Mars--xlog使用全解析 如约而至,微信在12月19日开源了底层的通信库--Mars,其中有一个部分,是一个高性能的日志模块--xlog. xlog的详细介绍,大家可以参考微信技术公众号的这篇文章--微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog. 本篇文章将带领大家将xlog模块抽取出来,作为一个单独的模块来使用. 编译so库 首先,我们clone下Mars的源码,然后进入其中的libraries目录,直接执行下面的Python脚本: python build_

微信电脑客户端怎么备份聊天记录

  微信电脑客户端推出已经有一段时间,相信给很多害怕错过重要的微信信息的网友带来非常大的便利,而一些使用微信电脑客户端的网友想知道,使用微信电脑客户端聊天产生的聊天记录该怎么备份呢?下面,我们就一起来了解一下微信电脑客户端备份聊天记录的图文步骤吧! 电脑版微信中的主界面中左下角处点击齿轮按钮.如下图所示:进入它的设置界面,点击备份; 此时会提示你要能过USB线接入一台安卓手机,然后就会提示你查找手机.查找到了就会提示你在手机上授权登陆. 在手机上就可以看到如下图所示:授权这个界面是不是感觉有一个

微信电脑客户端“撤回消息”功能的使用方法

  最近,手机微信的"撤回消息"功能悄悄新增到微信电脑客户端.不过,还有很多微信电脑客户端不知道"撤回消息"功能怎么使用.因此,今天小编就为大家讲解一下微信电脑客户端"撤回消息"功能的使用方法,希望本教程对大家有所帮助! 1.更新微信,打开对话框,然后发送一条消息右击对话框,点击撤回; 2.大家可以看到微信会提示你撤回了一条消息! 大家注意哦,微信在发送2分钟之内撤销哦,不然是撤不回来的!

应用-微信支付 客户端与微信后台通讯问题-https

问题描述 微信支付 客户端与微信后台通讯问题-https 想做一个PC端应用程序 完成二维码微信支付.采用线下模式.但是由微信开发接口和其C#demo中查看 只提供了HTTPS的传输,请问我改使用怎样的通信模式与微信后台通讯呢?HTTPS是网站的通信协议,本地的客户端程序可以使用吗?怎么使用? 希望可以指点一下,在网络这一块还是小白.多多见谅 解决方案 http://blog.csdn.net/seven_cm/article/details/41559301 解决方案二: 之前我混淆了一个问题

.NET Core首例Office开源跨平台组件(NPOI Core)

前言 最近项目中,需要使用到 Excel 导出,找了一圈发现没有适用于 .NET Core的,不依赖Office和操作系统限制的 Office 组件,于是萌生了把 NPOI 适配并移植到 .NET Core 的想法. NPOI 的介绍不多说了,不了解的可以看一下 NPOI百度百科 的介绍,在此感谢瞿总和他的团队的贡献. NPOI 的移植之路并非想象的那么容易,因为其依赖了 System.Drawing 和 System.Window.Forms 两个组件,还有一个第三方的 SharpZipLib

微信PC客户端 革命或倒退

近期,微信非正式的推出了PC客户端,传闻此次推出的微信PC客户端只是原soso团队的探索性产品,因涉及到与搜狗的整合问题而被迫提前外泄.此版微信PC客户端的用户体验弱到掉渣,更像是微信PC网页版的客户端化,根本无法与腾讯旗下另一款PC端即时通讯软件QQ的用户体验相比,而微信官方也并未对此作出正式的宣传,更多的只是民间自发的流通使用. 腾讯担忧PC端被劫 加速微信PC端进程 虽然此版微信PC客户端并非腾讯官方正式出品,但却值得我们对IM的发展走向做进一步的探讨.既然此版微信PC客户端能在世面流传,

微信小程序 scroll-view组件实现列表页实例代码_JavaScript

scroll-view组件介绍 scroll-view是微信小程序提供的可滚动视图组件,其主要作用是可以用来做手机端经常会看到的上拉加载下拉刷新列表页!下面就以<摇出微笑>为例来讲解一下这个组件的使用吧! 为app导入新page页面 首先需要为我们的小程序导入新的page页面,项目根目录打开app.json这个项目配置文件在里面的pages数组添加"pages/allJoke/allJoke"然后设置底部导航在"tabBar"的列表项("lis

百度网盘多客户端跨平台管理

存储的载体在短短的十年间发生了巨大的改变.移动存储从最初的5英寸.3.5英寸磁盘:到后来的U盘.存储卡,以及如今的1T甚至更高存储空间的移动硬盘:而网络存储的改变甚至更大.记得我大约2000年左右刚接触互联网时,网络存储多为免费邮箱,以附件的形式保存:后来还用过一段时间的QQ网络存储,但以上几乎都是小容量的暂时存储,当面临大文件需要存储时,在若干年前,往往面临着以下几个问题:1.找不到如此大的网络存储空间.2.网速限制了文件上传下载的速度.但随着存储成本的降低,网络带宽的不断提高,让大容量的网络

DotNetCore跨平台~组件化时代来了

进行dotnetcore之后,各种对象都是基于DI进行生产的,这就有了对象的生命周期一说,早在autofac里也有相关知识点,这与Microsoft.Extensions.DependencyInjection是完全温和的,方便大家理解,在讲今天的组件化之前,先对DI的三种生命周期进行理解一下: AddSingleton:单例,进程内它是唯一的 AddTransient:瞬息,在对象在当前环境内,作用域内是唯一的 AddScoped:请求,对象在一个HTTP请求内是唯一的 下面来看今天的组件化的