这一次,卡98%问题终于解决了
在新项目中,往往会有一些瓶颈的问题阻碍项目进程,如鲠在喉。而腾讯手游助手项目中,启动卡98%的问题就属于这种问题。幸运的是团队最终解决了此问题,现在回过头来总结与思考一下,看看有什么收获和改进的地方。
1.背景
腾讯手游助手是基于virtualbox二次开发的产品,在virtualbox的基础上做一层UI,封装一些常用的操作,针对游戏设置一些默认虚拟按键,让玩家可以愉快的在电脑上玩手游,而不用操心繁琐的设置问题。
(图一) 模拟器模块结构
在项目初期,陆续接到一些用户的反馈,加载模拟器卡在98%。界面表现如下图:
(图二)助手启动卡98%的表现
翻看BBS的反馈信息可以看到,15年11月份就已经开始暴露该问题:
(图三) BBS卡98%反馈
2. 分析
翻看UI中的相应代码,梳理启动流程如下:
(图四)模拟器主要启动流程
1.CheckEnvironment()检查环境
检查上次是否发生崩溃
检测下COM和驱动是否正常,如果有则尝试修复
检测CPU、CPU是否支持VT、VT是否开启
检测OPENGL渲染是否OK
设置当前显示颜色为32位色
2.StartVM()准备虚拟机
检查OPENGL版本、判断是否强制使用DX模式
调整虚拟机内存大小
调整虚拟机CPU核数
3.StartVMInternal()启动虚拟机
设置虚拟机的分辨率
设置虚拟机的DPI
设置虚拟机开启hardware_opengl
设置IMEI
设置虚拟机代理
设置端口转发
调用启动模拟器的命令
4.Init_devices()初始化各种设备。
这一步会创建多个通讯线程来与android内部通讯,只要有线程能通讯成功,就说明模拟器成功启动且能正常控制模拟器。
启动本地OPENGL渲染,创建渲染窗口
启动输入通讯线程
启动控制通讯线程
启动传感器通讯线程
正常流程下,UI调起一些Tbox(即virtual的修改版)命令行进行设置,然后启动ROM,ROM成功启动后,android内的launch进程会发送一个”connected”消息,UI收到后启动成功。UI通过建立socket来与Tbox来通讯,而Tbox通过虚拟的PCI设备来与ROM通讯。而异常流程下,启动ROM后,UI一直没有收到一个成功连接的消息。所以该问题可能原因只有两种:
1、ROM压根未启动成功
2、ROM启动了,但是通讯失败了。
明确了问题原因后,似乎很容易排查了,但跟进过程并不是那么顺利。
3.跟进
1.机器配置过低
15年11月。发现一些用户的ROM启动不了,共性是机器配置都不高。之后查到主要是内存影响虚拟机的启动,所以解决方案是在安装程序中增加对机器内存的检查,低于2G的不允许安装。
2.Tbox进程卡死
15年11月。跟进了多个启动卡98%的用户发现,如果模拟器非正常退出,TBoxManage.exe、TBoxSVC.exe、TBoxHeadless.exe(tbox进程)三个进程可能会卡死,再次启动模拟器,所依赖的进程卡死,导致启动不成功。解决方案很简单:启动前强制结束三个进程。
3.第三方注入
15年12月。又发现一些用户卡98%的共性是都安装了迅雷网游加速器。进一步定位发现该软件的XLaccLSP.dll会注入到所有进程,包括模拟器的TBoxHeadless.exe进程,而导致socket建立失败。解决办法是防止这个模块的注入。
4.LSP服务等导致socket不可用
16年上半年。仍陆续接到很多反馈,又跟进多个用户,发现用户都是由于建立socket失败而导致的启动卡98%,原因包括:
a) lsp导致断网、
b) VPN问题。
c) 防火墙问题。
决定使用管道(pipe)来取代socket来通讯。由于改动涉及底层,改动量大,加上其它业务需要较多,排期至7月份才上线。
5.新ROM的bug
16年8月份。原本以为卡98%能够通过管道版本彻底解决,没想到新版本也仍有不少用户反馈。继续跟用户。发现用户都是单独启动tbox也无法进入至桌面。进一步定位,发现是VDI(也就是ROM)文件损坏而导致。而后在官方论坛上找到原来是由于4.4.2的系统解析损坏的XML异常而导致,而上半年刚好我们由4.2.2的系统升级至4.4.2,打上官方补丁后终于得以解决。至此卡98%的问题终于得以完全解决。
4.反思
1.不要太过相信第三方组件。
对第三方组件过度依赖,太相信第三方组件往往会踩大坑,使用第三方组件一方面需要做全方面深入了解,另一方面是做一些必要的容错或者规避机制。
2.关键信息应该上报
虽然该问题严重程度很高,但该问题只在极少数用户的环境下出现,测试环境无法重现,所以进展非常缓慢。更重要的是,该问题的影响范围我们无法评估。仅仅靠反馈量来驱动问题的解决是非常不靠谱的,用户很有可能试用一次后就流失了。所以,在产品初期就应整理关键路径的数据,并上报给后台,出现问题后能及时评估关键路径上的异常影响范围,及时推进问题的解决。
3.异常原因应尽量细化
首先是产品表现太笼统了,增加了定位问题的成本。只要是未能成功与虚拟机通信,都表现为启动卡98%。另外,一些问题也值得我们思考:
a) 是否可以通过技术手段细化不能通讯的原因呢?
b) 是否能提前检测是VM的自身问题还是通讯的问题?
c) 是否可以提前细化socket建立连接异常的原因?
d) ...
在这种疑难疑难的定位过程中,出现后尽量把异常细化,不论是产品表现还是日志上数据上报,以便在出现问题时能快速而精确的定位问题。
原文链接:
http://tmq.qq.com/2016/11/%E8%BF%99%E4%B8%80%E6%AC%A1%EF%BC%8C%E5%8D%A198%E9%97%AE%E9%A2%98%E7%BB%88%E4%BA%8E%E8%A7%A3%E5%86%B3%E4%BA%86/
TMQ(腾讯移动品质中心)是腾讯最早专注在移动APP测试的团队
我们专注于移动测试技术精华,饱含腾讯多款亿级APP的品质秘密,文章皆独家原创,我们不谈虚的,只谈干货!
扫码关注我们
扫一扫 关注TMQ
精彩分享不断
这一次,卡98%问题终于解决了相关推荐
- cf修复服务器,CF:“卡顿”问题终于得到重视!新版本宣布修复,玩家这下开心了...
原标题:CF:"卡顿"问题终于得到重视!新版本宣布修复,玩家这下开心了 相信各位玩家都知道,CF是一款非常经典的射击类端游,早在许久之前的2008年就正式上线,一直运营至今,已经陪 ...
- 【最新】M1芯片Mac安装PS2021/2020卡在启动页解决教程下载方法
苹果在近期更新了11.3系统,终于解决PS的权限问题,很多用户可能都看到了M1芯片Mac安装PS2020和PS2021的安装更新,并且都安装了,但是很多M1芯片用户安装后都相继的出现了打开PS 一直卡 ...
- 华为智慧屏服务器无响应,华为智慧屏如何安装第三方APP,全网吐槽的BUG终于解决了!...
原标题:华为智慧屏如何安装第三方APP,全网吐槽的BUG终于解决了! 华为智慧屏虽然性价比高,但不能安装第三方软件一直是个用户难以接受的 BUG ,如今荣耀智慧屏.华为智慧屏的鸿蒙系统终于开放了软件安 ...
- python导入openpyxl报错问题,终于解决啦
python导入openpyxl报错问题,终于解决啦 参考文章: (1)python导入openpyxl报错问题,终于解决啦 (2)https://www.cnblogs.com/guotang/p/ ...
- Ubuntu更新源问题终于解决了
Ubuntu更新源问题终于解决了 参考文章: (1)Ubuntu更新源问题终于解决了 (2)https://www.cnblogs.com/webnote/p/5767853.html 备忘一下.
- 熬了一个通宵,终于解决了所有的事情,下线,睡觉
熬了一个通宵,终于解决了所有的事情,下线,睡觉 现在时间2009年12月30日4:56:55. 完成移动邮件初步内容.打包上传,更新到SVN 完成网络工程分享网站(http://www.the520. ...
- git pull 卡在 Unpacking objects 解决方法
git pull 卡在 Unpacking objects 解决方法 在拉取大型二进制对象(如Adobe Illustrator文件等)时,可能会使整个拉取/推送/克隆过程陷入困境. 如果你仓库没有过 ...
- qq饥荒联机版服务器没有响应,饥荒联机版专用服务器卡顿原因及解决方法汇总...
饥荒联机版中自己的专用服务器会经常卡顿,那么是什么原因造成的呢?相信很多玩家都不太了解,下面带给大家的是饥荒联机版专用服务器卡顿原因汇总. 饥荒联机版专用服务器卡顿原因汇总 ①猪人兔人鱼人房 卡顿等级 ...
- 开弹幕卡顿的原因_QQ飞车手游卡顿严重怎么解决,来看看这个安卓手游卡顿解决方法!...
这两天真的被QQ飞车气到了,要么是网络延迟,要么网络异常,卡顿太严重了,不禁感叹QQ飞车手游卡顿严重就不要玩超能竞速赛,连怎么输的都不知道,但仔细一想这是因为网络延迟吗,还是超级起步也有快慢?怎么感觉 ...
最新文章
- 【OpenCV的C++教程3】掩膜操作的细节
- Linux C/C++多线程pthread实例
- 移动pc常用Meta标签
- 生命周期 用户可以操作dom_当面试官问:能否介绍下Vue生命周期时,该如何回答...
- vim替换字符(包括行首行尾添加字符串)
- 得到条形码的校验位函数
- 微软亚洲研究院公布12项顶级研发成果(组图)
- 如何判断某个类是否有某个注解?
- 分享2个ICON资源链接
- 图片干扰背景处理,简单易懂
- 串口协议和RS-232标准,RS232电平与TTL电平的区别,以及USB/TTL转232“模块(CH340芯片为例)的工作原理
- 【ARM 嵌入式 C 入门及渐进 2 -- 向上取整向下取整 linux roundup/round_up】
- 【Volume X has invalid topology for mapped brick meshing】
- 周报,当前是第几周 ?
- 测试光流传感器速度特性
- 流式数据武装零售业,打响“降维”反击战!
- [re]符号执行一把梭:2020网鼎杯青龙组re_signal_wp
- JavaSE——StringBuffer与StringBuilder拼接字符串详细解释
- Python——生成激活码并存入MySQL
- catia草图里写字_请问CATIA如何在曲面上写字,麻烦高手解答详细步骤?
热门文章
- uniapp APP消息推送方案
- 解决PHP7中微信(小程序)mcrypt_module_open() 无法使用的解决方法
- 乔治亚大学计算机科学,乔治亚大学的计算机科学排名,真得稳重考察
- STM32F407 HAL库 ADC笔记
- 计算机进程管理与虚拟机实验答案,实验四虚拟机实验报告解读.doc
- [TravelNotes] WC 2017 THUWC 2017 游记
- 算法系列之二十:计算中国农历(一)
- Wifite.py 修正版脚本代码
- 电脑右击新建没有Word、Excel怎么办
- 一元三次方程的求解(二分法)