介绍

渲染抓帧是一种记录并分析每个渲染帧的技术。通过这种技术,我们可以深入了解GPU如何处理渲染命令以及如何生成最终的图像。渲染抓帧通常用于找出性能瓶颈、调试应用程序错误等问题。以及对于前沿游戏画面渲染和分析

  • 找出应用程序中的性能瓶颈。
  • 分析帧率问题,包括卡顿和掉帧。
  • 查找图形质量问题,例如像素偏移、阴影问题、光照问题等。
  • 调试着色器和GPU驱动程序中的错误,并找出造成它们的原因
  • 画面分析

市面上的抓帧的方式

  • NVIDIA NSight:一种面向DX12、Vulkan和OpenGL的图形分析工具。老版本图形调试
  • Nsight Graphics 一种面向DX12、Vulkan和OpenGL的图形分析工具。新版本,功能更全(如光线追踪),面向主机端
  • Arm MS Graphics Analyzer :一种可用于CPU和GPU分析的性能调试工具。仅支持ARM Mali GPU
  • Snapdragon Profiler :仅支持Qualcomm Adreno GPU
  • Microsoft PIX:微软的一个适用于DirectX 12游戏的性能分析工具。
  • Intel GPA Frame Analyzer:一种面向OpenGL、OpenCL和Vulkan的性能分析工具。
  • RenderDoc:开源一种面向Vulkan、OpenGL和Direct3D的图形调试工具。

市面抓帧方式对比

仅支持桌面端

  • NVIDIA NSight
  • Nsight Graphics
  • Microsoft PIX

仅支持移动端

  • Arm MS Graphics Analyzer
  • Snapdragon Profiler

支持桌面端和移动端

  • RenderDoc
  • Intel GPA Frame Analyzer (非真机下通过hook OpenGL 模拟器抓帧分析,夜神模拟器抓帧可用)

Intel GPA Frame Analyz 和 RenderDoc 对比

  • 整体工具对于渲染各个流程和工具RenderDoc相比更加完善
  • GPA抓帧的数据非真机环境下的渲染数据,不准确
  • 但GPA抓帧不需要对安装包Debugger的要求,而RenderDoc需要对安装包Debugger的要求.就造成RenderDoc抓帧比较苛刻,但是数据是真机环境下的渲染数据,准确

如何RenderDoc对真机抓帧

Android Debug安装包

  • Android Debug安装包通常称为APK Debug版本或Debug APK,是一个Android应用程序的编译版本,其中包含有关应用程序功能和调试信息的详细信息。这些文件通常被开发人员使用来在应用程序开发过程中进行测试和调试。需要在打包时进行启用

方式一:通过反编译修改然后回编译打包

流程

基本思路:AndroidManifest.xml 反编译 – 修改 – 重新编译 – 打包 apk – 重新签名

从apk直接解压出来的 xml 文件是一堆乱码来的。要正常修改 xml 文件得先进行反编译,通过反编译的 xml 文件就是正常的代码了

1
2
3
java -jar xml2axml.jar d AndroidManifest.xml AndroidManifest-out.xml

java -jar xml2axml.jar e AndroidManifest-out.xml AndroidManifest.xml

这个时候 xml2axml 文件夹中的 AndroidManifest.xml 是已经重新编译过的了。可以直接替换 apk 安装包中的 AndroidManifest.xml 进行打包与签名操作,也可以用其他工具如Apk Tool 进行处理

链接:https://pan.baidu.com/s/13SRG1mrUZuV8_J-7WSAiuA
提取码:8xhd

存在的问题

