iPhone 15 Pro深度体验:性能跃升,果粉首选!
|
亲历现场。那晚九点四十七,测试机堆在窗台晒到发烫,三台Pixel 9 Pro、两台OPPO Find X7、还有台华为P60——全被我用胶带缠着USB线挂在空调出风口底下,就为了压住那版系统里一碰就掉帧的动画缓存泄露。厂商对接人老周微信弹窗第七次闪出来:“兄弟再扛两小时,发布会倒计时四十分钟,就等你这行log”。我敲下adb shell dumpsys SurfaceFlinger | grep “Layer” 手没抖,但右眼皮跳得像编译等待时窗外洒水车经过——滋啦…滋啦…滋啦…那节奏我数了十八秒没停。 我原以为是SurfaceFlinger服务层挂了,结果抓了三次systrace,发现是那个该死的DisplayAdapterImpl.onFrameAvailable()在异步回调里偷偷new了两个HandlerThread,而其中一个Thread名字叫“FrameHandler”,另一个叫“FrameHandler_2”,中间下划线是数字二不是字母L——就这命名,我敢打包票,是某外包同事凌晨三点改的,他连IDE的自动补全都懒得点,直接手敲。后来查git blame,果然是张伟,上个月还在群里问“HandlerThread和AsyncTask哪个更省电”,我回他“都别用,用WorkManager”,他回了个“哦”加个啤酒表情。现在他写的FrameHandler_2,正在把SurfaceTexture的onFrameAvailable调用推到主线程队列尾巴上,推得比楼下便利店的关东煮出锅还慢——我亲眼看见老板掀开锅盖,白气腾起来那一刻,我的RecyclerAdapter onBindViewHolder刚好卡住第三帧。 那个“iPhone 15 Pro深度体验:性能跃升,果粉首选!”的稿子,是今天上午十点发到我们外包群里的。标题下第一行小字写着“优胜劣汰”。我截图扔进群里,配文:“谁来告诉我,这‘优胜’是哪个模块跑通了?‘淘汰’又干掉了几条JNI引用链?”没人接。只有测试妹子小林甩过来一个崩溃日志片段:signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 ——地址0x0,典型对象空指针解引用。但你看它栈回溯:libGpuTurbo.so → com.android.systemui.plugins.nano.IPlugin$Stub.onTransact → BinderProxy.transact → …最顶上一行是java.lang.Object.wait(Native Method)。等等,Object.wait()怎么跑到native crash里来了?这事儿我说不准,但我敢说这行日志绝对不是在真机上抓的,是拿Monkey脚本在模拟器里跑出来的——因为模拟器里Binder IPC的timeout阈值比真机松三倍,而且wait()能真等到超时返回null,而真机上早OOM Kill了。但稿子里写的是“深度体验”,不是“模拟器巡检”。
产品概念图,仅供参考 桌上的机械键盘声是青轴,每敲一次ESC取消构建,嗒、嗒、嗒,三声,像钉棺材板。我昨天删了两百行自研的SurfaceSyncHelper,换回厂商给的SDK包,结果今天发现他们SDK里有个隐藏开关:SystemProperties.set(“debug.surface.sync.enable”, “false”) ——设成false反而开启同步锁,true才是关闭。文档没写,注释没写,就一行代码埋在SoLoader.loadLibrary()之后,像块口香糖粘在牙缝里。我盯着那行看了七分钟,直到对面工位老王起身去接水,水杯底刮擦桌面发出刺耳长音,我才意识到自己屏住了呼吸。话说回来,上周五下午我帮小米那边紧急patch一个状态栏图标错位,他们用的是完全不同的Overlay机制,图层Z-order跟我们这版系统根本不兼容。我就在小米的AIDL接口里塞了个try-catch包住SurfaceControl.setBufferSize,结果catch住以后打了一行log:“fallback to legacy mode due to layer conflict”。然后顺手在log后面加了个emoji——。第二天被他们技术总监点名批评:“你们外包是不是把线上日志当微博发?”我说不是,是键盘坏了,按Shift+6自动跳出。他沉默五秒,说“下次换键盘,别换loglevel”。现在我桌上那把机械键盘,空格键确实有裂痕,按下去时有细响,像骨头轻微错位。 所以你说那个“优胜劣汰”,我信一半。优胜——是苹果把Metal管线攥死在自己手里,从MetalKit到RPS调度器全是闭环;淘汰——是安卓这边连Vulkan Instance创建都得看GPU驱动脸色,高通、联发科、三星各自一套初始化顺序,有的先建Queue,有的先配Feature,你敢统一?上次我们为统一建Instance逻辑写了四百行预检代码,最后删了三百九十七行,只留三行if-else判断vendor string。这玩意儿不是技术问题,是政治问题。但稿子里不写这个,稿子写“性能跃升”。跃升?从哪跃?从麒麟9000s到A17 Pro?那算跃吗?那叫跨物种迁徙。我们在这边抠SurfaceView的onDraw调用时机,人家那边已经用RenderGraph直接绕过整个View系统了。可这事儿没法吵,老周今天下午来巡场,站我身后看了三分钟,指着屏幕上那个永远不消失的“loading…”菊花图标,说:“就它,发布会前必须灭掉。” 我点头,转头就把“FrameHandler_2”的名字改成“FrameHandler_Legacy”,然后加了句// TODO: delete before launch. 没删,也不敢删。 明天上午九点要交最终APK。我现在手边有七台不同厂商的真机,充电线缠成一团在桌角,其中一台vivo X100的屏幕碎了,裂纹从左上角延伸到右下角,但触摸还能用——因为底层用了单独的TP控制器,跟LCD panel分开了。这设计其实挺聪明,就是修起来贵。我原以为修屏幕得换整块模组,结果维修师傅说:“换玻璃就行,三十分钟,三百七十二。” 我当场扫码付了款,看着他用热风枪吹掉旧玻璃,手稳得像没喝过酒。而我写了一行代码,改了一个Boolean变量的默认值,测试妹子说:“咦,这次动画没卡了。” 我没回她。只是把桌角那台碎屏vivo重新插上adb,跑了一次monkey ——三千七百二十次操作后,它在第两千八百零九次tap时,黑屏了。Log里没有crash,只有system_server进程突然停止响应。我没保存日志。关掉了终端窗口。 (编辑:52刷机网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

