vivo Y37c全面解析:高性价比智慧新体验
|
跟人吵架。昨晚十一点半,vivo 那个对接人老周在群里发语音:“Y37c 系统包明早九点前必须塞进产线镜像,测过就行,不等你们验签。”我回了个“收到”,手已经点开 Jenkins——结果编译队列卡在第十七个,前面十六个全是 Y37c 的不同 ROM 变体,全挂着“Waiting for build agent”。窗外洒水车刚好经过,哗啦——滋啦——滋啦——压着三秒停顿喷马路牙子,那声音跟编译日志里反复刷屏的“adb: device offline”一模一样。 我原以为是 adb server 冻了,杀进程重起,结果发现 vendor 分区签名脚本里硬编码了一个 /system/vendor/bin/launchd 的路径——可 Y37c 那版系统根本没这玩意儿,连 symlinks 都没建。测试妹子小陈下午三点发我截图,说“启动页动画卡帧”,我没当回事,以为又是 overlay 层叠顺序错了。结果她把 logcat 拖到我工位,放大到三百七十像素看 timestamp,发现卡帧前一秒,AudioFlinger 正在往 /dev/block/by-name/misc 里写一串十六进制,写完就停住。我翻 vendor 分区镜像 tar 包,打开 misc.img,hexdump -C | head -20,真没那个 launchd inode。这个我敢打包票。 楼下便利店的关东煮蒸气糊了我显示器右下角,我擦了两遍才看清 error:SELinux denys from untrusted_app to vendor_file。不是 policy 缺失——是 vendor_policy.te 里漏了一行 neverallow 过滤,但漏得特别刁钻:只放行了 sys_prop_set,没放行 sys_prop_set_with_timeout。所以当 Y37c 启动时,SystemUI 要设个带超时的 property,就卡死在 setprop() 系统调用上。不是 crash,不是 ANR,就是不动。你按电源键,它亮;你松手,它灭;你再按,它又亮——像个呼吸灯,还带节奏感。老周说“测过就行”,测的是亮不亮,不是呼不呼吸。 桌上的机械键盘声越来越吵,我换了个青轴,敲空格时咔哒一声比敲回车还响。小陈刚端着保温杯过来,说“小张那边反馈,Y37c 的双卡待机耗电比 X90t 还高十七毫安”,我抬头看她,她眨了眨眼,“我说的是实测,不是跑分”。我点点头,低头继续改 SELinux 规则,顺手删掉 vendor_policy.te 里一句注释:“# 此处曾为适配 S12 增加,现已废弃”,其实 S12 根本没用这条规则——但没人敢动注释,怕哪天 QA 拿旧文档来对,发现“明明写了废弃却还在生效”,那就得倒查 git blame 三个月前谁加的——最后查出来是外包同事阿杰,他上个月离职了,微信已读不回。 Y37c 全面解析:高性价比智慧新体验。这话放发布会 PPT 上没问题,放我们包体目录里就是个坟头草标牌。什么叫“优胜劣汰”?我改了三轮 bootanimation 分辨率适配,最后上线的却是厂商自己悄悄打了个 hotfix patch:直接在 init.rc 里加了一句 write /sys/class/graphics/fb0/videomode "1600x720",连 fbdev ioctl 都绕过了。他们要的是开机快、画面齐、不报错。至于 SurfaceFlinger 怎么在非标准 mode 下算 buffer stride,管它呢。你去 trace 那个帧生成时间?trace 工具自己先崩溃。因为那版系统里 libart.so 的 symbol table 被 strip 得只剩 _ZN3art7Runtime15AbortInternalEv —— 连 backtrace 都给你留半截。 测试机堆在窗台晒到发烫,最上面那台 Y37c 的屏保图是个蓝白渐变波纹,热胀冷缩之后,左下角裂了道指甲盖大小的竖纹,像被什么人用指甲划了一下。小陈拿紫外线灯照过,说“不是液晶漏液,是贴合胶脱层”。我盯着那道纹,想起上个月在 OPPO 做 Find X7 mini 的 OTA 推送——也是热,也是窗台,也是某台机器屏幕突然发绿,debug 发现是 display driver 在高温下把某个 bit mask 错当成 gamma curve 查表索引。修?重写 driver?不,改 firmware header 里的 temp_threshold 值,从 45°C 改成 52°C,再加个 delay(18)。用户感知不到——除了充电时摸后盖会觉得“好像比以前烫一点点”,就这么过去了。 我不信什么“全面解析”,Y37c 的“智慧”体现在哪儿?体现在开机第一次弹出的“是否开启智能省电”弹窗,点击“是”之后,SettingsProvider 数据库里那条 settings_global.name = 'adaptive_battery' 的 record,它的 value 字段是空字符串。不是 false,不是 0,是 NULL。你用 ContentResolver.query() 去读,游标 next() 返回 true,getString() 返回 null,然后整个 Settings app 就在 BatteryFragment 的 onCreateView() 里抛 NPE,但它被 try-catch 包着,catch 里只记了句 log:“adaptive battery config malformed”。没人看到这行 log,因为它打在 verbose 级别,而预置的 logcat filter 是 info。这个我说不准——是故意留的,还是 merge 冲突时漏掉了 else 分支? 老周今早八点四十七分又发消息:“包收到了,确认能刷”。我回了个“”,切到 adb shell,输入 getprop | grep adaptive,返回空。我敲了第二遍,还是空。第三遍,我加了 -a,才发现有个 getprop persist.sys.adaptive.battery.enable,值是 1。它压根不在 global 里,在 persist 里。那弹窗读错位置了。这事儿要不要提?提了就得补一个 IntentService 去 migrate data,可离产线烧录只剩二十三分钟。我开了个新分支叫 fix-y37c-adapt-1,commit message 写“temp workaround for ui flow”,然后关掉 IDE。桌上机械键盘还开着,Ctrl+S 按下去,没反应——缓存没同步,等了五秒,文件才变蓝。
产品概念图,仅供参考 现在我把编译好的包拖进厂商 ftp,路径是 /y37c/ota_final_20240621_v2.zip,v2 不是因为修了 adaptive battery,是因为昨天晚上我把 launcher 的 res/drawable-anydpi-v26/icon.xml 里 标签删了,改成普通 ,否则在某些低端 GPU 上会触发 skia shader 编译失败。这事跟“优胜劣汰”没关系,但跟 Y37c 开机能亮屏有关。我点了上传,进度条走到 87% 的时候,听见楼下便利店收银机“叮”一声,关东煮摊主在喊:“最后两串牛筋丸,要不要?”我不打算去拿。这会儿去,回来可能 Jenkins 又排上队了。反正明天还要跑一遍 full stress test,至少三十七轮 power cycle,中间穿插两次模拟断电——上次做这个测试,Y37c 在第十九轮重启后,状态栏蓝牙图标消失了,但蓝牙功能正常。没人知道为啥,也没人修。我就把测试报告里那一行“Status bar icon misalignment”改成了“Expected behavior per spec v3.2 section 7.4”。spec v3.2 是我上周五自己写的,还没过审。 (编辑:52刷机网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

