使用bat自动处理dumpsys meminfo内存信息

Android内存查看有两种方法,procrank 和 dumpsys meminfo,procrank计算GPU内存不准确,所以选择meminfo指令。

但meminfo需要一遍一遍的敲命令,而且结果比较乱,那能不能有批处理工具呢?答案是肯定的。

MemoryLeakToolRobin Hu编写的一款用于监测Android进程内存使用情况的脚本工具,简称为MLT。具体使用方法请参考

http://hubingforever.blog.163.com/blog/static/171040579201243071752744/

这里不再赘述(CSDN下载要10分,痛心啊!)。

整套工具使用起来很简单,有图形界面。

1.在config.bat中配置包名

2.根据需要运行各种工具。

一般的Android开发已经够用了。如果你对这一套bat有兴趣或者想自定义输出或者运行出了问题,那么请往下看。

我遇到的问题是,我在非标准的Android上运行了dumpsys meminfo,输出结构跟Android不一致,所以没有得到我想要的结果。那就需要改造脚本。

getMemoryState.bat

核心是这一句

adb shell "dumpsys meminfo %curProcessName%" >%meminfoFile%

在shell下执行 dumpsys meminfo %curProcessName%指令并将结果输出到%meminfoFile%

%%是bat语法,通过set 定义一个变量

如 set test=1,通过%test%来引用它

curProcessName和meminfoFile是在第一个步骤config.bat中配置的。

这样我们就拿到了一个meminfo文件,我这里的输出是这样的(非标准):

meminfo

修改后的处理脚本

FOR /F "skip=5 tokens=1,2,3,4,5,6,7,8" %%i in (%meminfoFile%) do (

if !cnt! EQU 0 (
   set NativePSS=!NativePSS!%slipChar%%%k
echo NativePSS:%%k
)
if !cnt! EQU 3 (
   set GfxDev=!GfxDev!%slipChar%%%k
echo GfxDev:%%k
)
if !cnt! EQU 5 (
   set SoMap=!SoMap!%slipChar%%%k
rem set SoPrivateDirty=!SoPrivateDirty!%slipChar%%%l
rem set SoPrivateClean=!SoPrivateClean!%slipChar%%%m
)
if !cnt! EQU 8 (
   set UnknownPSS=!UnknownPSS!%slipChar%%%j
echo UnknownPSS:%%j
rem set UnknownSize=!UnknownSize!%slipChar%%%l
rem set UnknownAllocated=!UnknownAllocated!%slipChar%%%l
rem set UnknownFree=!UnknownFree!%slipChar%%%l
)
if !cnt! EQU 9 (
   set TotalPSS=!TotalPSS!%slipChar%%%j
echo TotalPSS:%%j
rem set TotalPrivateDirty=!TotalPrivateDirty!%slipChar%%%k
rem set TotalPrivateClean=!TotalPrivateClean!%slipChar%%%l
)
set /a cnt+=1

)
FOR /F "skip=5 tokens=1,2,3,4,5,6,7,8" %%i in (%meminfoFile%)

这一句是逐行读取文件,参数

skip=n 跳过n行

tokens 将要处理的列

还有一个参数delims,分隔符,默认是空格

%%i,可以理解为对应前面的tokens,从i开始,ijklmn这样的顺序使用,如你想用第二列的数据,就是%%j。

 

bat学习:

1.rem是注释

2.set 定义变量  %%引用变量 !!也是引用变量  (有什么区别?)

3.将文件清空 echo. >%path%,其实就是重写这个文件。(如何修改文件中某一行某一列内容?)

4.ren 修改文件名

5.set变量时,设置失败。需要开启延迟

Setlocal enabledelayedexpansion

之后启用变量引用符号 !!

6.检查str是否包含substr

if not "!str!" == "!str:substr=!"

str:substr= 表示将str中的substr置为空。

7.得到一个长路径的文件名

call :getname %path%

:getname
set outName=%~nx1

8.延时

延时有很多方法,最方便的一种是

设置延时6秒

@ping 127.0.0.1 -n 6 >nul

不精确

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注