iPhone 17e抢先看:性能飞跃,亮点全揭秘
|
亲历现场。那天凌晨三点十七分,我盯着Build Farm跑完最后一台测试机的log,手指悬在键盘上没动——不是卡住了,是看见“iPhone 17e抢先看:性能飞跃,亮点全揭秘”这标题弹出来,手就软了。厂商对接人老周微信弹窗闪三下,语音转文字显示:“王工你先别睡,那版系统刚发,我们把‘优胜劣汰’四个字塞进systemui启动页了,但得过掉vendor overlay冲突。”他后面还跟了个笑脸,笑得我太阳穴突突跳。 我原以为只是Overlay资源ID重叠,结果切到vendor分区一扒,发现他们把framework-res.apk里整套color-state-list全替成动态生成的XML,靠一个叫DeviceConfigHelper的类实时inject——这玩意儿我敢打包票,在那版系统上根本没注册ContentObserver。编译等待时窗外洒水车经过,喷头卡顿三秒、滋一声、又滋一声,节奏和我键盘上Caps Lock灯闪得一模一样。我伸手按灭灯,但没用,它自己又亮了。 测试妹子小陈蹲在窗台边擦第七台测试机的屏,说这堆机子在阳光下晒了快四十分钟,USB-C口摸着发烫。她拿测温枪点了点其中一台,三十八度二,随口补了句:“比我的额头凉点儿。”我没接话,只盯着adb logcat里反复刷的W/PackageManager: Package com.android.systemui has no permissions, skipping. 她擦完第三台,把抹布团成球扔进废纸篓,正中。那声音像一块板砖落进铁桶。 而最关键的不是这个。是那个所谓“优胜劣汰”的实现逻辑——他们用DisplayManager.getDisplay()判primary display,再根据display.getMetrics().densityDpi分三档加载不同layout,美其名曰“自适应淘汰低清方案”。可问题是,DisplayMetrics.densityDpi在那版系统里,锁屏状态下返回的是-1。不是零,不是默认值,是负一。这个我说不准是不是故意埋的坑,但我知道——只要锁屏时触发一次SystemUI重启,整个overlay就会fallback到res/layout-sw360dp,然后所有文字全部叠成一团墨点,连字体描边都糊成酱色。楼下便利店的关东煮刚好这时候开始炖萝卜,味噌汤底沸腾声隔着三层楼钻上来,咕嘟、咕嘟、停顿两秒、再咕嘟。 桌上的机械键盘声一直没停。青轴,脆,敲空格键带回弹咔哒声。我删掉第四次重写的onDisplayChanged监听器,重新建了个临时分支,名字起得挺丧:dont_trust_display_metrics_at_all。提交信息写:“防抖太狠,直接削掉判断层”。其实更真实的原因是,我试了十三种hook方式,只有干掉整个判断链才能让那个‘优胜劣汰’按钮不飘到状态栏底下——它现在浮在电量图标右上角,像一颗长歪的痣。
产品概念图,仅供参考 老周又发来一条:“厂商说,‘优胜劣汰’必须体现在开机动画第二帧,不然PM过不了。”我截图发过去,红框圈住开机动画第392帧(那个‘汰’字笔画末梢少了一捺),下面写:“这字是你们设计师手绘的吧?SVG转VectorDrawable的时候pathData被裁了半截。”他回:“……设计师说没问题,他们iPad Pro上看着很顺。”我没回。因为我知道,iPad Pro上跑的是另一套surfaceflinger渲染路径,连SurfaceFlinger的layer stack都压根不一样。这个我敢打包票。 但我也真不知道,为什么同一个Vendor overlay,在三款同芯片平台的Oppo、vivo、realme测试机上,只有一台会触发SELinux avc denial报错——偏偏是那台最旧的,2022年出厂的X80 Pro工程样机。我查了sepolicy规则,查了neverallow,查了prebuilt policy版本号,最后发现是它的vendor_boot.img里多挂了一个debugfs节点,名字叫/sys/kernel/debug/binder/state。这个节点在另外两台机上被bootloader删掉了,但在这一台,它活着,而且偷偷改了binder_transaction_log的buffer_size。我删掉它,avc没了;我把它改名,avc又回来;我把它chmod 000,avc继续刷——说明问题不在权限,在初始化时机。但我没力气再挖下去了。测试机堆在窗台晒到发烫,屏幕边缘泛出一圈浅黄光晕,像烧焦的糖纸边。 小陈端来一杯冷掉的茉莉花茶,杯子外壁全是水珠。“你喝一口?”她问。我没接,只指着Logcat里一行被我高亮标红的:E/HwPhoneWindowManager: [KEYGUARD] handleKeyguardShowOccludedEvent called but mKeyguardShowing = false. 她凑过来看了一眼,说:“哦,这个啊,上周我就提单了,说是framework那边没同步KeyguardStateMonitor的状态,但我们这边没法改,得等AOSP merge。”说完她转身去拔充电线,插头拔出时带起一小串蓝色静电火花,噼啪。这声音比机械键盘还脆。 我关掉ADB,打开微信收藏夹,翻出七年前第一版外包合同时签的条款附件:第4.2条写着,“适配责任边界以预装ROM镜像发布当日的GSI兼容列表为准”。可现在没人提GSI了。连厂商自己都在用私有bootimage签名绕过验证。所以这事我到底该算谁的锅?我不知道。我现在只想知道,为什么“优胜劣汰”这四个字,在英文环境里被硬塞进resources.arsc的zh-rCN块,却没给en-rUS打补丁?测试妹说她用模拟器切英文Locale测过,按钮文字变空白,但功能还在。空白按钮也能“优胜劣汰”?我信了。 明天上午十点,要去厂商现场做最后一次联调。我打算带个U盘,里面放三样东西:一份删减版的overlay清单(去掉所有涉及DisplayMetrics的部分)、一段能强制覆盖densityDpi为320的system.prop patch(不管它生效不生效)、还有,就是刚才洒水车喷头卡顿那三秒的手机录音。我要放给他们听。要是他们问这有啥用,我就说:“听着像不像你们那个‘优胜劣汰’逻辑——卡一下,吐一口,再卡一下,再吐一口?” (编辑:52刷机网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

