ColorOS 11 – 13 全局强制高刷的三种思路和方法

时间:2022-12-5    作者:晨曦    分类: app


前言

写这个教程的起因是之前看到某位粉丝较多的人发了Oplus 某机器通过改分辨率– 1 的方法锁高刷,个人感觉离谱至极,于是打算写一下这篇文章进行科普& 教学,顺便打发下时间

三种方法的大体思路
• 修改dtbo 中的屏幕面板信息,删除60 Hz 相关timing,只留下自己设备最高刷新率
• 修改ColorOS 的刷新率白名单/黑名单,全部改为高刷新率
• 使用SurfaceFlinger backdoor 强制设置高刷新率

三种的优缺点
第一种:需要有一定的动手能力,因为每个机型用的面板不同,device tree 也不同,需要自己改;部分机型会出现开机动画花屏,因为bootloader 优先请求60 Hz timing,开机动画过后无任何异常。但好处是可以真正意义上的实现全局高刷
第二种:动手能力不是特别强的可以试试第二种,通过对刷新率配置文件全部进行设置高刷新率来实现,缺点是覆盖不全,系统内置了多套刷新率相关的调整,但也可以满足大部分场景
第三种:优点是效果略好于第二种,但部分场景会出现显示120 Hz,实际上已经卡到了 60 Hz,只有重新启动生效,需要自己确定 backdoor 的index

第一种详细实践方法
下载好由我开发的dtbo 自动编译/反编译工具后,解压复制到 /data/local/tmp,并授权7777

然后打开,选择Linux 脚本,勾选ROOT,点击执行,大概 30秒就会反编译出 dtb,在 dump 文件夹。这个时候不要着急关闭,执行过程中的输出中有 “init device prjName -> xxxx”的字样,其中xxx 为数字,也就是你的设备在公司的内部项目名称,需要记录下来,并且转换为16 进制,比如我是Find X2 Pro 19066,转换为16 进制就是0x4A7A,4A7A 记录下来一会儿会用得到。
接下来进入dump 目录,打开MT 管理器自带的终端,输入grep -r 4a7a (上面的16进制去掉0x并小写),找到带有oplus,dtsi_no 这一行,前面的dtbo.xx_dtsi.txt 就是你设备反编译出来的dtsi,记录下来。接下来打开 隐秘参数 APP,查看面板的名称。

可以看到我们的面板有关键字,oppo19065,记录下来,这个时候回到MT 管理器,打开我们刚才找到的dtbo.xx_dtsi.txt,直接搜索oppo19065,然后找到oppo19065 这个面板中qcom,mdss-dsi-display-timings 部分,framerate 即为刷新率,把0x3c放入计算器转换10进制,是60,说明timming@0这个就是 60Hz 的 timming,我们把他噶了;0x78 是 120Hz保留。0x3c 干掉。剩下的两个就是 2K 和 1080p 模式下 120Hz 分别对应的参数,这里就删除完成了。90Hz以此类推。

修改完之后保存,返回到/data/local/tmp 这个目录,再次运行我的dtbo_helper,会自动编译dtbo image,完成之后刷入到 dtbo 即可,可以使用软件,也可以自己用dd if 命令,在这里不再过多赘述。A/B 用户需要注意一下slot。有不明白的地方可以看文章结尾给出的视频

第二种详细实践方法
复制 /my_product/etc/refresh_rate_config.xml 到内存存储,打开并编辑,查看文件头部的注释可以发现,rateId="2-2-2-2" 代表了 自动切换模式-90Hz模式-60Hz模式-120Hz模式 这四个模式下分别对应的刷新率的 id

刷新率的 id 0 1 2 3 对应 value: 0(unspecified), 1(90Hz), 2(60Hz), 3(120Hz)

我们把所有的 rateId 全部改为我们设备的高刷新率id即可,比如 Find X2 Pro 是 120Hz,所以选择 3
下面这些可以根据需求自己改
<!--inputMethodLowRate 为true输入法降帧,默认为false
enableRateOverride 默认为true,为false表示surfaceview,texture场景不降
enableFodHighRate true表示可以支持指纹高刷新请求,默认false,部分项目指纹闪屏需要配置 -->
<config inputMethodLowRate="true" enableFodHighRate="true" />

按照注释和自己的需求修改即可。修改完成后保存。因为 my_product 分区使用了 erofs 文件系统,所以不可以直接修改,只能使用 Magisk 在 post-fs-data 时期进行 bind mount,所以我们这里提供了一个 Magisk 模版(由 @Waples 提供,在此表示感谢),加入我们修改的 xml 到 my_product/etc之后刷入,重启后即生效。

第三种详细实践方法

核心命令:service call SurfaceFlinger 1035 i32 [显示模式 ID]
backdoor 方式修改刷新率的代码就在上面这一行,我们需要做的是查询显示模式 ID

首先把 dumpsys 写入到内部存储(因为直接 grep 不出来):MT 终端中输入 su 后输入dumpsys >> /sdcard/dumpsys.log,等待运行结束后打开内部存储中的dumpsys.log,搜索DisplayMode,找到类似这样的结果:
{id=0, hwcId=0, resolution=1440x3168, refreshRate=60.00 Hz, dpi=515.15x512.53, group=0}
{id=1, hwcId=1, resolution=1440x3168, refreshRate=120.00 Hz, dpi=515.15x512.53, group=0}
{id=2, hwcId=2, resolution=1080x2376, refreshRate=120.00 Hz, dpi=386.37x384.40, group=1}
{id=3, hwcId=3, resolution=1080x2376, refreshRate=60.00 Hz, dpi=386.37x384.40, group=1}

这里的 id 0-3 就对应了 刷新率和分辨率设置,比如我想要火力全开,则需要选的是 id=1

所以命令就是 service call SurfaceFlinger 1035 i32 1

在终端中输入并验证是否是自己想要的模式,确认后可以把这个命令放到 post-fs-data.sh 中,配合方案2 一起食用更佳。运行一次发现没有问题后,重启即可生效。

总结
第一种最暴力,最有效的,缺点就是需要一定的动手能力并且部分机型开机动画会花屏
第二种+ 第三种组合起来可以覆盖大部分场景,但仍有部分场景会出现显示和实际不符的bug,优点是不需要太多的动手能力并且不会开机动画花屏。
如果第二种+第三种这种方案可以覆盖你的 95% 的场景,推荐这种方案;如果真的极致追求,还是推荐第一种。

如果文章中有描述不清楚的地方,可以参考这个视频:htt去ps:/去/www.bilibili.com/video/BV1sP411M7L1

所有需要的附件下载:
http去s:/掉/garfieldhan.lanzoue.com/b0emjexeh 密码:i2nk