我們可以使用代碼產生hprof,然後使用批處理hprof檔案,然後用Memory Analyzer tool(MAT)進行對多個hprof檔案比較分析。
一、批處理設定檔
批處理設定檔config.bat如下:rem the following var is for getProcessState.bat
set rawDatadir=rawDataset processName=android.process.acore;com.android.systemuirem set processShortName=a;b;cset processShortName=set outRoot=outset statFilePrefix=statrem the following var is for getHprof.batset tools=D:\SDK\android-sdk4.0\toolsset hpInputFileDir=/sdcardset hpInputFile=input.hprofset hpRoot=hpTemp
注1:rawDatadir為“ps -x”提取出來的檔案的目錄
注2:processName需要統計RSS的進程的名字,可以同時統計多個,進程名之間用“;”進行分割。
注3:processShortName需要統計RSS的進程的名字的縮寫形式,如果不坐設定或設定為空白,這程式會根據processName自動產生。
注4:outRoot為對進程的RSS進行統計最後的組建檔案的存放目錄。
注5:statFilePrefix為對進程的RSS進行統計最後的組建檔案的首碼。
注6:tools為hprof-conv.exe所在的目錄。
注7:hpInputFileDir為手機中我們產生的hprof檔案所在的目錄。
注8:hpInputFileDir為手機中我們產生的hprof檔案的名字。
二,需要使用的bat庫子目錄lib用於存放
bat庫需要的bat庫:genSerial.bat,getSubStr.bat。關於genSerial.bat請參看《genSerial》關於getSubStr.bat請參看《getSubStr》
三,在代碼中產生Hprof檔案:在android代碼,可以使用如下代碼把hprof檔案產生到sd卡上。Debug.dumpHprofData("/sdcard/input.hprof");可以不用sd卡,而將hprof檔案直接產生在手機上,但是只能在"/data/data/"+packageName的目錄下。
執行個體1: void generateHprof() {String packageName=getApplicationInfo().packageName;String hpFilePath="/data/data/"+packageName+"/input.hprof";try {//Debug.dumpHprofData("/sdcard/input.hprof");Debug.dumpHprofData(hpFilePath);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }
四,在電腦上通過批處理取轉換Hprof 檔案如果在程式中用Debug.dumpHprofData("/sdcard/input.hprof")的方式產生了hprof檔案,那麼就可以執行檔案getHprof .bat來取得Hprof並轉化為MemoryAnalyzer的格式。getHprof.bat檔案如下:@echo offcall config.batif exist %hpInputFile% (del %hpInputFile% /q)adb pull %hpInputFileDir%/%hpInputFile% .if not exist %hpInputFile% (echo fail to pull %hpInputFile%exit 1)if not exist %hpRoot% (md %hpRoot%)Setlocal enabledelayedexpansionset path=%path%;%cd%\libcall genSerialset serial=!genSerial~result!set hpOutFile=%serial%.hprof%tools%\hprof-conv.exe %hpInputFile% %hpRoot%\%hpOutFile%echo success!endlocal
注1:需要在代碼中先產生hprof檔案,而且config.bat中配置的路徑要和在代碼中先產生hprof檔案的路徑一致。
注2:如果需要連續多次以固定的時間提取hprof檔案,請參照《Android記憶體泄露利器(全自動篇)》
注意3:需要把bat庫genSerial.bat,getSubStr.bat放在子目錄lib中。關於它們的更多內容請參考《getSubStr》,《genSerial》關於更多的Android記憶體泄露利器請閱讀《Android記憶體泄露利器(RSS記憶體統計篇)》,《Android記憶體泄露利器(記憶體統計篇)》,《Android記憶體泄露利器(全自動篇)》