微信客户端技术团队

其他

五年沉淀,微信全平台终端数据库WCDB迎来重大升级!

量和计算量比之前大幅减少了。同时遍历的时候,优先遍历上次备份时有更新的表,只要找到所有有更新的页,就可以停止遍历了,一些不常更新的表就很少遍历到,也能在一定程度上优化性能。这个方案上线之后,500M
4月9日 上午 8:05
其他

从入门到精通:如何解决C++模板代码膨胀问题?

臃肿的模板组合这个形容词我想了很久,没找一个合适的词去形容,因为实在太震撼。具体是这个类AutowireableConstructorRegistrationDescriptor:template
2月21日 上午 8:06
其他

视频号直播:如何进一步降低功耗占用?

变化情况。不过经过分析,我们发现只要触发了以下行为就可能代表要帧率要变化了,如下:在设置->动态效果里开启或关闭“限制帧速率”❝修改限制帧速率会触发系统抛出
2023年10月11日
其他

Android微信客户端是如何支持R8构建的?

作者:chrispaul,来自微信客户端团队背景在之前的版本,微信Android一直采用Proguard构建Release包,主要原因在于:Proguard优化足够稳定ApplyMapping也能保证正确性与AutoDex搭配使用,生成足够小的Tinker
2023年3月13日
被用户删除
其他

Android微信客户端是如何支持R8构建的?

作者:chrispaul,来自微信客户端团队背景在之前的版本,微信Android一直采用Proguard构建Release包,主要原因在于:Proguard优化足够稳定ApplyMapping也能保证正确性与AutoDex搭配使用,生成足够小的Tinker
其他

Windows微信:消息数据库架构演进

压缩体积,是我们的优化方向。从上面的数据看,部分消息体积较大,已经超过了数据库每页的大小(Page
其他

无障碍功能框架:如何让残疾/老龄群体更好使用微信?

作者:nalecyxu简介:微信客户端Android团队,负责无障碍功能框架开发。前言为了帮助老年人、残疾人(视障/听障人群等)更好地使用微信App,Android微信完成了适老化及无障碍改造。本文主要介绍「Android根据适老化及无障碍需求
2022年3月29日
其他

iOS微信全文搜索技术优化

一、iOS微信全文搜索技术的现状全文搜索是使用倒排索引进行搜索的一种搜索方式。倒排索引也称为反向索引,是指对输入的内容中的每个Token建立一个索引,索引中保存了这个Token在内容中的具体位置。全文搜索技术主要应用在对大量文本内容进行搜索的场景。微信终端涉及到大量文本搜索的业务场景主要包括联系人、聊天记录、收藏的搜索。这些搜索功能从2014年上线至今,已经多年没有更新底层搜索技术,聊天记录使用的全文搜索引擎还是SQLite
其他

微信Android增量Proguard方案

outputs校正后的字节码还必须进行重新混淆才能输出生产环境Apk,阅读retrace解析流程,我们顺利地将上次构建的mapping.txt进行结构化解析,再对已经标记待处理的output
其他

基于Web内核的微信小程序框架实践

背景在正式进入分享之前,简单介绍一下做这个小程序新框架的背景思路,主要目的有以下几点:新框架和微信的主客户端解耦,能够独立运行,并且可以同时支持小程序和小游戏。新框架能去拥抱更多的Web特性,深入到Chromium内核中,去支持更多平台。还有一个目的就是,通过新框架去拓宽小程序生态的边界,能够在许多非移动端设备,提供微信小程序生态。1
其他

微信终端自研C++协程框架的设计与实现

访问的时候已经失效了。要规避共享栈的这个缺点,可能需要对协程的使用做一些限制或检查,无疑会加重使用者的负担。对于终端开发,由于同时运行的协程数量并不多,性能问题并不明显,为了使用上的便捷性,owl
其他

企业微信超大型工程-跨全平台UI框架最佳实践

考虑到一个方法的开始和结束存在以下几种情况:带返回的函数,需要在这个函数主体的开始添加markStart调用,需要在这个函数的return语句前添加markEnd调用。@overrideWidget
其他

线程:“你可能把握不住”—— Android 平台下线程导致的内存问题

线程不退出线程是有限的系统资源,我们通常会使用线程池来复用线程,但使用了线程池并不意味着就能解决所有的线程使用问题,也并不是所有的业务场景都能使用线程池的,比如要求
自由知乎 自由微博
其他

Android App 电量统计原理与优化

https://github.com/Tencent/matrix/tree/master/matrix/matrix-android/matrix-battery-canary
2021年8月3日
其他

快速缓解 32 位 Android 环境下虚拟内存地址空间不足的“黑科技”

还获取了RegionSpace::num_regions_成员变量的值,并将其与通过先前获取的begin_、limit_成员变量的值计算出来的结果作比较,相等才认为前面获取到的值是正确的。总体上看
2021年7月28日
其他

微信Android客户端的ANR监控方案

else,给出了几种比较极端的情况,会直接return,而不会产生一个ANR,这些情况包括:进程正在处于正在关闭的状态,正在crash的状态,被kill的状态,或者相同进程已经处在ANR的流程中。
2021年7月19日
其他

微信Android客户端的卡顿监控方案

我们可以写一段测试程序,模拟上面那些情况,尝试不断在随机的时间点触发一次sleep,检查是否监控到了卡顿。结果基本上大概进行十次左右,实验得出的频率就很常接近公式算出的概率了。
2021年7月13日
其他

Klee:用 C++ 实现数据驱动开发

五大平台。我们重视跨平台技术框架的研发,各类原创技术专利,截止去年,仅数十人的技术团队在近3年内提交技术专利百余项。团队招聘优秀技术人才,岗位分布在成都、广州、深圳。欢迎在官网投递简历。
2021年6月29日
其他

Android的离奇陷阱 — 设置线程优先级导致的微信卡顿惨案

13);ht.start();需要注意的是,因为线程优先级最终是通过Process.setThreadPriority方法实现的,所以priority使用的是-20到20的nice值的优先级体系。
2021年6月17日
其他

