因為想測試自己做的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計算原理