Android内存查看有两种方法,procrank 和 dumpsys meminfo,procrank计算GPU内存不准确,所以选择meminfo指令。
但meminfo需要一遍一遍的敲命令,而且结果比较乱,那能不能有批处理工具呢?答案是肯定的。
MemoryLeakTool是Robin 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文件,我这里的输出是这样的(非标准):
修改后的处理脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
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 ) |
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
不精确