監測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計算原理
- 監測Android APP 佔用系統資源的情況 (純代碼獲取)
- Android APP的发布
- Android APP的创意
- Android App的基本原理
- Android app的国际化
- Android APP的退出
- 类似makeit的android app
- eclipse导入android的app
- Android App的启动过程
- Android App的签名打包
- Android APP应用的背景
- android.app.Activity 的介绍
- android app widget的使用
- Android的App Widget实现
- Android App的签名打包
- Android App的签名打包
- Android APP的字体设置
- 开发 Android App 的工具
- 第六周项目阅读程序3,4,5
- 字符数组初始化问题
- 在不开启事件循环的线程中使用QTimer
- NGUI控件说明(中文) UIButton
- apk ipa sis 各是什么东西
- 監測Android APP 佔用系統資源的情況 (純代碼獲取)
- 线段树重开 HDU 1542(扫描线)
- CMOS内核--序言
- const疑问
- 如何实现字符串的反向输出
- Navicat 远程连接SQL Server 2014 Express 报08001错误
- NGUI控件说明(中文) UIToggle
- 【动态树】[BZOJ2002] Bounce 弹飞绵羊
- Android的theme主题中统一定义各种控件的style属性