作者: 雨色
版本: v2.2.11
适配: SM8650 (8 Gen3 / Adreno750) · SM8750 (8 Elite / Adreno830) · SM8850 (8 Elite Gen5 / Adreno840)
一个 KernelSU / Magisk / APatch 模块,用来接管游戏运行时的 GPU 频率下限。
手机 GPU 的默认调度很保守:即便你在跑游戏,系统仍会把频率压到很低来省电,结果就是帧率忽高忽低、掉帧、触控迟滞。G750 Boost 在检测到游戏运行时,把 GPU 的地板档位抬到你设定的值并锁住上限,系统 governor 在这个地板之上自由调频;游戏退出后自动恢复系统默认。
游戏启动 → 三通道同步写入地板
游戏运行 → 每 0.3s 只读校验,偏离才重写;governor 在地板以上自由调频
游戏退出 → 8 秒迟滞后恢复系统默认档位
不只写一个节点,而是三处同时写,覆盖不同调频 App 与系统组件的接口:
| 通道 | 节点 | 单位 | 说明 |
|---|---|---|---|
| 主 | /sys/class/kgsl/kgsl-3d0/min_pwrlevel |
档位号 | 最可靠,实测长时间不被系统覆盖 |
| 软下限 | <kgsl>/devfreq/min_freq |
Hz | 第三方调频 App 走这里 |
| 内核 | /sys/kernel/gpu/gpu_min_clock |
MHz | msm_perf / 性能工具常用接口 |
节点不存在的平台自动跳过,不做空写。
防止游戏或原厂游戏栈(opgs_daemon 等)把上限拉低:
| 节点 | 单位 |
|---|---|
max_pwrlevel |
档位号 |
max_gpuclk |
Hz |
/sys/kernel/gpu/gpu_max_clock |
MHz |
<kgsl>/devfreq/max_freq |
Hz |
四路每 0.3 秒检测,被拉低后 0.3 秒内拉回。
- 下拉框列出设备真实档位,每项标注档位号
- 保存即吸附:你选的 MHz 若不在设备频表上,自动落到最近的可用档位,并回显「生效值 + 档位号」
- 配置值与设备档位不一致时给出 ⚠ 提示
- 游戏运行中改动 0.3 秒内应用;非游戏态不写地板,进游戏后生效
WebUI 状态区同时展示三组值,一眼看出是"配置没生效"还是"被谁改了":
- 配置目标 — 读配置文件,非游戏态也准确
- 当前生效 — 运行态缓存,仅游戏态刷新
- 硬件实际 — 直接读 sysfs
自适应手机单列 / 平板双栏,含浅色 / 暗色 / 跟随系统三态主题。
壁纸支持(系统相册选图):
- 走 root 直读:
_id→content query解析真实路径 →cp进模块 → magic 校验 → 原子替换 - 失败自动回落到
content read流式读取 → FileReader 直传 → canvas 压缩 - 壁纸透明度可调(
wall_opacity) - 玻璃透明度可调(
wall_glass):统一驱动卡片 / 日志区 / 输入框 / 浮动按钮的玻璃层 - 玻璃模糊可调(
wall_blur):0–40px,0 = 完全无模糊
分页导航:首页(状态 + 档位配置 + 日志)与壁纸设置分为两个独立页面,底栏导航切换并高亮当前页。
编辑 /data/adb/modules/g750-boost/games.txt,一行一个包名。
支持前台 / 后台 / 小窗运行,游戏进程存活期间地板始终生效。
- 服务自愈守护:
webdaemon.sh每 10 秒探活,死亡即拉起(带失败退避);模块 disable/remove 时绝不拉起 - 恢复保证:启动时保存系统默认档位;退出 / 禁用 / 卸载 / 进程异常(trap)全部恢复;崩溃残留下次启动自动清理
- 热路径零 fork:节点读写 / 配置读取 / 进程校验全走 shell 内建,游戏期 0.3s 一轮 ≈ 73μs,CPU 占用 <0.02%
- 写后回读自检:被驱动丢弃时输出
WARN floor write rejected - 路径注入防护:外部路径参数 base64url token 化;
_id严格数字白名单;后端三重路径校验 + JPEG/PNG/WEBP magic 校验 - 失败可见:WebUI 写入失败时直接回显诊断尾部,无需 root 读日志
0. 下载最新版: g750-boost_v2.2.11.zip
https://github.com/jun430/g750-boost/releases/download/v2.2.11/g750-boost_v2.2.11.zip
1. KernelSU / Magisk / APatch 中安装 zip
2. 重启生效
3. WebUI: http://127.0.0.1:8778(管理器内嵌通道或浏览器)
| 场景 | GPU 地板 |
|---|---|
| 目标游戏运行中(前台 / 后台 / 小窗) | 你设定的档位(默认 680 MHz) |
| 所有目标游戏退出后 | 系统默认(约 231 MHz) |
- 首页
- 状态卡:平台 / 配置目标 / 当前生效 / 硬件实际 / 地板档位 / 目标上限 / 当前频率 / 实际上限 / 游戏状态 / 温度
- 档位配置:地板频率(下限)、上限频率(封顶)、保存档位
- 运行日志:实时查看
- 壁纸分页(底栏「壁纸」进入)
- 选择 / 清除壁纸
- 壁纸透明度、玻璃透明度、玻璃模糊三个滑杆
- 底栏导航:首页 / 壁纸 / 刷新 / 主题
| 平台 | 档位表(MHz) |
|---|---|
| SM8650 (8 Gen3) | 903 / 834 / 770 / 720 / 680 / 629 / 578 / 500 / 422 / 366 / 310 / 231 |
| SM8850 (8 Elite Gen5) | 1200 / 1050 / 967 / 902 / 826 / 726 / 646 / 578 / 539 / 500 / 461 / 422 / 382 / 342 / 282 / 222 / 191 / 160 |
| SM8750 (8 Elite) | 运行时自动读取 |
available_frequencies 的 index = pwrlevel。模块先把频表强制降序归一化(不同 SoC / devfreq 表顺序不保证),再用 num_pwrlevels 做条目数对齐校验。
- 地板:目标频率 → 选择 ≥ 目标的最小档位(如 700 → 720)
- 上限:目标频率 → 选择 ≤ 目标的最大档位(如 400 → 366)
- 保存时写入的是吸附后的值,WebUI 显示的永远是设备真实档位
识别优先级:GPU 硬件型号(gpu_model,最可靠)> ro.soc.model > ro.board.platform。
厂商 ROM 的 ro.soc.model 命名可能不准(8e5 曾被写成 SM8750),所以以 GPU 实际型号为首要判据。
首次探测后把 4 个 sysfs 路径缓存到 config/gpu_paths.conf,后续直接读缓存(缓存的是路径,不是频率值)。路径失效时自动重新探测。
频率表始终实时读内核节点,从不缓存 —— 内核更新频表后立即生效。
8e5 上 devfreq 设备虽注册但无频率节点(gen8 把调频决策移到 GMU DCVS,DCVS 节点全部只读)。代码按"节点文件存在"探测,不存在自动跳过。min_pwrlevel / min_clock_mhz / gpu_min_clock 在 8e5 上指向同一后端,写一个另两个跟随。
/data/adb/modules/g750-boost/boost.log
- 修复「壁纸透明度调了还是有遮挡」:定位到三层叠加遮挡 ——
body自身背景压住z-index:-1的壁纸层(真凶);.card硬编码blur(8px)不听「玻璃模糊」滑杆;select/.logview残留 18~25% 白底。三层全修,卡片磨砂由 8px 降至 2.4px,玻璃 100% 时真正全透 - 修复「系统返回/侧滑不退出 WebUI」:根因是 v2.2.8 引入的
location.hash分页路由 —— 写 hash 属于同文档导航,每次切页都往 WebView 历史栈压记录,使宿主canGoBack()变true。改为纯内存变量,完全不碰history/location。实测history.length由2→3→…→16变为恒为 2(增量 0) - 修复 8778 并发缺陷:
busybox nc -l单连接串行 → 浏览器并发请求index.html+style.css+main.js时后两个被拒,页面裸奔。改为nc -lk。实测 3 路并发 3/3、8 路 8/8 全部 200 - 修复
http://127.0.0.1:8778/?v=xxx打开 404
- 修复 8778 并发缺陷(见上,
nc -lk)
- 修复壁纸遮挡三层(见 v2.2.11 说明)
- 滑杆配置 localStorage 缓存扩展,首屏不再闪跳默认值
- 壁纸设置改为独立分页(首页 / 壁纸 整页切换,底栏导航高亮当前页)
- 壁纸设置集中到独立面板(弹层形式,v2.2.8 改为分页)
- 首屏壁纸预热:把
present/mtime缓存进 localStorage,首屏零延迟显示壁纸 wall.sh get提速 60%:do_get由 6 次conf_get(多进程管道)改为一次 grep + 内建 read 解析,实测 0.630.97s → 0.200.35s- 新增
shrinkIfHuge():>2MB 壁纸自动尝试降采样(需 convert/ffmpeg,本机无此工具时保留原图) - 后端
do_get()进程数从 ~20 降到 ~3
- 玻璃透明度上限完全放开:映射改为
alpha = 1 - v/100,100% → alpha 0(玻璃底衬彻底消失) - 新增玻璃模糊滑杆 0–40px,作用于底部浮动按钮的
backdrop-filter
- 壁纸可直选相册图(root 直读):宿主
SuKiSU Ultra交给 WebView 的File是空壳(name是 MediaStore 数字_id、size=0、无字节流),改用 root 直读。实测 11MB 相机原图直传成功,字节级一致 - 玻璃透明度可调(统一驱动卡片 / 日志区 / 输入框 / 浮动按钮)
- 壁纸透明度持久化
- 液态玻璃浮动按钮(3 枚独立,不连成整条底栏)
- 缓存击穿(
?v=版本参数)、写入链路自愈、失败可见、路径注入防护
- root 直读方案落地(MediaStore
_id→ 真实路径 →cp)
- 修复
ksu.exec并发竞态(全局串行化) - 修复丢失单引号导致整个 JS 失效的问题
- 液态玻璃 WebUI 首版:三态主题、响应式布局、壁纸层
- 修复 KernelSU 下节拍全部失效:busybox 的
$SECONDS赋值后恒为 0 不自增,导致配置重载 / 路径探针 / 8s 迟滞 / 日志节流全部失灵。启动时检测并exec /system/bin/sh(mksh)重执行自身 - 移除 proc_monitor 看护(与单实例保护互相打架,导致无限 respawn)
- 配置目标与生效值分离(
cfg_floor/cfg_ceil与state/*两套字段) - WebUI 状态卡三行展示
- 服务自愈守护 + webdaemon 独立会话(
setsid)
- WebUI 档位选择改按下标命中(此前按 MHz 值匹配,配置值不在频表时静默选中第一项 = 最高频)
- 保存即吸附、回显生效值
- 修复浏览器降级通道
__MODPATH__未替换问题 - 频表口径统一(强制降序归一化)
- 事件驱动游戏识别(监听
am_proc_start/am_proc_died,去掉每轮pidof轮询) - 保留启动兜底扫描
- 安装期节点探测按实际平台路径(复用运行时引擎)
- 热路径零 fork 化,游戏轮询统一 0.3s
- 上限护栏同频(0.3s)
- 三通道地板接管
- 上限常驻保护(四路护栏)
- 游戏运行 1 秒校验(原 5 秒)
- 写后回读自检、节点不存在自动跳过、monitor 进程树治理、空变量写保护
- WebUI 面板首版
- 三通道地板接管 + 上限护栏 + 稳定性修复
min_pwrlevel档位接管(实测长时间不被系统覆盖,对比min_freq几秒即被覆盖)- 三平台自适配 + 按处理器平台区分安装
- 双事件监听 + 校验兜底
- 异常残留自清理
- 早期版本:单一节点接管、平台识别雏形