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

来源:互联网 发布:安顺行知高中地址 编辑:程序博客网 时间:2024/06/06 20:23

因為想測試自己做的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);//打印結果 單位是KBLog.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
原创粉丝点击