banner
约 300 字
1 分钟

Vulkan Your Genshin:不 Root,也给手机开上原神的 Vulkan 渲染

摘要

一个基于 Shizuku 的 Android 小工具:自动检测原神的 Vulkan GPU 白名单配置,不 Root 也能把自家 GPU 加进去,让更多设备用上 Vulkan 渲染。

Vulkan Your Genshin:不 Root,也给手机开上原神的 Vulkan 渲染

换了新手机之后,我一直想让原神跑在 Vulkan 渲染上。同样一台机器,Vulkan 后端在帧率和发热上的表现通常比 OpenGL 好一截,画面也更跟手。可惜官方并没有给所有机型开放这个选项——游戏数据目录里其实躺着一份 GPU 白名单,只有名单里的型号才会走 Vulkan 渲染,其它机型只能老实退回 OpenGL。

名单长这样:vulkan_gpu_list_config.txt 和 vulkan_gpu_list_config_engine.txt,里面一行一个 GPU 型号。理论上只要把自家 GPU 加进去,就有机会让游戏启用 Vulkan。问题是:游戏数据目录在 /sdcard/Android/data/ 下面,普通应用根本碰不到。想要改它,要么 Root,要么连电脑敲 ADB 命令。我既不想 Root,也懒得每次折腾电脑,于是把目光投向了 Shizuku。

为什么是 Shizuku

Shizuku 的思路很简单:通过 ADB 或者 Root 把 shell 权限“借”给普通应用一次,之后应用就能以 shell 身份执行命令,而不再需要 Root。对“偶尔改一个系统文件”这种需求来说,它是再合适不过的权限来源。

于是我就顺手做了个 App——Vulkan Your Genshin:装好 Shizuku、授权一次,剩下的检测和修改全部自动完成。

它到底做了什么

整个流程被我拆成了四步,App 里也对应四个卡片,一步步往下走:

  1. 连接 Shizuku:检测服务是否在跑、权限是否授予,没授权就弹授权请求。

  2. 检测原神安装:同时认三个版本——国服 com.miHoYo.Yuanshen、B 服 com.miHoYo.ys.bilibili、国际服 com.miHoYo.GenshinImpact,哪个装了用哪个。

  3. 检查 Vulkan 配置文件:在游戏的数据目录下找 vulkan_gpu_list_config.txt 和 vulkan_gpu_list_config_engine.txt。

  4. GPU 检测与写入:拿到设备真实 GPU 型号,如果不在白名单里就追加进去;不想用了也可以一键删掉还原。

第 4 步是核心。GPU 型号不是从系统属性里猜的,而是通过 EGL14 创建一个临时 OpenGL 上下文,直接读取 GL_RENDERER——比如 Mali-G68 MC4 这种最真实的渲染器名字。拿到后去掉尾部的核心数后缀(MC4),得到一个干净的型号名,再写进配置文件。

实现里踩过的坑

项目不大,坑倒是一个没少踩。

EGL 临时上下文:想拿 GL_RENDERER 就必须先有一个可用的 GL 上下文。我用 EGL14 手工创建了 pbuffer 表面 + ES 2.0 上下文,读完字符串立刻 eglMakeCurrent 清场、销毁 surface/context、eglTerminate 收尾。这套手工流程写起来不复杂,但忘释放任何一个资源都是隐患。

MC4 这种后缀:配置文件里同一块 GPU 可能写成 Mali-G68,也可能写成 Mali-G68 MC4,两个文件还可能不一致。所以检测时原始名和精简名都要匹配,删除时也要两条都试着删,否则就会出现“明明加了却显示没加”的怪事。

Shell 转义:所有文件操作都是拼 sh -c 命令交给 Shizuku 执行的,路径和内容里有单引号就得转义成 '\''。一开始图省事直接拼字符串,后来想想这是把自己的命令喂给 shell,还是老老实实做了个 shellEscape。

追加前的换行检查:echo xxx >> file 在文件结尾没有换行时会直接贴上去,把最后一行和新增行粘在一起。所以我先 tail -c 1 用 od 看结尾是不是 0a,不是就先补一个换行再追加。

反射调用 newProcess:Shizuku 的 newProcess 被标记成 @RestrictTo,正常调不了,只能反射。代码里凡是碰到这类限制的地方,都留了反射兜底。

死锁:文件操作都在后台线程,UI 更新要切回主线程。早期版本线程同步写得不严谨,出现过卡死,git 里还留着一个“解决死锁”的提交。后来统一成:后台线程只算结果,runOnUiThread 一次性把状态写回 Compose。

技术栈

  • Kotlin + Jetpack Compose + Material 3

  • Shizuku API v13.1.5

  • EGL14 + OpenGL ES 2.0 做 GPU 检测

  • Android 9(API 28)及以上,targetSdk 36

UI 没有做得很花哨,四个步骤四张卡片,状态用文字和勾叉直接表达,够用就行。

怎么用

  1. 安装并启动 Shizuku,用 ADB 或 Root 方式激活服务。

  2. 安装本 App,打开后授权 Shizuku 权限。

  3. App 自动检测已安装的原神版本,点“下一步”检测配置文件。

  4. 如果配置里没有当前 GPU,点“修改配置文件”,搞定。

  5. 重启游戏看看效果;想还原就点“删除 GPU 配置”。

最后说两句

改的只是设备本地的配置文件,不涉及任何破解、外挂或者绕过检测的操作;至于改完之后游戏到底吃不吃这套,还得看原神版本和驱动支不支持,这个我不能打包票。本质上它就是帮你省掉“Root 或 ADB 手动改文件”这件事的小工具。

项目已经开源在 GitLab(LGPL-3.0),代码量不大,想自己改着玩的随便拿去。遇到问题欢迎提 issue,觉得有用也欢迎 star——毕竟折腾半天,能帮到和我一样不想 Root 的人,就值了。

END

相关文章

暂无相关文章