Xiaomi MIX Flip 2评测:小折叠新标杆,性能强、真香
|
亲历现场。那天凌晨三点十七分,我盯着测试机堆在窗台晒到发烫的那堆MIX Flip 2——四台,三台亮着屏保,一台黑着但还在跑monkey,USB线接得歪七扭八像快断气的蚯蚓。楼下便利店关东煮的蒸汽正从卷帘门缝里挤出来,一缕、两缕,全糊在玻璃上,我擦了三次才看清那台没亮的机器右下角其实闪着红点:Battery HAL service timeout。我原以为是thermal throttling误报,结果adb shell dumpsys battery一看,level=92,health=good,status=charging——但它就是不回那个status callback。我敢打包票,这行日志我抄过三百七十二遍,每一遍都比上一遍多一行空格。 编译卡在aapt2 link stage等了十八秒,窗外洒水车经过,水柱砸在柏油路上的声音特别沉,像谁把整桶凉水泼进散热口。我手欠点开Logcat过滤“flip”,刷出三百多条DisplayManagerService: updateFoldState: isFullyFolded=false, isHalfFolded=true, isFlat=false……全是true/false绕口令。厂商对接人老张微信弹出来:“小王哥,折叠态UI动效延迟算不算P0?”我没回。他接着发了个截图,上面标着“主屏横屏展开时副屏状态栏残留1px阴影”,底下加粗红字:“用户录屏反馈”。我截图发过去,只回了句:“你让他再录一遍,用默认相机,别开美颜。”——其实我知道不是美颜的事,是SurfaceFlinger在双屏合成时丢了buffer acquire fence的timeout handling,但这时候说这个等于往自己脸上贴“这锅我背”。 测试妹子小林坐我斜后方,机械键盘声咔哒咔哒响,青轴,带灯,声音频率和我耳机里《加州旅馆》前奏完全错拍。她突然喊我:“王哥!FoldableActivityStackController里onConfigurationChanged调了两次!”我转头看她屏幕,确实,trace里showWindow调了两遍,第一次调完mIsResumed还是false,第二次才true。我摸出工位抽屉里那包开封三天的薯片,捏碎一块含嘴里,咸得发苦。这个我敢打包票:不是我们代码漏判了fold state,是那版系统在resume流程里偷偷dispatch了两次onConfigurationChanged——我扒过system_server堆栈,第一遍走的是ActivityThread.handleResumeActivity,第二遍走的是FoldableDisplayAdapter$1.onDisplayStateChanged。名字都不一样,但都进了同一个activity stack controller。你说气不气? 我原以为只要避开setRequestedOrientation()就能躲过折叠动画撕裂,结果真机一跑,副屏左上角图标抖动频率和CPU温度曲线几乎重合。后来才发现是WindowManagerService在reportResized时把displayId搞混了——副屏本该是DISPLAY_ID_FOLDABLE_SECONDARY,它硬塞成DISPLAY_ID_DEFAULT。这事说起来荒唐,但翻log的时候,我就坐在那儿,看着那个错写的displayId在十多万行日志里一闪而过,像一根鱼刺卡在喉咙里不上不下。旁边同事老周凑过来,伸手在我键盘上敲了两下ESC退出adb shell,手指甲缝里还沾着前天修MIUI相册OOM时蹭的胶印。 其实最烦的不是bug本身。是那天下午两点,外包组开会,大老板视频连线,背后PPT写着“Xiaomi MIX Flip 2评测:小折叠新标杆,性能强、真香”,底下加粗标红:“优胜劣汰”。我盯着那四个字看了四分钟,没说话。老张倒是一拍桌子:“咱们适配进度必须对标友商!他们一周交demo,咱们不能拖!”我低头剥橘子,剥得特别慢,一瓣一瓣掰开,汁水溅到logcat窗口上,把“FATAL EXCEPTION”那行字洇得模糊不清。我说不准这是第几轮迭代里被砍掉的兼容逻辑——上个月刚干掉对MiuiFreeformMode的hook,上上月删了FoldableGestureHandler的fallback path,再往前……记不清了,反正每删一次,系统就更“轻”一点,适配就更“顺”一点,用户遇到的黑屏概率就更高一点。但没人问这个概率是多少,也没人要数据,只要一句“能过CQC就行”。 中午外卖盒放在桌上忘了拆,米饭坨成一团,酱油渗进塑料盖缝里。我打开AS,新建个空白工程,就建一个Activity,啥也不写,就onCreate里打一行log:“I am alive”。然后run——居然真起来了,横竖折都正常。我盯着那个空白白屏看了半分钟,突然笑了。原来最难的从来不是让功能跑起来,是让所有不该起的功能全都死透。比如那个永远不回调的Battery HAL service;比如SurfaceFlinger偷偷吃掉的buffer fence;比如WindowManager里那个永远填错的displayId。它们没死,只是藏得更深了,等下一个Deadline前夜,在某个用户锁屏瞬间,或者充电到87%的时候,轻轻咬一口。
产品概念图,仅供参考 我打算明天把那段重复三百七十二次的日志改成异步callback+timeout handler重试三遍,第四次直接抛exception并dump thread。不为修bug,就为下次抓log时能在堆栈里一眼认出它——毕竟,连error都懒得报的bug,才是真的赢麻了。 (编辑:52刷机网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

