unity : 2018.2.11f1
pipeline : BRP
我主要是为后面实现各种效果时,直接抓帧分析拿资源 和 shader 复刻效果,都是为了 学习用
据了解,以前安卓手机抓帧分析是很容易的
但是自从 安卓手机安全性提高之后(BL锁,还有 限制 ROOT 在硬件解锁)
导致现在实现上的所有 抓帧软件都没有效了
所以特此记录此篇,抓帧的过程中多曲折
忘记将预研结果补上了,2022.04.29 回来补上
最终发现,折腾这么久,RenderDoc 还是无法抓 安卓平台的其他非 debuggable 应用
看了一下 RenderDoc 的 Github 作者声明,也是如此,所以妥妥的放弃了 RenderDoc 的抓帧方案了
还是使用 GPA + 模拟器的方案靠谱
为何让 GPA 测量更精准,在 Win10 上要开启 Developer Mode (开发者模式)
To collect stable metrics on third party graphics solutions, enable Developer Mode in Microsoft Windows OS settings.
开发者模式开启步骤:
工具搭配:Intel GPA + 夜神模拟器
理论上,只要能在模拟器运行的所有程序的 graphics event / API 都可以抓取
jave.lin : 个人经验:如果有 GPA 抓取无数据的情况,可以尝试更改:graphics api 为:dx / ogl 之间切换,再尝试
GPA 步骤:
Graphics Monitor
System Analyzer
Graphics Frame Analyzer
模拟器的话,我试过 mumu,和夜神,目前来说,夜神比较稳定,mumu 模拟器基本上都抓不了数据
后续再实时 雷电,和其他的模拟器
GPA 导出 mesh 后,我发现在 shader 重构中,uv 输出全是黑色的,也就说压根没有 UV 数据
然后 搜索了一下,发现 2016 年 Intel GPA 官网就有人问了:GPA: No UV map support?,但是官方回答的是:DX9-DX11 都不会支持,但在 DX12 会支持,刚刚好我用的是 DX11,我去,所以我支持使用 DX12 再来抓一波,再导出 mesh
然后我回到 Intel Graphics Monitor 重来的时候,发现模拟器可能没去使用 DX12,我查看了一下我的显卡是 RTX 2060 是支持 DX12 的,然后我在 Intel Graphics Monitor 中选择 DX12 来启动时,发现没法 GPA inject。(这就蛋疼了)
然后我手动在 GPA 中,将 uv 的 vertex buffer 导出来,在通过 excel/wps 编辑成 vt u v 的格式放入到 v 和 vn 之间,结果还是不行。。。
后续在尝试使用 renderdoc 来抓模拟器的方式来分析
RenderDoc 抓真机也是很蛋疼,我之前还为了抓真机尝试过:
折腾太久吴国,所以用另一种方法来强制打开 android 的全局 debuggable 标记,那么请看下一段落
既然 GPA 遇坑不能导出完整的 模型
可以使用 RenderDoc 来导出
我发现网络上各位大大也时这么用
先了解 RenderDoc 的一些主要功能可以参考这位大佬的文章:GPU分析工具RenderDoc使用
具体 RenderDoc 导出模型,可以参考这位大佬的处理方法:Renderdoc扒模型教程
将 RenderDoc 导出的 In VertexBuffer 的数据导出 CSV 后,再将 CSV 导出 FBX 或是 OBJ 的工具都在这里面Alunice/TaTa - CSV2Mesh, CSVConvertor
但是要使用 RenderDoc 抓帧 Android ,脚本推荐的是 小米+解BL锁 后再进行的
BL解锁,可以参考:
BL解锁中困难重重,应该是小米的开发人员极度不用心所致
比如:你根本就找不到 miusbdriver.exe 驱动
jave.lin : 经过大量搜索、翻阅,找到一个:小米手机助手
下载后,再手机助手的安装目录下的:Unlock_Tool 下找到了:miusbdriver.exe
(怎么找到的,我安装了 everything,然后输入:miusbdriver)
如果BL锁想要重新添加上:
解开 BL锁 目的是为了开启 ROOT 权限:
开启 ROOT 是为了可以开启:debuggable
为了获得手机 ROOT,我尝试过:
都不行,反正现在市面上(我今天2022/03/24搜索)发现所有安卓手机都不能轻易开启ROOT权限了
因为安全限制问题,都必须在手机的BIOS模式(BootLoader模式)下调整硬件标记开关,才能开启
然后我使用 了公司提供的一台 RedMi Note 10 ,然后使用我之前的一张小米移动卡,绑定了这台设备后,去解BL锁时,提示:
直接气晕~,-_-!
所以只能等一周后继续使用这种方法
手机破解要等至少一周,小米官方又限制,因为这台手机我刚刚才绑定了我之前一张没用得 SIM 卡
以前 安卓系统没又这么多麻烦得安全性的设置没那么多
现在破解手机就麻烦多了。。。
而我们得现有 抓帧工具都需要手机破解 BL 锁,才能发挥作用。
着简直蛋疼得要死~
但是时间不等人,我就先尝试 GPA + in VertexBuffer 的方式来还原
但是我之前还原之前发现,顶点数量 和、UV、法线、切线的数量都对不上
我估计是 GPA 的显示的 BUG,但是从 GPA 的选择结果看是没又错误的(也就说数据没又错,顶多可能 GPA 上数据的显示又问题),如下:
// jave.lin : 从 VS INPUT 可以看到,0:position, 1:normal, 2:uv, 3:tangent
struct VS_INPUT
{
float4 __glesVertex : TEXCOORD0;
float3 __glesNormal : TEXCOORD1;
float4 __glesMultiTexCoord0 : TEXCOORD2;
float4 __glesTANGENT : TEXCOORD3;
};
顶点数据都对不上,那还叫我怎么还原模型。。。,我是服了
所以我认为:GPA 只适合抓取 shader,然后每一句都需要手动翻译成正常的可读性高得写法
GPA 抓美术资源还好,但抓帧出来的 shader 基本不能用,但是能看懂,基本上全部都需要手动重写全部已读
基本上,一个长一点的 shader 破解后,手动复原效果,需要 1~2 天时间
代码短的 shader 还好,长一点的估计要更长时间,因为破解出来的 shader 可读性超级差
所以,还是等 手机可以申请解BL锁再进一步处理吧(我是真的服!!!)
然后等了一周,然后可以申请解锁了
兴致勃勃的安装官方贴子的操作方法
并下载各种软件工具
我使用得测试手机得小米得,关于开启手机 root 前得 bootloader 解锁
我都参考官方帖子操作,没有一个成功得,论坛里面各大网友已经口吐芬芳了
官方依旧不解决,冷处理,我看得也有点迷~(好几篇关于解锁的贴图,1000+的评论,目测至少 95% 以上都是抠图芬芳)
所以我还是放弃了,然后去 某乎 发问:手机真机上游戏抓帧,需要开启root,有什么手机容易开启root?
几天过去,结果只有一个大佬回答,推荐还是花点钱,去 手机维修点让人解锁,并开启 root 成功了,顶多 100~200 RMB
所以我也正打算等节假日,带上公司测试机去解锁
2022/04/01 下午,公司得测试机:google pixel 6 pro 到手了
当天下午,跟着教程:How To Guide [GUIDE] Root Pixel 6 Pro “raven” with Magisk
将 google pixel 6 pro 开启 开发者模式
再开启 use 调试
这时
adb devices
再联网后,打开: oem 解锁
说到联网:google pixel 6 pro 连接 wifi 也是有 BUG得:
大家就可以看到自媒体,或是官方 所说得:pixel 6 wifi 问题,我是真的无语了
所以我用我自己手机 SIM 插入 pixel 6 pro,使用移动网络后,才能 oem 解锁
这时:
adb reboot bootloader
进入:fastboot mode
fastboot mode 也叫:bootloader
可以看到 locked 得
然后再 cmd, fastboot flash unlock
,注意这部会 清理掉所有的数据
fastboot flash unlock
发现 fastboot flash unlock
没有反应
然后搜索了一下,说是没有安装:google usb driver
google 了一下,使用 android sutdio 来安装:
但是安装完后,Google USB 驱动还是没有反应(在 android studio/settings/sdk tools/google usb driver 下载得最新驱动也不行),如下图
后面还得使用:everything 输入:usb_dri 找到了 unity android playengine(不是 android studio 安装得) 目录下得 google usb 驱动来安装才行,我是真的服了
安装 google usb driver 这么整即可:计算机->右键->设备->设备管理->其他设备->Google Pixel 6 Pro->右键->更新驱动->选择上面 usb_driver 目录所在
这时再倒回 fastboot flash unlock
,发现可以了,如下图
用 音量上下键,选择:unlock the bootloader
然后确定选中 Unlock the bootloader
后,按下,电源键,即可解锁:
如果你想重新锁回 BL,那么执行:fastboot flashing lock
这样就可以锁回去了
再去下载:Magisk vxx.x.apk (下载记得使用 迅雷,70MB±/S,否则就算 VPN 后,也只有 10~50KB±/S,我自己下载了 pixel 6 pro 的img : Magisk-v24.3.apk, 提取码: 4k1b)
将此 apk 复制到你 google pixel 6 pro 并安装
然后在:Factory Image 中下载:最新得 Google Pixel 6 pro 镜像(下载记得使用 迅雷,70MB±/S,否则就算 VPN 后,也只有 10~50KB±/S,我自己下载的是:raven-sp2a.220305.013.a3-factory-87b3bf0a.zip, 提取码: ecyy)
如下图,我下载了镜像后,解压之后,再将:里面得 image-xxx-xxxxx.zip
中 boot.img
解压出来
将它,复制到你得 google pixel 6 pro 设备中
再手机上运行:Magisk,根据下图操作:
然后将:/sotrage/emulated/0/Download/magisk_patched-24300_XMUT5.img
拷贝到你得工作电脑,并重命名为:mast boot.img
(注意这里需要将 USB 播出来,再重新插入,不然再你得工作电脑上得 google pixel 6 pro 得 Download 文件夹上是没有 magisk_patched-24300_XMUT5.img
之类的文件,这个问题还坑了我不少时间,结果发现是 USB 需要重插,我是真的服!)
然后将 google pixel6 pro 重启到 bootloader:
和之前一样:在工作电脑上一句 cmd 即可:adb reboot bootloader
接在,在工作电脑上继续:cmd 输入:fastboot flash boot <将你的 mast boot.img 拖放在这>
,如下:
然后重启 google pixel 6 pro,如果能顺利进入 pixel 6 pro,那么恭喜你,你的 pixel 6 pro 没有变成砖头机
不小心变砖头机也别慌,先将砖头机连接上 工作电脑,然后 再进行下面操作
直接使用 刚刚下载的 img 镜像里面的内容复制到 adb 所在目录下(cmd:where adb
),这是偷懒的做法:
等个5分钟左右,砖头机就正常了(可以进入pixel 6 pro系统了)
然后记得将 adb 目录下的 img 文件清理掉
OK,到这里,我们可以检测一下我们的机器是否 root 成功了
先 google 一下:how to check my google pixel is rooted
我搜索到一篇:可以参考这里:How To Check If Your Android Phone Is Rooted,里面有三种方法来验证,因为系统版本不同,所以我三种都试过,只有一种对 google pixel 6 pro 可行,下面是别分三种:
OK,那么继续使用 rooted 后的 google pixel 6 pro 来抓帧、提取资源试试
刚刚开启,就翻车:
adb shell su
可以看到 su (super-user) 超级用户没有权限。。。那也就是压根没有 rooted 成功
然后我重新来了一篇 root,然后可以了。。。我真滴无语了都。。。
adb shell su
时,在 magisk 会提示是否 授予 root 权限,还可以指定 root 权限拥有多久,选个:forever (永久就好了)
然后 根据这篇:GPU分析工具RenderDoc使用 发现整不了 ro.debuggable = 1 的 global prop
然后 google 了一下:how to enabled ro.debuggable in android
找到了这么一片:A simple way to realize “global debuggable” (RO. Debuggable = 1) of Android phones [hammer nut 3] - 有说明,每个 apk 都可以设置 android:debuggable=1
的设置,但是只是针对单个 apk 的,如果 apk 没有设置这个 flag,那么就可以通过 root 的 su
权限来设置 ro.debuggable
即可,这样不管你发布的 apk 中的 android:debuggable
是与否,都会按 debuggable=1
来对待,因为 ro.debuggable
是全局的一个 debuggable
标记
使用的是 google pixel 6 pro 里面安装:magisk 来修改,刚刚好我们上面就安装了
其中的 stop;start; 会重启 adb,等重启好了之后,在 adb shell
, su
, getprop ro.debuggable
即可看到输出 1
了
但如果这时,再重启一次,你会发现 adb shell 中的 getprop ro.debuggable 又变成 0 了
为何让 ro.debuggable 重启也能持久生效
参考:Android修改ro.debuggable 的四种方法
github release: Magisk-Modules-Repo/MagiskHidePropsConf - 这里我下载的是最新的(建议不下载这个最新的,因为找不到哪里可以设置 ro.debuggable,建议往下看,下载:5.3.6 版本的)
为了防止,5.3.6 可能放生意外 找不到,我就直接放网盘一份:MagiskHidePropsConf-v5.3.6.zip, 提取码: uiqs
然后将 MagiskHidePropsConf-xxxx.zip 复制到 google pixel 6 prop 的 Download 目录
打开 Magisk/Models/Insall from storage/选择 上面复制过来的 MagiskHidePropsConf-xxxx.zip
下面是 v6.1.2 的截图,v5.3.6 的截图没去截图,就算了
点击 Magisk 右下角的 Reboot (重启手机)
注意我上面下载的是(当前)最新(v6.1.2)的 MagiskHide Props Config
然后找不到 ro.debuggable
在哪设置,下面的是 按 4 - Edit MagiskHide props (active)
我还试过了 5 - Add/edit custom props
还是不行,add 的方式会导致 ro.debuggable = ro.debuggable 1
而不是 ro.debuggable=1
下面是尝试:5 - Add/edit custom props
的过程
PS E:\ChromDownloads> adb shell
raven:/ $ su
raven:/ # getprop ro.debuggable
0
raven:/ # magiskhide setprop ro.debuggable 1
raven:/ # props
Loading... Please wait.
MagiskHide Props Config v6.1.2
by Didgeridoohan @ XDA Developers
=====================================
Updating fingerprints list
=====================================
Checking list version.
Fingerprints list up-to-date.
Checking for module update.
No update available.
MagiskHide Props Config v6.1.2
by Didgeridoohan @ XDA Developers
=====================================
Select an option below.
=====================================
1 - Edit device fingerprint
2 - Force BASIC key attestation
3 - Device simulation (disabled)
4 - Edit MagiskHide props (active)
5 - Add/edit custom props
6 - Delete prop values
7 - Script settings
8 - Collect logs
u - Perform module update check
r - Reset all options/settings
b - Reboot device
e - Exit
See the module readme or the
support thread @ XDA for details.
Enter your desired option: 5
MagiskHide Props Config v6.1.2
by Didgeridoohan @ XDA Developers
=====================================
Custom props
Select an option below:
=====================================
Set or edit custom prop values for your device.
Currently no custom props set.
Please add one by selecting
"New custom prop" below.
n - New custom prop
b - Go back to main menu
e - Exit
See the module readme or the
support thread @ XDA for details.
Enter your desired option: n
MagiskHide Props Config v6.1.2
by Didgeridoohan @ XDA Developers
=====================================
New custom prop
=====================================
Enter the prop to set. Example:
ro.sf.lcd_density
b - Go back
e - Exit
Enter your desired option: ro.debuggable=1
MagiskHide Props Config v6.1.2
by Didgeridoohan @ XDA Developers
=====================================
ro.debuggable=1
=====================================
Enter the value you want to set
ro.debuggable=1 to,
or select from the options below.
The currently set value is:
Currently not set, or the value could not be retrieved.
Please enter the value to set.
b - Go back
e - Exit
Enter your desired option: ro.debuggable 1
MagiskHide Props Config v6.1.2
by Didgeridoohan @ XDA Developers
=====================================
ro.debuggable=1
=====================================
This will set ro.debuggable=1 to:
ro.debuggable 1
Pick an option below to change
what boot stage the prop will
be set in, or set/reset a delay:
1 - Default (current)
2 - post-fs-data
3 - late_start service
4 - Both boot stages
d - Delay
Do you want to continue?
Enter y(es), n(o), e(xit)
or an option from above: 4
MagiskHide Props Config v6.1.2
by Didgeridoohan @ XDA Developers
=====================================
ro.debuggable=1
=====================================
This will set ro.debuggable=1 to:
ro.debuggable 1
Pick an option below to change
what boot stage the prop will
be set in, or set/reset a delay:
1 - Default
2 - post-fs-data
3 - late_start service
4 - Both boot stages (current)
d - Delay
Do you want to continue?
Enter y(es), n(o), e(xit)
or an option from above: y
Working. Please wait...
Working. Please wait...
Working. Please wait...
Working. Please wait...
MagiskHide Props Config v6.1.2
by Didgeridoohan @ XDA Developers
=====================================
Reboot - ro.debuggable=1
=====================================
Reboot for changes to take effect.
Do you want to reboot now (y/n)?
Enter y(es), n(o) or e(xit): y
Rebooting...
PS E:\ChromDownloads> adb shell
raven:/ $ su
raven:/ # getprop ro.debuggable
1=ro.debuggable 1
看,上面的 getprop ro.debuggable
输出:1=ro.debuggable 1
我也是真的服了~, -_-!
所以我又下载回参考博文的:5.3.6 的 magiskHide props config
下面是 ro.debuggable 的设置过程
PS E:\ChromDownloads> adb shell
raven:/ $ su
raven:/ # getprop ro.debuggable
0
raven:/ # props
Loading... Please wait.
MagiskHide Props Config v5.3.6
by Didgeridoohan @ XDA Developers
=====================================
Updating fingerprints list
=====================================
No connection.
MagiskHide Props Config v5.3.6
by Didgeridoohan @ XDA Developers
=====================================
Select an option below.
=====================================
1 - Edit device fingerprint
2 - Force BASIC key attestation
3 - Device simulation (disabled)
4 - Edit MagiskHide props
5 - Add/edit custom props
6 - Delete prop values
7 - Script settings
8 - Collect logs
u - Perform module update check
r - Reset all options/settings
b - Reboot device
e - Exit
See the module readme or the
support thread @ XDA for details.
Enter your desired option: 4
MagiskHide Props Config v5.3.6
by Didgeridoohan @ XDA Developers
=====================================
MagiskHide props
Select an option below:
=====================================
Change some of the sensitive props set by MagiskHide.
1 - ro.debuggable
2 - ro.secure
3 - ro.build.type
4 - ro.build.tags
5 - ro.bootmode
6 - ro.boot.mode
a - Change all props
b - Go back to main menu
e - Exit
Pick several options at once by
separating inputs with a comma.
Example: 1,3,4
See the module readme or the
support thread @ XDA for details.
Enter your desired option: 1
MagiskHide Props Config v5.3.6
by Didgeridoohan @ XDA Developers
=====================================
ro.debuggable
=====================================
Currently set to 0.
You currently have the safe value set.
Are you sure you want to change it to 1?
Enter y(es), n(o) or e(xit): y
Working. Please wait...
Working. Please wait...
Working. Please wait...
MagiskHide Props Config v5.3.6
by Didgeridoohan @ XDA Developers
=====================================
Reboot - ro.debuggable
=====================================
Reboot for changes to take effect.
Do you want to reboot now (y/n)?
Enter y(es), n(o) or e(xit): y
Rebooting...
PS E:\ChromDownloads> adb shell
raven:/ $ getprop ro.debuggable
1
raven:/ $ su
raven:/ # getprop ro.debuggable
1
raven:/ #
这样无论重启多少次,只要不修改该值,都会是 ro.debuggable=1
真的经历千辛万苦才到这部,那么我们继续使用 RenderDoc 来设置吧
右下角选择,我们的调试机:google pixel 6 pro
这时,google pixel 6 pro 会提示应用的 文件访问权限,将两个:RenderDocCmd 都 Allowed 一下:
google pixel 6 pro 下找不到 packagenames,我是真的服,如下图:
google 一下:how to look up the application packagename
找到一篇:Find package name or application ID of an Android app
可以在play store下载:Package Name Viewer 2.0
为了方便,也可以直接下载我网盘里的:
安装 PackageNames Viewer 2.0
再次重复说明一下:
最终发现,折腾这么就,RenderDoc 还是无法抓 安卓平台的其他非 debuggable 应用(以前的 pacthing 修改 android manifest.xml中的 debuggable 然后,重新打包,签名的方式无效了(虽然官方文档中没声明,但是亲测即可了解到,虽然是开源,我可不想大费精力去阅读、修改源码)
看了一下 RenderDoc 的 Github 作者声明,也是如此,所以妥妥的放弃了 RenderDoc 的抓帧方案了
还是使用 GPA + 模拟器的方案靠谱
既然 RenderDoc 不能抓,那就还是使用回 GPA 来抓吧
GPA 目前唯一缺陷就是不能导出模型的 UV
下面是 原 shader 备份(怕 收到律师函,所以不公开)
下面是自己在 unity 中复刻后、优化后的 shader(怕 收到律师函,所以不公开)
还原到 shaderlab 心得:无他,唯熟手尔。
短一些的代码,基本上 1 天左右,向上面 的代码大概就 1天左右(还原 VS, FS)
最后通过其他方式,“拿到” 了 学习素材,然后使用自己还原的 shaderlab 套上即可看到效果
材质参数随意调整的,顺眼就好,没得时间一个一个看 shader 的传入参数来还原
(不公开,个人学习用)
(数量多,未完成)
使用 RenderDoc, GPA 这些运行时抓帧分析的方式优化点时非常明显的:
(不公开,自己学习用)