介绍一种性能较好的 Android native unwind 技术

表格上的时候,可能会留意到这样一个问题:我们为了拿到函数的返回地址,却完整的恢复每一帧所有寄存器的状态。在处理异常或者调试的时候这样做非常有用,但栈回溯的时候貌似有些浪费。
2021年6月8日
其他

微信支付跨平台软件架构

没有架构,我们所有的代码都耦合在一起,人类的心智模型不擅长处理这种复杂性,架构的设立,和图书馆的图书分类,公司的组织划分等,本质都是一样的。是为了管理复杂性,以取得更高的生产力。
2020年3月20日
其他

微信大终端,缺人,求贤,速来!

视频号是今年初微信刚刚发布的全新功能,除了项目日常功能开发,我们还将在技术上挑战各种音视频技术。我们希望找到思维敏捷,学习能力强,能独立分析问题,解决问题的人,加入我们,一起编写一个能影响
2020年2月25日
其他

iOS 微信编译速度优化分享

71.9%!猜测头文件嵌套严重,每个源文件都要引入几十个甚至几百个头文件,每个头文件源码要做预处理、词法分析、语法分析等等。实际上源文件不需要使用某些头文件里的定义(如
2019年12月19日
其他

基于小程序技术栈的微信客户端跨平台实践

的同学一起来探讨出一些解决方案,也希望大家积极的拥抱新技术,在社区当中分享自己的解决方案。但无论怎么讲,我们使用新技术的目的是为了解决我们遇到的问题,只要是对我们有益的技术,我们一定会持续的跟进。
2019年7月1日
其他

Matrix for iOS/macOS 正式开源了

性能表现更加优异,并且监控的对象更加全面,它具有如下特点:在应用运行期间获取对象存活以及相应的堆栈信息,在检测到应用爆内存时进行上报;使用平衡二叉树存储存活对象,使用
其他

Matrix TraceCanary -- 初恋·卡顿

事实上,搞客户端开发的同学应该知道,解决卡顿的过程往往是曲折的,有些并没有我们想的那样简单、浅表,但我们依旧不屈不挠地想尽一切办法去发现它,解决它。如对初恋般真诚,这就是我们对待卡顿的一种态度。
2019年1月11日
其他

Matrix IOCanary -- I/O 质量监控

微信移动客户端开发团队官号,分享微信在Android、iOS、Mac、Winphone、Windows等平台的开发经验、前沿技术,以及一些鲜为人知的小故事。
2019年1月3日
其他

微信自研 APM 利器,Matrix 正式开源了

的目标是建立统一的应用性能接入框架,通过对各种性能监控方案快速集成,对性能监控项的异常数据进行采集和分析,输出相应问题的分析、定位与优化建议,从而帮助开发者开发出更高质量的应用。在经历微信内
其他

微信 Android 终端内存优化实践

中对每个进程可创建的线程数也有一定的限制(/proc/pid/limits)而实际测试中,我们也发现不同厂商对这个限制也有所不同,而且当超过系统进程线程数限制时,同样会抛出这个类型的
2018年11月12日
其他

MMKV 组件现在开源了

crash,参考文章,文章里面设计的技术方案是在关键代码前后进行计数器的加减,通过检查计数器的异常,来发现引起闪退的异常文字。在会话列表、会话界面等有大量
其他

我们等你来

微信移动客户端开发团队官号,分享微信在Android、iOS、Mac、Winphone、Windows等平台的开发经验、前沿技术,以及一些鲜为人知的小故事。
2018年3月15日
其他

MMKV--基于 mmap 的 iOS 高性能通用 key-value 组件

crash,《iOS微信特殊字符保护方案》,文章里面设计的技术方案是在关键代码前后进行计数器的加减,通过检查计数器的异常,来发现引起闪退的异常文字。在会话列表、会话界面等有大量
其他

iOS微信特殊字符保护方案

前言相信大家都遇到过一段特殊文本可以让iOS设备所有app闪退的经历。前段时间大年初一,又出现某个印度语字符引起iOS11系统奔溃。所幸微信客户端做了保护并没有引起太大问题。一般来说,特殊字符闪退是系统漏洞引起,只要更新系统就行。但大部分用户不愿意更新系统,而苹果也不一定第一时间解决问题。另外后台可以拦截恶意文本传递,但对于本地已下发的消息,后台没有办法让它删除。所以客户端还是要做些保护预防特殊字符闪退。方案由于无法事先知道字符串里包含特殊字符,所以只能先让它排版/绘制,看看是否出现问题。做法是,在排版/绘制字符串前,先设置标记位,排版/绘制结束后,移除标记位;一旦发现标记位存在,就意味着这字符串可能有问题,下次就不显示这个字符串:这里有几个问题:有可能在排版/绘制过程中,其它线程crash,导致标记位不能正常移除。所以crash时要判断crash线程是否为排版/绘制线程。究竟crash多少次才能判断这字符串是有问题的。最早做法是crash一次就直接屏蔽,但很多用户反馈,说某些好友昵称无法显示。其实iOS绘制字符串时也会极少概率出现闪退,从而误判。但crash两次才屏蔽的话,如果用户连续收到N条恶意消息,那么至少crash
其他

微信全文搜索优化之路

FTS官网上的例子,都是以单索引表的方式,每一列对应业务的某一个属性,当对应业务发生变化,需要修改索引表的结构。为了解决业务变化而带来的表结构修改问题,微信把业务属性数字化,设计如下的表结构:
2017年10月18日
其他

微信“15。。。。。”背后的故事

三、性能问题如果该组件的性能跟系统相差太多,甚至严重影响帧率,造成用户卡顿,这当然也是不可取的。我们针对这个问题,进行了本地的自动化帧率测试及与系统TextView进行函数间的对比:实验数据:
2017年10月10日
其他

如何利用SOTER,1个版本内完成指纹支付开发?

初始化过程整个应用声明周期内只需要进行一次,用于生成基本配置和检查设备支持情况。你可以选择在Application的onCreate()中,或者在使用SOTER之前进行初始化。
2017年9月28日
其他

为什么要从FMDB迁移到WCDB?

微信移动客户端开发团队官号,分享微信在Android、iOS、Mac、Winphone、Windows等平台的开发经验、前沿技术,以及一些鲜为人知的小故事。
2017年8月16日
其他

微信Android模块化架构重构实践

独立使用BootTask的方式并不十分常见,通常Plugin本身的execute已经够用。不过在一些通用型组件初始化尝试会需要用到,如某些给某个全局使用的预加载资源提前初始化的逻辑。
2017年6月30日
其他

微信移动端数据库组件WCDB系列(三) — WINQ原理篇

背景高效、完整、易用是WCDB的基本原则。前几篇文章分享了WCDB的基本用法和修复工具,接下来将更深入地聊聊WCDB在易用性上的思考和实践。对于各类客户端数据库,似乎都绕不开拼接字符串这一步。即便在Realm这样的NoSQL的数据库中,在进行查询时,也依赖于字符串的语法:别看小小的字符串拼接,带来的麻烦可不小:代码冗余。为了拼接出匹配的SQL语句,业务层往往要写许多胶水代码来format字符串。这些代码冗长且没有什么“营养”。难以查错。对于编译器而言,SQL只是一个字符串。这就意味着即便你只写错了一个字母,也得在代码run起来之后,通过log或断点才能发现错误。倘若SQL所在的代码文件依赖较多,即使改正一个敲错的字母,就得将整个工程重新编译一遍,简直是浪费生命。SQL注入。举一个简单的例子:这是插入消息的SQL。倘若对方发来这样的消息:');DELETE
2017年6月15日
其他

微信移动端数据库组件WCDB系列(二) — 数据库修复三板斧

微信移动客户端开发团队官号,分享微信在Android、iOS、Mac、Winphone、Windows等平台的开发经验、前沿技术,以及一些鲜为人知的小故事。
2017年6月7日
其他

微信移动端数据库组件WCDB系列(一)-iOS基础篇

WCDB_IMPLEMENTATION,用于在类文件中定义绑定到数据库表的类。同时,该宏内实现了WCTTableCoding。因此,开发者无须添加更多的代码来完成WCTTableCoding的接口
2017年5月24日
其他

微信 SQLite 数据库修复实践

校验;每次备份时,从两个备份文件中选出一个进行覆盖。具体怎么选呢?优先选损坏那个备份文件,如果两个都有效,那么就选相对较旧的。这就保证了即使本次写入导致文件损坏,还有另外一份备份可以用。这个做法跟
2017年4月25日
其他

微信Tinker的一切都在这里,包括源码(一)

微信在这里的处理方式是增加Dex反射成功校验,具体通过在框架中埋入某个类的isPatch变量为false。在补丁时,我们自动将这个变量改为true。通过这个变量最终的数值,我们可以知道反射成功与否。
2016年9月24日
其他

微信iOS SQLite源码优化实践

随着微信iOS客户端业务的增长,在数据库上遇到的性能瓶颈也逐渐凸显。在微信的卡顿监控系统上,数据库相关的卡顿不断上升。而在用户侧也逐渐能感知到这种卡顿,尤其是有大量群聊、联系人和消息收发的重度用户。
2016年8月15日
其他

Android N混合编译与对热补丁影响解析

首先非常抱歉Tinker没有按期内测,这主要因为开源的代码需要通过公司内部审核与评测,这项工作大约还需要一个月左右。当前Tinker已经在公司内部开源,我们会努力让它以更完善的姿态与大家见面。
2016年8月4日
其他

微信Android热补丁实践演进之路

传统方式无法让这批用户去安装两个版本。使用补丁技术,我们可以方便的对同一批用户更换补丁版本。在数据统计之路,如何与补丁技术结合的更好,更加精准的控制样本人数与比例,这也是微信当前努力发展的一个方向。
2016年6月24日
其他

基于TLS1.3的微信安全通信协议mmtls介绍

编者的话:近年来网络安全事件层出不穷,确保亿万用户的安全隐私是我们微信义不容辞的责任。当然,我们更要保证用户稳定、快速的聊天体验,所以我们有了mmtls。文章干货满满,建议大家点击阅读全文,仔细品味!一、背景
其他

关于Android N的那些事

N上,Google重提了这个接口,并进行了大规模的强化。今后,如果有需要后台处理的数据、或者特定情况的后台处理。举个例子,如果你需要在用户充电并且不在数据网络的时候处理一些逻辑,你就可以这样:
2016年4月26日
其他

Android内存优化杂谈

Thread)。而在三星等一些手机,系统会缓存最后一个Activity,所以在微信,我们采取了更严格的检测模式,即泄露三次确认以及经过5个新建的Activity,确保不是由于系统缓存的原因造成。
2015年12月15日
其他

安装包立减1M--微信Android资源混淆打包工具

最简单的方法,我们按照Proguard的做法,直接在源码级别修改,将代码以及xml的R.string.name中替换到R.string.a,icon.png重命名为a.png
2015年10月12日