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文件,我这里的输出是这样的(非标准):
修改后的处理脚本
Shell
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
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"%%iin(%meminfoFile%)do(
if!cnt!EQU0(
setNativePSS=!NativePSS!%slipChar%%%k
echoNativePSS:%%k
)
if!cnt!EQU3(
setGfxDev=!GfxDev!%slipChar%%%k
echoGfxDev:%%k
)
if!cnt!EQU5(
setSoMap=!SoMap!%slipChar%%%k
remsetSoPrivateDirty=!SoPrivateDirty!%slipChar%%%l
remsetSoPrivateClean=!SoPrivateClean!%slipChar%%%m
)
if!cnt!EQU8(
setUnknownPSS=!UnknownPSS!%slipChar%%%j
echoUnknownPSS:%%j
remsetUnknownSize=!UnknownSize!%slipChar%%%l
remsetUnknownAllocated=!UnknownAllocated!%slipChar%%%l
remsetUnknownFree=!UnknownFree!%slipChar%%%l
)
if!cnt!EQU9(
setTotalPSS=!TotalPSS!%slipChar%%%j
echoTotalPSS:%%j
remsetTotalPrivateDirty=!TotalPrivateDirty!%slipChar%%%k
remsetTotalPrivateClean=!TotalPrivateClean!%slipChar%%%l
)
set/acnt+=1
)
Shell
FOR /F "skip=5 tokens=1,2,3,4,5,6,7,8" %%i in (%meminfoFile%)
1
FOR/F"skip=5 tokens=1,2,3,4,5,6,7,8"%%iin(%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
不精确