当前位置: 首页 > news >正文

Android 常用命令和工具解析之GPU相关

目录

1、GPU基本信息

1.1 获取GPU基本信息

1.2 伪造GPU基本信息

2、GPU内存信息

3、经典案例

案例1:GPU伪造信息方案

案例2:GPU内存统计算法


GPU 指的是 Graphics Processing Unit,即图形处理单元。GPU 是一种专门用于处理图形和图像相关计算任务的处理器,广泛应用于图形渲染、游戏设计、视频编辑、科学计算等领域。
与传统的中央处理单元(CPU)相比,GPU 在处理大规模并行计算时表现更加出色。GPU 可以同时处理多个数据流,执行大量相似的计算任务,适合处理需要高度并行计算能力的工作负载。
在图形应用方面,GPU 通常被用于加速三维图形渲染,使得游戏、虚拟现实(VR)、电影特效等内容的表现更加流畅和真实。此外,GPU 也被广泛应用于机器学习、人工智能等领域,用于加速深度学习网络的训练和推断过程。

1、GPU基本信息

1.1 获取GPU基本信息

可以通过如下命令来获取当前系统或者手机的GPU信息

adb shell "dumpsys SurfaceFlinger | grep "GLES""

如上可以分为三部分,其中第一部分可以理解为此GPU生产公司,ARM表示此GPU采用了ARM架构,Imagination Technologies为另一个平台或者公司的架构,通常简称为IMG

1.2 伪造GPU基本信息

可以通过如下命令来伪造当前系统或者手机的GPU信息,伪造就是认为的更改GPU相关信息:

adb root
adb shell "setprop vendor.debug.gpud.enable '1'"
adb shell "setprop vendor.debug.gpud.process.name ''"
adb shell "setprop vendor.debug.gpud.gl.vendor 'ARM'"
adb shell "setprop vendor.debug.gpud.gl.renderer 'Mali-G52 MC2'"
adb shell "stop;start"
adb shell "dumpsys SurfaceFlinger | grep "GLES""

我们为什么要伪造GPU的信息,因为很多三分应用或者进程,特别是游戏应用会根据不同的GPU,来做出不同的渲染流程,例如MIR4游戏在低端GPU的手机里面调用了不同的opengl纹理来进行图像渲染。来保证兼容一些低端机型的画面流畅,但是这些难免会存在一些bug,例如部分应用在某些机型上出现闪屏或者图像显示不正常,此时我们可以通过伪造来排除GPU的不同导致的问题。

2、GPU内存信息

可以通过如下命令获取GPU内存相关信息:

adb shell cat proc/mtk_mali/gpu_memory   //此条命令只针对MTK,不同平台路径不一样

  • 第一行mali0   141867表示第一块GPU暂时代名为mali0,其总共使用了141867个内存页,注意单位是页,因此转换为kb的计算方法:141867 * 4  =  567468 kb。注意他不是gpu内存容量大小,而是统计了当前系统所有使用gpu mali0的进程的内存页数之和,因此它的数值也是实时在变化。
  • 之后的kctx,表示一个 Kernel Context,具有 ID 0x0000000061e8bc12(可能是某个进程的句柄对象的HASH值)。其中红色框部分表示每个kctx(进程)使用了gpu内存页数,所有的kctx的内存页数之和等于mali0的内存页个数;后面绿色框部分表示每个kctx对应的进程PID,大多数进程通常只会存在一个kctx,但是也有个别应用或者进程拥有多个kctx,例如上图中的PID为25212进程。

3、经典案例

案例1:GPU伪造信息方案

问题描述:com.wemade.mir4global游戏在google play第一次启动的时候出现不支持纹理的提示框,且游戏界面人物显示异常打上了马赛克

问题分析:此游戏在google等对比机上面能够正常使用和显示,并没有此类弹框,根据弹框可以支持提示的此平台的opengl部分纹理格式,且有如下异常日志

最后结论:经过大量测试发现此现象只出现在IMG平台上,MTK做了如下实验,将img的gpu fake to mali(fake的意思就是伪造GPU的型号信息,即三方应用读取GPU的型号出来就不再是IMG二手MAILI)之后就能正常启动

问题总结:此题是APP问题,fake GPU以后游戏显示正常。所以和DDK修改无关。fake GPU有效果。是APP将img的gpu fake to mali的,游戏显示正常了。是MIR4对GPU的型号做了区分,所以表现形式不一样

修改方案:通过代码方式伪造GPU信息为ARM

案例2:GPU内存统计算法

问题描述:Pizza Ready 12.0.0 Screen record in Game mode assist disappear after playing

问题分析:在Android 14的手机上玩Pizza Ready游戏过程中,出现screen record进程被杀,此时dump了该应用内存使用情况,并与对比机进行了对比,发现GL占用相差500M

后对比了多款机器此应用adb shell dumpsys meminfo io.supercent.pizzaidle的表现如下,从此结果可以看出来在Dimensity 6300+kernel 5.15+android 14的平台上必现,在Helio系列的机器均不出现,初步怀疑此问题为平台基线共性问题

后对比了多款机器在其他应用的表现,是否也存在差异如下表,从此表结果可以看出pizzaidle单独应用存在:

最后MTK和Arm给到的回复为GPU统计BUG,即pizzaidle存在多个kctx,之前的统计方式只计算了第一个kctx,因此只有几M,后加入修复patch,轮询统计某进程对应的所有kctx,所以计算出来有500多M,patch如下:

http://www.lryc.cn/news/490177.html

相关文章:

  • 刷题——【模板】二维前缀和
  • Xilinx 7 系列 FPGA的各引脚外围电路接法
  • Python 爬虫 (1)基础 | 目标网站
  • 数字后端零基础入门系列 | Innovus零基础LAB学习Day11(Function ECO流程)
  • 量子卷积神经网络
  • 储能电站构成及控制原理
  • Rocky Linux 系统安装/部署 Docker
  • 12 —— Webpack中向前端注入环境变量
  • uniapp接入BMapGL百度地图
  • 外卖系统开发实战:从架构设计到代码实现
  • 神经网络反向传播算法公式推导
  • Spark SQL 之 QueryStage
  • 【shodan】(三)vnc漏洞利用
  • 每日OJ_牛客_游游的字母串_枚举_C++_Java
  • 51c深度学习~合集8
  • 嵌入式:Flash的分类以及Jlink/J-flash的编程支持
  • 【爬虫】Firecrawl对京东热卖网信息爬取(仅供学习)
  • 遗传算法(Genetic Algorithm, GA)
  • 【二分答案+倍增快速幂】课堂练习
  • LeetCode 力扣 热题 100道(九)反转链表(C++)
  • Linux之网络基础
  • Oracle收缩表空间的简单方法
  • C++设计模式行为模式———中介者模式
  • YB2503HV:高效率降压IC,助力电动车、太阳能设备等领域的能源转换
  • 如何使用Jest测试你的React组件
  • 微网能量管理研究
  • Java基础面试题02:简述什么是值传递和引用传递?
  • 【STL】10.set与map的模拟实现
  • Playwright(Java版) - 8: Playwright 元素交互的高级应用
  • 播放器开发之ffmpeg 硬件解码方案