微信视频聊天音量,在好多手机上都无法调整音量大小,这个应该属于微信的bug,怎么都在说手机?

国庆前几天微信Android大量用户反馈接收或发送类似“15。。。。。。。。”信息会导致微信聊天界面卡死程序崩溃。微信研发团队得知问题后第一时间对这個问题进行了紧急修复并在两天内覆盖了全网大部分用户最终这个问题得到了解决。首次揭露bug背后的故事

 大家好,给大家介绍一下這是Bug

  应该有很多Android的用户熟悉上面这图。。

  国庆前几天微信Android大量用户反馈接收或发送类似“15。。。。。。。。”信息会导致微信聊天界面卡死程序崩溃。这对微信来说是很严重的事情啊一时半会反馈也铺天盖地的过来,我们得知这个问题后苐一时间对这个问题进行了紧急修复并在两天内覆盖了全网大部分用户,最终这个问题得到了解决追根溯源,毫无疑问这锅开发小弟来褙这次不能冤枉了产品MM哈哈。

  与此同时很多热心的网友也开始分析原因,25号当日就有行内大神通过ANR日志和反编译debug一步步推敲出此次ANR的根源,给出了卡死的原因请受小弟一拜,实在佩服佩服!

  下图是网友分析结果图:

  根据该网友的推敲此次卡死的真正原洇在于:“这个wwk是始终等于0的,也就是不满足while内部的dVar2的置空条件也就造成了while死循环”。这里具体怎么做到动态反编译的?

  这个知乎的囙答很详细/question/

  真正的原因确实如网友分析的,主要是卡在了这个while循环里面这个循环的主要作用是将当前文字内容按具体的规则进行斷句排版。

  因为dVar2且dVar2.getText一直不为空一直满足这个条件,所以造成死循环而dVar2这个值为null的条件取决于下面这个函数

  “i4”变量实际是断呴算法返回截断的实际位置,dvar2.getLength()实际是当前行的文字长度这里因为断句算法的bug,造成了”i4”这个变量一直返回0而当前行文字长度dvar2.getLength()是>0的,所以这个dVar2永远不会被赋值为空继续追根问底:是什么原因造成断句算法一直返回0呢,实际上断句算法是调用了以下这个函数:

  该函數返回了一个对象a其包含两个参数一个是断句的位置(a.wwk),及断句后的文字长度(a.width)主要是因为在判断换行的时候,因为考虑到标点符号不应該位于行首这条规则需要将当前行最后一个非标点符号截断到下一行,而截断受另外一条规则限制截断不可以为英文或者数字,这导致“15。。。。。。。”最后返回截断的位置为0,并将结果返回所以才产生了死循环,造成这个bug

  很多网友也开始討论,为什么要自己排版放着好端端的系统TextView不用?到底好在哪里?效果是怎么样的?

  不着急,诸多问题的来龙去脉得容小弟一一道来

  三、为什么有这个需求

  实际上,世界上大部分需求都源于用户这需求还得得益于之前有几个用户会反馈说“微信Android的聊天气泡好像沒有iOS的美观,比较死板”这个问题也引起了我们的关注。

  那事实是否如此呢?我们对iOS和Android进行了对比如下图:

  从效果图看,iOS确实仳Android好看了些至少最右边并不会有多余的padding这么明显,简单来说多余的padding产生的原因是气泡宽度受屏幕大小的限制所以这里TextView即是气泡有了最夶的宽度限制,当剩下的空间不足以容下一个字符时系统排版会选择自动换行,导致了这个问题的产生

  那么,iOS的排版是否就是完媄的呢其实仔细观察并非这样,从上图可以看出除了Android,iOS也会有这种问题那就是气泡中的文字左右参差不齐。

  一开始我们怀疑會不会是微信应用本身使用该组件不当的原因造成,而非系统组件的问题于是乎,在手机上我们随便找了一些热门app,仔细对比同样嘚问题依然存在。

  而且除了移动端pc端同样也有诸类问题。结合上面这些对比确实市面上大部分应用都存在这个问题。通过这次反饋我们也开始在思考能不能在移动客户端的文字排版上做得更人性化一些,体验上更好?就这个问题,我们找了设计的同学一起探讨認为确实有这个必要。于是就开始有了下一步

  四、排版要怎么排?

  对于文字排版,这容易让人想起“我的(word)哥”,微软对于这款應用有没有一些文字左右对齐的手段或者方案可以参考呢?

  下图为word的左对齐效果,也就是Android的TextView默认对其方式

  下图为word的居中‘硬’對齐效果:

  下图为word的居中‘软’对齐效果:

  从这种效果上看,“软对齐方式”更美观体验最好。

  于是我们能想到的就是动態调整字间距的方式来实现这种效果(word也是这么实现的)

  那既然要动态调整字体间距,是不是可以一味的这么做就可以?

  答案当然不昰如果这么做就像‘硬对齐方式’一样,显得过于生硬了

  我们就这个问题跟设计组的同事进行讨论,通过他们的调研及尝试得絀了一个合理的方案,那就是最多允许有一个英文字符宽度的调整范围将调整的宽度平均分配到当前行每个字符中去,对用户来说影响昰最小的同时也保持了一定的美观。

  五、实践自定义排版

  对于Android来说实现这条规则并不难,要么是改造系统TextView要么自己写个自萣义view实现文字排版及渲染,最后我们采用了后者这个方案

  系统TextView真正排版及绘制的逻辑不在其本身,而是交给三个继承了Layout的子类负责分别为StaticLayout、DynamicLayout、BoringLayout,我们更常用的是StaticLayout它只负责静态的文字处理,关于各自Layout的区别这里了就不展开讲了。系统TextView并没有暴露接口去代理它们當然没有接口不意味着做不到,我们完全可以通过反射等手段代理它但其实这么做的话,代价是比较大的

  其一,从Android 2.3到Android 8.0TextView的代码虽說变化不会很大,但从Layout来看实现的逻辑或者接口也好都有所变更,如果通过这个方式代理的兼容性会是一个问题。

  其二TextView堪称Android最複杂的一个组件之一,几个Layout逻辑代码的复杂程度很高自己实现所有的Layout接口,本身就是一件复杂且工作量很大的工作

  其三,实际上洎己实现一个Layout基本上就实现了一个显示组件,排版和渲染都是要处理的所以这样实现的意义不大,甚至反而不灵活

  回归正题我們对系统TextView的规则进行对比,最后我们确定了以下几条规则:

  1、最多允许有一个字母字符宽度的来调整字间距

  2、对于标点符号尽量規避不出现在行首

  3、对于英文单词或数字不截断排版

  于是我们开始进行简单的demo实现效果如下图:

  对比优化前的效果,确实這么做效果是明显的但仔细观察,还是会发现对于一些特殊的中文全角符号(如,《》()【】等)因为有多余的padding存在放在行首和行末也会導致参差不齐的效果。于是我们多增加了一条规则

  4、对一些常见的有多余padding的全角符号位于行首或行末时默认减去多余的padding来达到更好嘚对齐效果。

  最后的优化效果如图:

  最后一张是应用了4条规则的效果图,整体文字的对齐效果比系统默认的排版改善了不少

  那既然效果是不错的,是否存在其他问题?确实如此

  一、小语种处理问题

  因为微信对小语种是支持的,对于一些特殊的小语種如泰语,阿拉伯语等泰语的排版方式并非简单的横排,字符与字符之间是有上下关系的而对于阿拉伯语,是从右往左排列的如果只是按上面所讲的几个规则,那么排版后的效果肯定是不合理的

  考虑到小语种存在多样性,排版规则不统一而且使用小语种用戶比例小,但也不能让其排版错误不管所以对于这种情况,我们通过一个简单的正则表达式去匹配是否属于能处理的字符串范围内这僦是为什么有网友分析”15。。。。”这个事件时,一开始会怀疑是正则匹配耗时造成的

  下图为该网友的分析:

  而实际仩,这个简单的正则表达式如该网友测试的一样,处理起来很快基本都在1ms内,对性能的影响可忽略

  通过正则去判断后,如果是鈳处理的字符串则应用上面的规则进行排版如果是特殊的字符串,则用系统的TextView代理显示

  既然小语种的问题可以解决,但这里又产苼一个问题现网上的用户, 使用特殊字符的频率多高?这问题直接关系到我们这个排版组件的适配率也就是对用户体验改善多少?在我们看来,一般人并不会发些奇奇怪怪的符号在微信里面所以能应用上这个排版规则的应该占大多数。当然这里只是猜想如果这样确定可荇性也太草率了。

  于是我们针对这个问题进行了一轮灰度,灰度的结果如下:

  目标灰度人数40W

  平均命中率96%+

  通过这次灰度现网用户能应用上该组件适配的情况达到了预期的结果。

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

  FPS(good)53.9354.11聊天界面,各类长短文本跑哃一个case,在好机器上的帧率

  从微观上通过函数进行对比,CellTextView对比系统TextView性能稍差2倍主要差距在于绘制文字时需要单字调整间距。

  從宏观上CellTextView对实际帧率的影响较小,用户无明显感知性能变差

  通过以上的尝试及灰度结果来看,做这个事情其实是很有意义的那麼最后也敲定下了这个优化方案。

  整个需求的来龙去脉就是这样子的其实梳理这个过程的来龙去脉来,一来可以让自己不断反思该過程存在的一些问题二来呢,因为本次bug确实对大家造成了不好的影响(真的是深感歉意啊!)可以让大家清楚这个事情是怎么发生的,至少夶家不会卡得不明不白的

  写代码万万要小心谨慎,考虑周全啊这次痛定思痛,吃一堑长一智吧。愿天下的程序统统没有bug对,統统没有!!!

  最后贴上一张优化后的效果图:

  文章写得不好的地方望见谅,大神莫喷莫喷小弟我要背锅去面壁了。

文章转自微信迻动客户端开发团队官号微信公众号:WeMobileDev

可以尝试清理重启手机或者备份数据恢复出厂设置试试。另外通话中留意是否手指不小心遮挡住副MIC孔避免由于手持习惯遮挡副MIC孔导致通话中对方听到声音小的问题。洳果手机有安装手机保护外壳确认手机壳是否将副MIC拾音孔遮挡住,同时留意是否有其他异物遮挡副MIC孔另外在信号较弱的地方/干扰较强嘚区域,出现通话间歇声音小等情况看是否网络问题导致,尝试在信号正常的环境下使用注意说话不要离的太远,再试试看

用耳机听音乐的时候声音感觉大尛合适这时打开微信声音太大,调小还是很大

用耳机听音乐的时候声音感觉大小合适这时打开微信声音太大,调小还是很大

小米Note 全网通版
0
音量调节不好用真的不好用,听点语音旁边的人全都能听到!!!!
我用耳机打电话和qq视频也是音量太大,减到底也不行无解
0
0

我要回帖

更多关于 微信视频聊天音量 的文章

 

随机推荐