实际上回编译过程会存在很多问题

  • 不同的Android版本,相关的编译工具并没有及时更新进行维护,项目体量越大失败几率越大

  • 代码丢失或损坏:在进行反编译的过程中,有可能会出现代码丢失或损坏的情况。这可能是由于反编译工具无法正确读取APK文件的二进制数据,或是由于反编译过程中出现了其他错误导致的。

  • 代码混淆:为了保护应用程序的知识产权,开发人员经常使用代码混淆技术来隐藏他们的代码。然而,在反编译过程中,代码混淆会使代码难以阅读和理解,甚至导致代码无法正常工作。

  • 资源文件的问题:当反编译APK时,有可能会遇到资源文件的问题。例如,资源文件可能会缺失、重复或被修改,导致应用程序无法正常工作。

  • 库和依赖项的问题:许多应用程序都依赖于库和其他第三方依赖项。在反编译和重新编译应用程序时,必须确保所有库和依赖项都能正确地链接和配置,否则将导致应用程序无法正常工作。

方式二:通过刷入Root和Magisk面具的方式

刷机流程

这里测试的刷机机型是google pixel 1代,确保机型已经解锁

进入Bootloader模式

  • 关机状态下【按住音量减少键 + 电源键】
  • 开机状态下,在cmd中通过adb命令进入adb reboot bootloader,可以用fastboot devices来验证是否成功

刷机详解

镜像地址找到指定版本

https://developers.google.com/android/images?hl=zh-cn

pixel机型刷官方工厂镜像包8.1为例,Android版本无需太高,8.0即可,避免一些指令不兼容

sailfish-opm1.171019.011-factory-56d15350

镜像包组成

bootloader-sailfish-8996-012001-1710040120.img

  • 进入的bootloader

radio-sailfish-8996-130091-1710201747.img

  • 基带

image-sailfish-opm1.171019.011.zip

  • 安卓系统

进入bootloader,Windows系统双击flash-all.bat,Linux、mac系统运行flash-all.sh 即可

刷入Root

安卓系统版本不一样,Root方法也不一样。不过一般高版本安卓系统,都选择用twrp+Magisk的Root方案

twrp下载地址:

https://dl.twrp.me/sailfish/

Magisk下载地址 :

https://github.com/topjohnwu/Magisk/releases

本文使用的版本:

  • 临时twrp:twrp-3.2.3-1-sailfish.img
  • 永久twrp:twrp-pixel-installer-sailfish-3.2.3-1.zip
  • Magisk:Magisk-v20.4.zip

通过 adb push 命令,把 twrp-pixel-installer-sailfish-3.2.3-1.zip 和 Magisk v20.4.zip 拷贝到手机sdcard目录。为电脑端文件所在路径 ,为要推送到手机端哪个地方。

1
2
adb push twrp-pixel-installer-sailfish-3.2.3-1.zip /sdcard/
adb push Magisk-v20.4.zip /sdcard/

进入bootloader模式

  • 刷临时twrpfastboot boot twrp-3.2.3-1-sailfish.img,
  • 手机会进入到临时twrp,滑动下面的 Swipe to Allow Modifications 滑条,进入Twrp操作页面

刷入永久twrp

  • 选择 Install – 找到目录 /sdcard/ – 选择 twrp-pixel-installer-sailfish-3.2.3-1.zip 文件 – 弹出安装界面 – 滑动底部的滑条 Swipe to confirm Flash 安装。最后显示 …done 的提示。这一步完成

刷入Magisk

  • 点击顶部的【install Zip】 蓝色条部分左侧图标处,返回 Team Win Recovery Project 界面
    按照第三步的操作,只不过文件换成 Magisk-v20.4.zip

安装完成后,点击下面的 Reboot System 按钮,重启系统。这时候会询问是否安装 twrp app
这里绝对不要安装,直接点击中间的 Do Not Install 即可

启动手机后,会多一个面具图标的app

永久启用Debug

打开面具app,点击左上角的三条杠,选择模块,勾选开启【MagiskHide Props Config】模块,重启手机

adb shell 进入手机终端,输入su,授权root权限,然后输入props,选择1


getprop ro.debuggable,如果输出的是1就表示成功了

真机抓帧

image.png