真我13 Pro至尊版:性能影像双巅峰, gamer首选!
|
亲历现场。那版系统交付前四十八小时,真我13 Pro至尊版的预装包还在编译队列里挂着——不是卡在签名,是卡在资源合并那步,mergeResourcesTask 每次跑完都吐出三十七个“duplicate entry”,但 log 里根本找不到重复的是哪个 drawable。我盯着 AS 窗口右下角那个转圈的进度条,窗外洒水车正路过,哗啦啦地压过沥青路,水声拖得比 gradle daemon 启动还长。
产品概念图,仅供参考 测试妹子把六台真我13 Pro至尊版堆在窗台,下午三点十七分开始晒,到四点零三分,最上面那台后盖边缘烫得没法直接上手。她没戴手套,就用两根手指捏着边框往上提,提了三次才抠下来——第三回 指尖蹭掉一点涂层,露出发白的底漆。我说这机子散热堆料是真狠,她头也不抬:“散热狠?你试试看它跑《崩铁》三分钟,帧率掉到三十二就弹‘系统温度过高’,关后台重开又掉,循环七次。” 我原以为是 thermal HAL 逻辑写死了阈值,结果扒出来是厂商在 init.rc 里硬塞了个 custom_thermal_trigger.sh,脚本里写了“if [ $cur_temp -gt 42 ]; then kill_gaming_service”,可这个 42 不是摄氏度,是 vendor 自定义单位,换算表藏在 /vendor/etc/thermal_config.json 里第十九行注释后面,被 minify 给 strip 掉了。我敢打包票——那行注释写着“// unit: raw sensor val (not °C)”。我截图发给对接人老陈,他回:“这个我说不准,你先按 42 当摄氏度调。” 桌上的机械键盘声很烦。青轴,每敲一个字母都有回弹的咔哒,敲 build.gradle 的时候尤其明显。我把 keyboard_layout 从 qwerty 改成 dvorak 敲了三分钟,没用,还是烦。后来发现是隔壁工位外包同事小马在打《鸣潮》,他耳机漏音,战斗音效里的音爆采样和我键盘的机械声刚好同频,震得我太阳穴突突跳。我摘了耳机去他工位堵人,他正在改一个动画插值器——把 LinearInterpolator 换成 AccelerateDecelerateInterpolator,就为让开屏广告退出时那半秒多抖一下。我说你疯啦?他说:“客户要‘更呼吸感’。” 我说你呼吸感是用贝塞尔曲线画出来的,不是拿呼吸机打出来的。 真我13 Pro至尊版:性能影像双巅峰,gamer首选!——这话贴在 OPPO 那边发布会 PPT 第七页右下角,黑底金字。但咱们适配实测里,“优胜劣汰”四个字才真扎眼。不是夸它多强,是它把所有软肋全筛了一遍:旧 ROM 里残留的 AOSP camera HAL 接口不兼容?直接砍掉;第三方推送 SDK 初始化时 try-catch 太宽泛导致 ANR 堆栈被吃掉?改成 throw runtime exception;连 system_server 里那个用了十年的 dumpsys battery history 命令都加了 --strict-check,输出格式不对的脚本当场报错退出。这不是优化,是清退。像一把钝刀刮锈,刮得慢,但刮完没活口。 楼下便利店的关东煮今天换了汤底,不是昆布,是鲣节加豆豉熬的,味儿冲。我下楼买萝卜的时候看见测试妹子蹲在门口啃竹轮,油亮亮的,她问我:“你适配完‘优胜劣汰’没?”我没接话。她又说:“昨天 QA 提了个 bug,说锁屏状态下收微信语音消息,点进去黑屏十秒,但 adb shell dumpsys activity activities 里明明显示 AcitivityRecord 是 Resume 状态。” 我说:“黑屏不是 Activity 的事。” 她说:“那是什么?” 我说:“是 display power state 和 surfaceflinger 之间那个没走通的 onFrameAvailable 回调——因为 GPU driver 重启时漏发了一个 sync fence。” 她哦了一声,咬了口竹轮,酱汁滴到工牌挂绳上。 我删了三遍 build.gradle 里的 flavorDimensions,每次 cleanProject 之后 AS 都提示“Gradle sync failed: unable to resolve dependency for ':app@debug/compileClasspath'”,但我其实知道问题不在依赖——是 resources.arsc 的 chunk offset 超过了 APK 签名时计算的 max_allowed_size。这事没法 debug,只能重打包。重打了两次,第二次签完校验码对了,可安装时 PackageManagerService 报“invalid apk structure”,查源码才发现它偷偷在校验 manifest 里的 sharedUserId 有没有在 signature cache 里缓存过——而 cache 只读一次,缓存失败就不往下走了。这逻辑我三年前就在 Redmi 12 上见过,当时改了一行注释:把 Log.w(“PMS”, “skip uid check”) 改成 Log.e,现在他们干脆把整个 check 函数抽成一个 interface,default impl 直接 throw new UnsupportedOperationException(“disabled per vendor policy”)。 我试过手动 patch 这个 interface,用 dexpatcher 注入。失败。因为那版系统在 installd 里加了 checksum 验证,不只是验证 odex,连 /data/app/ 下的 dex 文件 header 都核对。我原以为只核 dex header,结果它连 classes2.dex 末尾 padding 字节都要校验——我补了三个零,它说 padding 应该是五个。我补五个,它说末尾 CRC 不对。后来才知道,CRC 计算方式改了,新算法把 DexHeader.magic[0] 到 magic[7] 全当成 salt 算进去了。这个细节没人文档,是我抓 installd 进程的 strace 里看到的 openat(AT_FDCWD, "/system/lib64/libdexfile.so", O_RDONLY|O_CLOEXEC) 后跟了一串 readv,读完立刻 memcmp。这个我敢打包票。 现在还有十六小时交包。我盯着 AS 编译窗口,底下小字飘着“Merging resources… 18%”。洒水车又来了,这次是从反方向开,水声短促些。机械键盘又响起来,是小马在敲回车——他刚刚把 AccelerateDecelerateInterpolator 改回了 LinearInterpolator,说是“老板说呼吸感太强,用户会晕”。我端起保温杯喝了一口,凉的,早上泡的枸杞已经沉到底部,像几个干瘪的小眼球。 明天一早我要去产线驻场。真我那边说,量产机 bootanimation 开机第一帧闪白问题,必须当天定位到是不是 DisplayEngine 的 VSYNC 补偿算法和 kernel drm/msm 的 plane update timing 冲突。我不打算带笔记——产线没 Wi-Fi,也没 USB 调试权限,我只带一支签字笔、三张便签纸,和一句准备好的原话:“麻烦您找下上次送测的工程机,我要拆壳看排线接口的镀层厚度。” (编辑:52刷机网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

