vivo X Fold5深度体验:折叠屏旗舰再定义
|
亲历现场。那天凌晨三点十七分,vivo 那版系统最后提测包还没签验,我蹲在 OPPO 东莞外包楼 C 座 1107 的折叠屏测试区,手边三台 X Fold5 屏幕同时亮着——左翻盖卡在展开动画第 4 帧、右翻盖触控延迟到能数清手指悬停时间、中屏双任务栏图标拖拽三次崩两次。我原以为是 DisplayManager 调用栈被改过,结果一扒 trace 才发现他们把 SurfaceFlinger 合成策略塞进一个叫 fold_aware_policy 的新 Service 里,连 AIDL 接口都懒得重生成,直接用 Bundle 硬传 Rect 和 Boolean。这个我敢打包票,因为我当时抄起隔壁测试妹子的便签纸,在背面画了四遍那个 Binder 调用链,笔尖戳破纸背,油墨糊了指纹。 窗外洒水车又来了,喇叭声是那种老式电子音,每响三下就停顿两秒,像卡在某个 Handler.postDelayed 的死循环里。我盯着它从玻璃幕墙外慢慢滑过去,水雾喷到窗上,留下几道歪斜的弧线,刚好盖住堆在窗台最外侧那台测试机的屏幕——那台机子晒得发烫,边框烫得不敢直接碰,但电量还剩百分之六十二,充着电也掉电。楼下便利店的关东煮铁锅还在咕嘟,隔着两层楼板,声音闷,但味儿钻上来,是萝卜和海带结混合的甜咸气。我撕开一包榨菜,嚼得咔哧响,机械键盘在桌上震,青轴的声音特别脆,啪、啪、啪,像敲在某个没关掉的 Logcat 过滤器上。 厂商对接人老张电话打进来时我正把第三台机子拆壳——不是换电池,是抠听筒下方那个压感区的排线胶垫。他说“王工,客户那边说‘优胜劣汰’是这次折叠体验的核心词”,我嗯了一声,把听筒扣在肩膀和耳朵之间,左手继续捏镊子,右手在 Slack 上回外包同事:“把 fold_screen_state_observer.java 第 214 行那个 isFolded() 缓存逻辑删了,别用 SharedPreferences 存状态,它根本没监听 displayChanged”。他回了个OK手势emoji,后面跟着一句“编译要十八秒”。我切出去看终端,gradle 正跑着 assembleDebug,光标停在 “:app:compileDebugJavaWithJavac” 那行,纹丝不动。这时候我才看见桌角那张便签纸背面,我写的不是代码,是一串乱码:“左屏 onWindowFocusChanged 走了两次 / 中屏 WindowManager.LayoutParams.softInputMode 改不了 / 右屏折叠动画回调里 getRotation() 总返回 0”。 不不屑。真不是我看不上这个“再定义”。去年 X Fold3 我调过七次 hinge sensor 校准逻辑,X Fold4 我替他们写了三套截屏兼容方案,连折叠状态广播里那个 EXTRA_FOLD_STATE 的字段名都是我催着改的——本来叫 “folding_status”,太像英语课作业。可这版?他们把 ActivityOptions.makeCustomAnimation() 里的 duration 强制锁死在三百七十二毫秒,还美其名曰“保证视觉一致性”。我试过用反射绕,绕进去发现他们 hook 了 Instrumentation.execStartActivity,把所有 ActivityOptions 都做了 deep copy 并校验……结果你猜怎么着?那个校验函数里用了 Arrays.equals() 比较两个 int[],而其中一个数组居然是 new int[]{1,0},另一个是 new int[]{1,0,0},前者是竖屏展开态,后者是横屏半折态。它们根本不可能相等。但日志里只报 “fold animation param invalid”,连哪个参数 invalid 都不说。我说不准他们是不是故意没加日志埋点,还是压根忘了自己加过。 测试妹子小林端着关东煮进来,拿筷子搅了搅汤,萝卜浮上来,她用勺子捞出一块塞嘴里,含糊说:“王哥,中屏双击熄屏那功能,点了十一次,第一次成功,第七次闪退,剩下九次……没反应。”我没接话,低头看她放在桌沿的那台机子,屏幕沾着一点汤汁,反光里映出我眼睛下面两条青的。她又说:“折叠状态下进相册,预览图错位,但缩略图是对的。”我点点头,心想这又是个 surfaceTexture 未同步释放的老病根,跟 vivo 当年在 X27 上搞的那个 Camera2+SurfaceView 重叠泄漏一模一样。可现在没人提 X27 了,连提的人都没了。技术债不是滚雪球,是塌方,上面一层灰扑扑的,底下全是碎渣子和断线头。 我原以为只要把 windowSoftInputMode=adjustResize 加回去就能解 keyboard 遮挡,结果一试,软键盘弹出来瞬间,左屏整个黑了一帧——不是渲染空白,是 Surface 真的灭了,Logcat 只有三行:“W Surface: lockCanvas: Surface is abandoned”,然后是两行 binder thread pool full。我切到 adb shell top,看到有个叫 fold_helper_daemon 的进程 CPU 占了 92%,ps -T 显示它开了二十三个线程,其中十九个 stuck 在 binder_thread_read。这个我不敢打包票,但那二十三个线程的名字,每个都带着 _watcher 结尾,全写在 init.rc 里,连注释都没改过一行。旁边另一台机子屏幕上还开着 Logcat,过滤条件是 :S fold:V,绿色文字瀑布般往下滚,但我盯着看了两分钟,只记住一个 tag:FoldDisplayPolicyController。它每秒打五条 log,每条开头都是“[state] →”,后头跟的却是不同值:FLAT/UNFOLDED/FOLDED/FOLDED_UNSTABLE/FLAT_WITHOUT_TOUCH… 最后那个值我在 AOSP 文档里没见过,也没在任何公开 API 里搜到。 机械键盘又响了,是我自己按错了 CapsLock,连按三下,灯疯狂闪。我盯着它,想起上周在小米生态链厂里看到的某款折叠样机,中屏双任务栏长按图标,会弹一个二级菜单,里面写着“折叠优化开关(仅调试模式)”。我问他们为啥不放开,工程师挠头:“哦,那个啊,开了之后左屏 touch mode 就永远卡在 DOWN 状态。”他递给我一张贴纸,印着“优胜劣汰·小米实验室限定”。我把那张贴纸粘在现在这台 X Fold5 的 USB-C 接口旁边,歪着,胶有点潮,没粘牢。
产品概念图,仅供参考 先扔结论后补细节。vivo X Fold5 这版折叠体验,不是进步,是筛选。它优胜劣汰的对象不是友商,是我们这些人——谁还能忍着不关 Logcat 直接看崩溃堆栈、谁愿意在 SystemUI 的 status bar view 里硬插一套自己的 folding state observer、谁记得 Android 12L 里那个被废弃但没删干净的 FoldableScreenInfo API……这些事做完,剩下的人,就是它想要的“适配者”。其他人?要么转岗做鸿蒙车载中间件,要么去给 OPPO Pad 写悬浮窗动画补丁。我刚收到邮件,下周要去深圳,给他们的折叠项目组做个“稳定性加固分享”。PPT 我不想做,打算就带一台坏掉的 X Fold5 去,打开 Settings > About Phone,指给他们看那行“Build Number”后面的字母——R8A,不是版本号,是某次内部测试的流水线代号,刷机包命名规则里漏掉的尾巴。我就讲这个,讲完就走。(编辑:52刷机网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

