用RenderDoc和安卓模拟器抓帧手游
知乎上有一篇用 Intel GPA 和安卓模拟器抓帧手游的帖子,不过 Intel GPA 配置相对比较繁琐,还有版本问题。还是 RenderDoc 比较习惯。所以研究了一下如何用RenderDoc来抓帧模拟器,倒是蛮简单的。这样手游只要能用模拟器运行,就一定可以被抓帧,什么 ro.debuggable 啊,USB 调试啊都不需要管,root 也不用开,绝无被检测到的可能。
首先要设置 Windows 环境变量 RENDERDOC_HOOK_EGL = 0 ,这个是为了防止 RenderDoc 把模拟器里面实现的 GLES API 给 Hook 了的同时还 Hook 了 DirectX 造成冲突。设置的时候需要右键点击我的电脑(Win10里面叫此电脑),选择属性里面有个修改环境变量的地方。不要试图在命令行上设置,没有用。
其次把模拟器的渲染模式改成 DirectX,原因同上。
在 RenderDoc Tools->Settings->General 里面找到 Allow global process hooking 并勾选
然后找到模拟器的核心文件,一般是一个叫 XXXHeadLess.exe 的文件,也可能是其他的。找到的方法很简单,模拟器里面随便运行一个手游,然后任务管理器里面按照 CPU 使用排序,排在最前面的就是,右键点击之,选择打开文件所在位置。就可以找到核心文件的位置。
在 RenderDoc 的 Launch Application 页面里面。Executable Path 选择刚才找到的模拟器核心。然后在下面 Global Process Hook 里面点 Enable Global Hook,如果提示需要 Administrator 启动就确定以后再点 Enable Global Hook 按钮。
退掉所有模拟器,(注意一定要退干净,有时候模拟器界面关掉了,核心还在后台运行。可以在任务管理器里面查看模拟器的核心是否还在运行,还在运行的话用任务管理器杀掉)然后重新启动模拟器,这时候应该能看到模拟器画面左上角已经显示 RenderDoc 的信息了,如果没有,请检查前面操作是否正确,没有RenderDoc的显示信息说明完全没有加载成功。
RenderDoc File 菜单 Attach to Running Instance , 在 localhost 下面可以看到模拟器核心程序,选中并点击 Connect to app ,之后就正常抓帧即可。
* 如果模拟器里面没有启动手游,而是停在桌面上的话,刚 Connect 上的时候有可能会显示 D3D11 Not Present,没法抓帧,不用担心,这是因为模拟器没有渲染动作。正常启动游戏就可以抓了
* 模拟器毕竟是把安卓的渲染 API 给翻译到 D3D11 API,所以确实有可能和实际渲染操作有些许差别,特别是采用多线程渲染方式的手游,抓帧下来的结果时序很有可能是不对的,这个就没有办法了,就当个补充好了。
* 我测试都是用 64 位模拟器做的,没试验 32 位的行不行
有点儿神秘,试了夜神和网易mumu,localHost下面到模拟器程序
找不到
试了mumu和夜神,localHost下面找不到模拟器程序呢
global hook 你选的哪个进程, mumu 的手游助手里面星云引擎是不行的,工作模式不一样,但是传统引擎是可以的。
Hook 成功的话模拟器画面上就会有 RenderDoc 的字样了,如果没有的话自然 localhost 下面也啥都没有。
请教下大佬,你是用的什么模拟器测试的呢,我按照你的教程操作,勾上 Enable Global Hook后某些模拟器无法启动了,而有些模拟器启动后,左上角显示的是OpenGLES 12而不是D3D11,模拟器的渲染模式已经设置成了DirectX,然后抓取帧的时候就会模拟器卡死,renderdoc也会崩溃,我已经在cmd里写入set RENDERDOC_HOOK_EGL = 0,也试过在Executable Path下面的Environment Variables写入这个命令,但依然不能成功抓取,是我哪里弄错了么,还是少设置了什么,希望能指教下,不胜感激~
夜神和 mumu 我都试验过,都可以。 不过我用的都是 64 位的,32位的没试验能不能用。
设置环境变量需要右键点击我的电脑,属性里面设置,这样设置了以后就是全局有效。直接 cmd 设置是不好使的,因为模拟器核心进程是通过 service 启动的,并不是直接调用,不能够继承你 cmd 设置的环境变量(这也是为什么 RenderDoc 不能用 Capture All Child Process 的方式注入的原因)。
显示的是 OpenGLES 这个情况我确实没见过。。我感觉还是 EGL 那个变量设置的问题,让 RenderDoc 错误地 hook 了 GL call 而不是 DX call。
果然是环境变量设置的问题,博主好人,感谢感谢~
mumu模拟器上测试,可用~
大佬,按照你的步骤,试了很多次,都卡在“在RenderDoc File 菜单 Attach to Running Instance”,LocalHost下没有模拟器的核心程序,找不到。模拟器界面上也未显示任何RenderDoc的信息。
1.我的环境是:Win10,MuMu模拟器(传统单引擎),RenderDoc(v1.12)。
2.环境变量已配置,能在cmd用echo %RENDERDOC_HOOK_EGL%打印0。
3.XXXHeadLess.exe文件的路径也都找到了。
4.模拟器渲染模式为DirectX。Root模式开或者关都试了。
5.RenderDoc里也用Administrator权限Enable Global Hook了。
6.上面的都做完,启动MuMu模拟器,运行随便找的一款游戏,在RenderDoc的LocalHost下还是没有模拟器的核心程序。T.T
希望大佬能指教下,感谢不尽…
大佬,按照你的步骤,试了很多次,都卡在“在RenderDoc File 菜单 Attach to Running Instance”,LocalHost下没有模拟器的核心程序,找不到。模拟器界面上也未显示任何RenderDoc的信息。
1.我的环境是:Win10,MuMu模拟器(传统单引擎),RenderDoc(v1.12)。
2.环境变量已配置,能在cmd用echo %RENDERDOC_HOOK_EGL%打印0。
3.XXXHeadLess.exe文件的路径也都找到了。
4.模拟器渲染模式为DirectX。Root模式开或者关都试了。
5.RenderDoc里也用Administrator权限Enable Global Hook了。
上面的都做完,启动MuMu模拟器,运行随便找的一款游戏,在RenderDoc的LocalHost下还是没有模拟器的核心程序。T.T
是不是我还漏做了什么步骤?希望大佬能指教下,感谢不尽…
那你这个很奇怪了啊,从操作来看应该没有什么问题,root模式应该不影响。如果界面上没有 renderdoc 的信息的话那就说明没加载成功。我猜大概有几种可能吧,一个是enable global hook 的时候,xxxxheadless.exe 的路径要选对,另外一个请尽量关闭所有的杀毒软件,360 火绒之类的,毕竟注入这种行为有点像病毒木马,说不定被它们给禁止了也说不定。
大佬,我的情况跟上面的Jack大哥一样
请问大佬你使用的模拟器版本是多少的。
今天下午本来回复了一条评论,我用了两台笔记本测试,情况都跟楼上的Jack老哥情况一样,但是回家之后,用台式测试却正常了,模拟器版本跟renderdoc版本都是一样的,暂时不确定是什么问题。。。估计是系统原因
[捂脸]不行的机器看起来是公司的,上面是不是有什么杀毒或者防木马软件啊。
不行的机器,防火墙跟杀毒都关了,看起来更像是显卡的问题,我两台笔记本,是板的,都不行,台式的,就可以。