iPhone 16 Plus深度评测:性能与颜值双巅峰!
|
亲历现场。那版系统上线前四十八小时,我盯着三台堆在窗台的测试机——晒到发烫,边框都泛白,其中一台还漏电,摸着麻手,测试妹子说她昨天被电得甩了三次手机,最后用胶带缠住USB口才敢插数据线。 厂商对接人老陈穿双洞拖鞋进工位,后跟踩得啪嗒响,把U盘往我桌上一拍:“iPhone 16 Plus深度评测:性能与颜值双巅峰!”——就这标题,他念得跟朗诵《出师表》似的,还加了重音。我原以为是市场部新编的宣发稿,结果他掀开笔记本,露出一页PDF,页眉写着“预装应用兼容清单V3.7_终版_不改了”,底下密密麻麻全是行,第一行就是这句标题,加粗,带蓝色高亮,右下角还盖了个PNG公章:”已过CTA备案“。 我愣了三秒。不是因为标题,是因为它出现在系统设置里的「关于本机→型号信息」第二屏。不是浮层,不是广告位,不是H5弹窗,是系统级文本硬编码进ro.build.display.id的value里。我拉出build.prop反查,发现这个字符串嵌在vendor/overlay/res/values/strings.xml里,但overlay路径根本没在Android.mk里注册——它是靠adb shell setprop临时注入的,只在首次开机生效,重启就丢。我当场编译了一次,等待十七秒,窗外洒水车正好经过,喷头歪了,水柱斜着打在玻璃上,哗啦啦淌下来,像一行删不掉的日志。 桌上的机械键盘咔哒咔哒响,同事阿哲在敲测试脚本,手指悬停半秒再按下去,他说这样能骗过自动点击检测——结果测到第七台机,脚本卡在「优胜劣汰」四个字上。不是识别失败,是输入法把「优胜」当成了「优盛」,「淘汰」变成了「淘太」,连输三遍都跳不出设置页。他骂了句脏话,摘下耳机,里面还在放周杰伦《晴天》——这事儿跟音乐没关系,但我记住了,因为便利店关东煮的香味正从门缝钻进来,萝卜和海带味儿特别冲,盖过了机房的焦糊味。 我说“这不对”,老陈说“对,就是要‘优胜劣汰’”。我没接话,转头看测试妹子小林在刷机——她用热风枪烤主板背面温控区,说这样能绕过Bootloader签名校验。她说这招上周在红米Note 13 Pro+上试过,成功了两次,第三次烧掉一颗PMIC。我说你别拿这个练手啊,她说:“怕什么,反正那版系统连SELinux都不 enforce。”
产品概念图,仅供参考 我敢打包票:这个字符串绝对不是从资源文件加载的。我反编译了framework-res.apk、system_ext-res.apk、product-res.apk,全没有。它就在/system/build.prop里硬写,但build.prop是只读的。我查了init.rc,发现有一段on property:sys.boot_completed=1的trigger,执行了一个/data/local/tmp/patch.sh,而这个sh文件是OTA包解压时生成的——但解压逻辑在vendor.img里,我们没源码。所以它到底是怎么进去的?我说不准。只知道每次刷完机,第一次开机时串口会吐一行:[ 23.142198] init: starting service 'inject-display-id'... 然后就没了。之后再也抓不到这个服务启动日志。阿哲改了三遍输入法词库,把「优胜劣汰」加进user-dict,权重设成999。小林换掉热风枪,改用指甲钳夹着SIM卡托,在MicroSD卡槽边缘刮了十七下,说能重置eMMC缓存。老陈坐我对面嚼口香糖,吹了个泡泡,破了,粘在键盘F1键上,干了之后变成一块透明结痂。我盯着那块痂,突然想起去年在vivo X90项目里,也是这个位置,他们把「流畅」俩字硬塞进SurfaceFlinger的frame skip统计里,导致帧率监控曲线永远比实际高8%——没人改,因为“不影响用户感知”。 但这次真不一样。这次是“优胜劣汰”——不是状态描述,是动词。我昨晚拆了台样机,发现它在SettingsProvider.db里建了个新表叫sys_adaptation_log,字段就俩:id和event_type。所有event_type都是「优胜」或「淘汰」,时间戳精确到毫秒,且只在CPU温度超过48℃时插入。我查了kernel log,那个温度阈值是手动写死在thermal-engine的.so里,连配置文件都没有。我问小林要不要看看,她说:“看啥,又不是咱们负责热管理。” 楼下便利店关门了,卷帘门哐当一声落到底。阿哲的键盘声停了,他去接水,杯子底磕在饮水机按钮上,发出空洞的咚一声。我打开Android Studio,新建空白项目,就写一行代码:Log.d("DEBUG", Build.DISPLAY); 编译跑起来,真机输出是「iPhone 16 Plus深度评测:性能与颜值双巅峰!」——而Build.DISPLAY本该是ro.build.display.id的值,它现在等于那个临时注入的字符串。可ro.build.display.id在build时早固化了,不可能运行时变。所以…它一定是在zygote fork之前,被某个native进程给mprotect()改写了内存页。但哪个进程有这个权限?我试了libandroid_servers.so,试了libhwui.so,试了system_server的so,全不行。后来我在vendor/bin/hw/android.hal.graphics.mapper@4.0-impl-tesla.so里找到一段hook,注释写着// DO NOT REMOVE: FOR DISPLAY_ID OVERWRITE。我截图发群里,没人回。群名还叫「安卓系统适配攻坚组」,头像是一张模糊的骁龙865晶圆图。 我现在要把那个patch.sh从vendor.img里抠出来,用binwalk一层层剥。小林说她认识一个做联发科BSP的老哥,也许能借个debug版本的boot.img。老陈刚微信发来一条语音,十秒,我点开听,就一句:“明早九点,产线要第一批出货。” 没有“辛苦”,没有“拜托”,也没有“紧急”。我就点了回拨,他挂了。 这事儿我懒得再验证第三遍了。编译窗口还在跑,进度条卡在92%,光标每三秒闪一次。洒水车又来了,这次声音小点,可能是换了喷头。我伸手摸了下窗台那台发烫的测试机,边框果然比刚才更烫了——大概三百七十二度?不,肯定没那么高,但摸着像握着一块刚出炉的电路板废料。我缩回手,指甲盖有点红。 (编辑:52刷机网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

