監測Android APP 佔用系統資源的情況 (純代碼獲取)

因為想測試自己做的APK在某一特別時刻所佔用的資源情況,所以就不用adb shell命令查看消耗信息--->直接在自己的apk當中監測。

方法都是在網上收集整理,希望靠譜吧! 如果有什麼不對請指正,小吉等受教育吐舌头~


1) 計算運算時間 

當你收到了老闆的一個任務要求時,你可以有幾多方法去實現,怎麼選用什麼方法呢?小吉的考慮有維護性 / 擴展性 / 執行時間 / 效能的佔用

我想當中運算的時間真的很重要,因為操作時間長一點點都會帶來很差的用戶體驗~ 我們一定要記住用戶就是一群沒耐性低智能的貪心鬼~抓狂

// Storing Start time 記錄初始時間
private int startTime = (int) System.currentTimeMillis();


/*****************
*
*	這裡就是放你執行方法的地方, 原理很簡單計算開始時間和結束時間的差距
*        (希望我的菜鳥兄弟們,別逗B的保留註釋符號,真把代碼敲在這框內!)       
*
*
*****************/

// Calculate execution time 計算開始時間和結束時間差
private int executionTime = (int) (System.currentTimeMillis() - startTime);

//Display time in Logcat 打印結果到Logcat 單位是微秒(1s = 1000ms) 
Log.i("ExcutionTime: ", String.valueOf(executionTime)+ "ms");

2) 測量內存耗用

利用ActivityManager 的 getSystemService(Context.ACTIVITY_SERVICE) 讀取內存信息

public Double getMemoryUsage(Context _context,int _Pid) {
	//Get current memory usage of the target apk 
	ActivityManager am = (ActivityManager) _context.getSystemService(Context.ACTIVITY_SERVICE);
	
	int[] mMempid = new int[] { _Pid };
	Debug.MemoryInfo[] memoryInfo = am.getProcessMemoryInfo(mMempid);
	Double memSize = (double) memoryInfo[0].getTotalPss();
	
	return memSize;
}

例子:
//獲取系統運行當前應用所產生的processesID
 int mPid = android.os.Process.myPid();
//調用監測
 Double memoryUsage  = getMemoryUsage(MainActivity.this, mPid);
//打印結果 單位是KB
Log.i("Memory Usage: ",String.valueOf(memoryUsage) + "kb");

3) 測量CPU佔用時間及計算佔用率

A.先計測量現行系統的CPU情況

  透過閱讀系統文件"/proc/stat"獲取 現行CPU占用時間(單位:微秒ms) , 為什麼下面的cpuInfos只取2-8~你自已把cpuInfos打印看一遍就明白了偷笑

private Double getTotalCpuTime() {
	String[] cpuInfos = null;
	try {
		//Read document"/proc/stat"(including CPU information:shows ticks for user, nice, sys, idle, iowait, irq and sirq)
		//閱讀 文件"/proc/stat"(當中包含了CPU資訊,後面的東西是Linux系統的東西,有興趣可以看下面的貼圖介紹)
		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("/proc/stat")), 1000);
		String load = reader.readLine();
		reader.close();
		cpuInfos = load.split(" ");
	} catch (IOException ex) {
		ex.printStackTrace();
	}
	Double totalCpu = Double.parseDouble(cpuInfos[2])
			+ Double.parseDouble(cpuInfos[3]) + Double.parseDouble(cpuInfos[4])
			+ Double.parseDouble(cpuInfos[6]) + Double.parseDouble(cpuInfos[5])
			+ Double.parseDouble(cpuInfos[7]) + Double.parseDouble(cpuInfos[8]);
	return totalCpu;
}

B. 再計測量目標APK的CPU情況

方法跟上面的大同小異,只是利用processesID去指定測量範圍(單位:微秒ms) 

private Double getAppCpuTime(int _Pid) {
	String[] cpuInfos = null;
	try {
		//Read CPU information of the current apk 在這裡加上 _PID 就是processesID囉
		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("/proc/" + _Pid + "/stat")), 1000);
		String load = reader.readLine();
		reader.close();
		cpuInfos = load.split(" ");
	} catch (IOException ex) {
		ex.printStackTrace();
	}
	Double appCpuTime = Double.parseDouble(cpuInfos[13])
			+ Double.parseDouble(cpuInfos[14]) + Double.parseDouble(cpuInfos[15])
			+ Double.parseDouble(cpuInfos[16]);
	return appCpuTime;
}

C. 最後計算CPU使用率---簡單的數學題目

CPU使用率(%) = (目標apk的cpu占用時間 / 總cpu占用時間)*100 , 嗯~因為一般APK不是占用CPU太跨張。。。所以這個比率出來會可能是很小數目,需要科學記數法才能表達~所以小吉自己喜歡只用目標APK所佔的CPU時間做參考~吐舌头

public Double getCpuUsage() {
	Double _totalTime = getTotalCpuTime();
	Double _targetAppTime = getAppCpuTime();
	Double _targetAppCpuUsage;

	//Count target apk Cpu usage rate
	_targetAppCpuUsage = (_targetAppTime/_totalTime) * 100;
	return _targetAppCpuUsage;
}


害羞就以上的東西小吉封包了一個監測資源的Class 原理是和上面一樣,就是調用方法有點小不同。下載看看

使用方法就是一般的new 對象傳入Context 和 Pid 就可以~

//實例對象
ResourceMangament _RM = new ResourceMangament(pid, MainActivity_GreenDAO.this);
// 獲取當前內存數據
Double _currentMemory = _RM.getMemoryUsage();
// 獲取當前CPU數據
Double _currentCpu = _RM.getCpuUsage();
// 打印結果
Log.d("Write Memory Usaged:", String.valueOf(_currentMemory)+ "KB");
Log.d("Write Cpu Usaged:", String.valueOf(_currentCpu) + "ms");

/******
***    如果不喜歡一直啪啪啪打印Log
***    還可以用下面的方法,小吉把所有數據存到一個ArrayList當中計算一個平均值:
******/

// 獲取內存平均使用量
Double _averMemoryUsage = _RM.getAverMemoryUsage();
// 獲取CPU平均使用時間
Double _averCpuTime = _RM.getAverCpuTime();
// 獲取CPU平均使用率
Double _averCpuUsage = _RM.getAverCpuUsage();
// 打印結果
Log.d("Write Average Memory Usaged:", String.valueOf(_averMemoryUsage)+ "KB");
Log.d("Write Average Cpu Time:", String.valueOf(_averCpuTime) + "ms");
Log.d("Write Average Cpu Usaged:", String.valueOf(_averCpuUsage) + "ms");

最後附上一張Linux CPU計算原理


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值