OPPO Reno15 Pro上市:性能影像双跃升,购机首选!
|
亲历现场。那版系统推出来第三天,OPPO Reno15 Pro真机堆在窗台晒到发烫,外壳反光刺得我左眼发酸——不是比喻,是真发酸,滴了两滴人工泪液,下午三点十七分。测试妹子小陈蹲在工位旁用镊子夹SIM卡托,指甲盖上还沾着蓝胶印,她抬头说“驱动没吐Vsync”,我没接话,盯着编译窗口里卡在37%的gradle daemon进程,等它动一下。窗外洒水车刚好经过,滋啦——滋啦——那种低频震动声混进空调外机嗡鸣里,震得我机械键盘右下角那颗WASD键微微跳。 “OPPO Reno15 Pro上市:性能影像双跃升,购机首选!”——这句话贴在内部群公告栏第二行,加粗,带红点提醒。我原以为就是营销稿照搬进OTA推送文案框,结果发现它被硬塞进SettingsProvider的config_override.xml里当default_title,还绑了system_server重启触发逻辑。我说不准厂商为啥非得走这条链路,但我知道——这玩意儿会在静默升级后立刻调用Resources.getIdentifier()去查一个根本不存在的string资源ID,查不到就fallback到"null",而fallback值又被写死成"OPPO Reno15 Pro上市:性能影像双跃升,购机首选!"。这不算bug,算行为艺术。这个我敢打包票:你grep整个vendor overlay目录,根本找不到那个string定义,它只活在代码注释的todo里:“// TODO: rename after Marigold final。” 楼下便利店关东煮飘上来的味儿混着USB-C线发热的塑胶味,我在抓logcat时手抖,点了三次adb shell getprop | grep build.version,第三次才对上——是那版系统。小陈突然把测试机往我桌上一拍:“亮屏延迟崩了。”我看了一眼,屏幕亮起前有帧丢失,但不是DisplayManager的问题,是SurfaceFlinger在commit transaction前多跑了一次onDraw(),就一次。我盯了十八秒,发现是某个厂商定制的PowerHintService在doze模式下偷偷唤醒了HandlerThread,而这个HandlerThread又持有了ActivityRecord弱引用。这个细节跟“购机首选”半毛钱关系没有,但它让我删掉了整段预加载逻辑——删得比剪指甲还利索。你信不信?我把Log.e("POWER","hint_fuck")改成Log.wtf("POWER","hint_fuck"),它反而不触发了。玄学。 外包老张坐我斜后方,机械键盘敲得山响,左手捏着一袋未开封的青柠味薯片,右手悬在空格键上方停了整整四十一秒。他昨天通宵改完三套暗色主题适配,今天早上十点把patch丢GitLab,备注写着“#fix dark mode alpha blend for R15P camera preview”。我打开diff看了两行,直接退了。太熟了,他写的mBlendMode = PorterDuff.Mode.SRC_OVER;后面跟着一行// this is safe because XXXX,但“because”后面压根没内容,只有个句号。他去年在Find X6上干过同一件事,结果导致相机滤镜在HDR+夜景合成时输出YUV420SP数据错位七十六个像素。这事我没跟他吵,只是默默把他那段代码用try-catch包住,catch里return null。这次我也想这么干,可这次他把return null改成throw new RuntimeException("Reno15P blend logic dead"),还加了@TargetApi(34)注解——这玩意儿连那版系统的API level都还没认领呢。我截图发群里,厂商对接人老李回了个“收到”,再没下文。他微信头像还是去年深圳出差拍的,背后广告牌写着“ColorOS 14 Beta Launch”。
产品概念图,仅供参考 我原以为“优胜劣汰”是指芯片调度器淘汰掉老旧的SchedGroup策略,结果实测发现是Launcher图标动画优先级被提到了比SystemUI弹窗还高——不是因为性能提升,是因为厂商怕用户等开屏动画那零点二秒时觉得卡,所以把图标缩放动画塞进了HWUI render thread的最前面。这叫“优胜劣汰”?这是拿CPU周期喂用户体验幻觉。我试过把Launcher进程的sched_policy改成SCHED_BATCH,图标动画卡成PPT,但系统日志里一句错误都没有,只有SystemServer里悄悄刷了三百七十二行DEBUG级Log:“[LAUNCHER] fallback to cpu-bound anim path”。这东西根本不报错,它就静静摆在那里,像块没拆封的板砖。你查trace时得把filter调成“.anim.|.launch.”,不然它就躲在Logcat海里当幽灵。 桌上的机械键盘声忽然停了。老张撕开薯片袋,咔嚓一声,脆得反常。我摸了摸自己后颈,汗湿的T恤黏着皮肤。测试机堆在窗台,边框烫手,但摄像头模组那块居然有点凉——不知道是不是镀膜反光造成的错觉。小陈刚给我微信甩来一张图:同一个Camera2Session在Reno15 Pro和Reno14上openCaptureSession耗时对比,左边标着“321ms”,右边标着“487ms”,箭头朝右,红色感叹号。她没写结论,就一个句号。我回她:“先跑一遍vendor/firmware/isp/cam_calib_r15p.bin md5,别急。”她没回。大概在拧新开的关东煮料包。我打开终端,cd进firmware目录,ls -l发现cam_calib_r15p.bin最后修改时间是凌晨两点零三分,md5sum结果跟文档里写的不一样,差了六个字符。我截图发群里,老李依然没回。但我看见他在线状态从“在线”变成“忙碌”,持续了八秒,又变回“在线”。 这版系统没给Launcher做独立内存域隔离,所有第三方桌面App共用同一个Zygote32实例,只要有一个App里有个WebView加载恶意JS,在onPageFinished里调malloc(2GB),整个Launcher就冻住六百毫秒。这不是理论,是我今早复现出来的——用demo.apk塞进去,三台Reno15 Pro同时中招。厂商那边说“属非标使用场景”,我回:“你们宣传页上写着‘游戏桌面双开无感’。”他们没接这话茬。我也不打算再问了。现在盯着编译窗口,gradle daemon终于爬到38%,进度条抖了一下。我端起杯子喝了一口,凉透的关东煮汤底——便利店小哥送上来时说“多放萝卜”,结果全是白萝卜,没放海带结。我放下杯子,重新pull origin/main,merge conflict出现在Android.mk的LOCAL_SRC_FILES那一行,冲突标记里夹着一行新代码:“# include $(CLEAR_VARS)”下面空着,然后是“# OPPO_CUSTOM: r15p_optimization_v2”——没有实际赋值,只有一行注释。我删掉这行,保存,make。编译开始重跑。窗外洒水车又来了,这次停在隔壁栋门口,滋啦——滋啦——像一段卡顿的音频。 算了,先烧个userdebug版本跑跑systrace再说。要是trace里再看到SurfaceFlinger的onTransactionReady()后面跟着两次binder reply,我就把power_hint_service整个disable掉,哪怕黑屏时长多加半秒。反正用户也看不出区别,他们只会看发布会视频里那帧0.8秒的快门声音效——那个音效我听过,是从AOSP audio HAL里抠出来的,但加了3dB低频增益,还混了一丝磁带饱和失真。真要细究?它压根不走audio HAL,是MediaCodec绕过去直接打到HDMI sink里的。但没人会测这个。我也没打算测。 (编辑:52刷机网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

