OPPO Reno15深度评测:性能影像双旗舰
|
亲历现场。那版系统推到 Reno15 产线前四十八小时,我正用三台真机跑 ColorOS 的窗口动画链路——不是测流畅度,是测它敢不敢在后台杀掉我们预装的「影像增强服务」后、再偷偷拉起自己同名的「OPPOCameraBoost」。结果你猜怎么着?它杀了,也拉了,但拉的是个空壳,Service.onCreate() 走完就静音,onStartCommand() 根本不进。我盯了十八秒 Logcat,手指悬在键盘上没敲回车,楼下的关东煮摊刚掀开锅盖,一股味噌混着鱼丸的热气直往上飘,隔着六层楼还往鼻子里钻。 测试妹子小满蹲在窗台边,把五台 Reno15 全摆成扇形,每台屏幕朝外晒太阳——她说“温度高点好触发 thermal throttle”,我说“你信热胀冷缩但不信 OPPO 自己的 thermal HAL 拦不住 CPU 温度跳变”。她头都没抬,用指甲掐着其中一台的音量键,反复按压,就为确认降噪模块里那个 vendor.so 是不是会在第三次按压后多吐半句 debug log。我原以为那是她手抖,结果她掏出便签本写了行字递过来:“Reno12 老版本有这现象,但 Reno15 不该有。”我接过来瞟了一眼,纸角还沾着便利店塑料袋上的油渍。 编译等在那儿,三分钟四十秒。窗外洒水车又来了,哗啦啦从左往右匀速淌过去,喷头角度偏了七度,右边人行道干着,左边梧桐叶全湿透。我盯着进度条卡在 87%,心想这破 Gradle 配置八成又是厂商塞进来的私有 plugin 在偷偷改 taskGraph,可我又不敢动——上个月动过一次,结果 build 出来包体里多出两兆的未签名 so,对接人老周当场拆机拆到第三颗螺丝时才想起来问“你们打包脚本是不是调了 nativeStripMode=‘none’”。我说“是”,他没抬头,把螺丝往桌上一撂,咔哒一声,旁边那台测试机刚好弹出通知:“影像服务已重启(非用户触发)”。
产品概念图,仅供参考 不聊什么性能影像双旗舰。就聊“优胜劣汰”——不是指硬件淘汰旧型号,是指系统里那套 service 生命周期管理机制,活生生把第三方影像插件当杂草拔,再把自家同名 service 当韭菜种。拔得挺干净,但种出来的那茬,根系全连在 vendor.img 里,boot 后第一次 bindService() 成功,第二次就抛 DeadObjectException,第三次……第三次它干脆不抛异常,直接返回 null IBinder,连 binderProxy 的 log 都不打。这个我敢打包票,我在 vivo X90 上见过类似路径,在 Reno13 工程机上复现过三次,在 Reno15 就是第四次,但这次它连 adb shell dumpsys activity services | grep boost 都不出结果——不是没启动,是根本没注册进 AMS。你说邪门不邪门?桌上的机械键盘声一直没停,青轴,噼里啪啦,节奏忽快忽慢。我同事阿哲在隔壁工位重写一个 BroadcastReceiver,想绕开 system server 的白名单校验,他改了六遍 IntentFilter,第七遍加了个 category,结果收到广播后 crash 在 onReceive 里 new Handler(Looper.getMainLooper()) ——他说“主线程 looper 已销毁”,我说“你查下是否被 vendor overlay 里的 PowerManagerPolicy 抢先 finish 了”,他嗯了一声,伸手摸了下额角,汗是热的,但手指凉。楼下便利店的关东煮汤面涨价了,泡菜豆腐串从三块涨到三块五,小满刚才买了一串,回来时竹签还滴着汤,在窗台水泥缝里积了小小一洼褐色水印。 那版系统对 CameraManager.registerTorchCallback() 的兼容性处理,是阉割式补丁。不是修复,是绕过:检测到是 Reno15 硬件 ID 就直接 skip 这条回调链,转而走一套私有 hal 层 trigger,触发时机比标准 spec 慢三百七十二毫秒。但文档里只写“优化 torch 响应”,一字不提跳过了 framework 层 callback 注册。这事我说不准是不是故意为之,可能只是当时联调时间不够,工程师随手 patch 了事;也可能早就有方案,但怕 OTA 后三方 app 大面积崩溃,干脆一刀封喉。反正最后上线的 bin 文件 hash,和工程机固件里那一版,差了三个字节。就三个。 我原以为删掉所有预装影像模块就能看到原生行为,结果卸载后系统反而更卡——因为有个隐藏的 vendor.service.camerax.tuner 还在后台轮询,每次 polling 失败都 spawn 新 thread,十秒内堆到十七个。小满说“它不报 ANR,但 CPU 占用跳到九十一”,我切过去看了眼 top,那个进程 UID 居然是 media,不是 root,也不是 vendor,就是 media。我愣了一下,顺手把窗台上最晒的那台 Reno15 翻了个面,背面烫手,摄像头模组边缘有点微微翘起,像被热胀顶开的盖子。这玩意儿我没修,也没拍照,更没发群——现在发群等于留证据。 阿哲那边突然喊我,说他找到一个 workaround:不用 registerTorchCallback,改用反射调用 CameraCharacteristics.get(Key),强行读取 torchAvailableKey 的值。我说“你试过它在灭屏状态下返回啥吗”,他说“还没,等我把手机黑屏再试”,我就看见他右手小指勾着数据线,左手已经点开了电源键,长按,屏幕暗下去的瞬间,窗外洒水车刚好又路过,这次喷头歪得更厉害,一半水洒进了绿化带,一半溅在路边一辆共享单车的篮筐里,哐当响了一声。 优胜劣汰?优的是谁的胜,汰的是谁的汰。这词现在听上去像一句出厂预装语音,点一下就播,播完就删缓存。我不打算再往下追 vendor service 的 Binder thread priority 为什么设成 -18 了。今晚先让阿哲把反射方案 merge 到 dev 分支,明天上午九点前,得把 APK 打包上传到 OPPO 的内部交付平台。平台要求签名必须用他们给的 keystore,而且不能有 debuggable=true。我现在就想把键盘推远点,听不到青轴声,但左手一抬,碰倒了桌上半罐可乐,褐色液体顺着主板散热贴片的缝隙渗进去,没漏到 USB-C 接口,但浸湿了底下那张写着“Reno15 HAL 层 torch 控制路径”的便签纸。算了,不擦。 (编辑:52刷机网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

