动机
在真机上调试抓帧总的来说有两个痛点。
-
RenderDoc抓帧时经常因为各种原因断掉。比如公司的测试机 Type-C 口经过不知道多少人反复插拔早就松松垮垮的了,WiFi 调试也不稳定,AP一漫游就断了,adb在弱网环境下容易丢包断连。 -
条件抓取和部分抓取不好实现。内部抓取很容易做到满足某个条件时抓一帧,或者只抓某一帧的某个部分(如
Basepass),但外部抓取就很难做到。
做法
网上搜了一下,看见钱康来的博客已经记录过他们的探索了,至少这条路是行得通的。
高版本安卓注入 RenderDoc | Loading & Learning
我对 GLES 不感兴趣,所以反而要好做得多——毕竟 GLES 抓取需要 Hook 所有 GL API,而 Vulkan 有清晰的 Loader 和 Layer 概念。只需要做到两个操作:
- 在游戏内启动的时候把
libVkLayer_GLES_RenderDoc.so加载进来。它没有使用 Android 的任何私有库,可以直接dlopen,不需要像搞开源驱动libVulkan_freedreno那样搞一堆 hack hook。 - 在
Vulkan的vkCreateInstance处把Layer加进去。
libVkLayer_GLES_RenderDoc.so 在哪里

RenderDoc 的 APK 里就带有预编译好的库。
如何把它带到包里,可以参考 Engine\Source\Programs\UnrealBuildTool\Platform\Android\UEDeployAndroid.cs 中的 CopyVulkanValidationLayers 方法,沿着相关逻辑把 RenderDoc 的 layer 一并带进去即可。
如何加载 RenderDoc Layer
参考 Engine\Source\Runtime\VulkanRHI\Private\VulkanLayers.cpp,在 -vulkandebug 命令行参数下是如何加载 VK_LAYER_KHRONOS_validation 的,仿照该代码模式把 RenderDoc 的 Layer 加进去即可。RenderDoc 的 Layer 名为 VK_LAYER_RENDERDOC_Capture。
理论上如果在 VulkanRHI 运行前就已经执行好了 dlopen,这里的 loader 可以遍历到 RenderDoc 的 Layer。
如何执行游戏内抓取
可以自己根据 renderdoc_app.h(RenderDoc 预编译包里自带)封装 RenderDoc 的初始化和抓取,也可以利用虚幻自带的 RenderDoc 插件(位于 Engine\Plugins\Developer\RenderDocPlugin)。如果用虚幻的插件,需要进行一定的改造,因为它默认只支持桌面平台,要移植到 Android 端需要屏蔽一些代码并做适配。
如果集成改造了RenderDoc插件,默认保存到Saved目录,这样就内置抓取以后就可以拖下来回放了。并且也可以让AI Agent去自动抓取,配合上RenderDoc-mcp去自动debug..(做梦中