当前位置: 代码迷 >> Android >> Android CPU监控主意,思路,核心技术和代码
  详细解决方案

Android CPU监控主意,思路,核心技术和代码

热度:10   发布时间:2016-04-28 07:34:53.0
Android CPU监控想法,思路,核心技术和代码
核心算法描述:

第一步:获取正在运行的进程, 保存在集合当中 : List<IsRunningAppInfo> appList

第二步:读取总使用的CPU,  路径在  private static String path = "/proc/stat";

第三步:读取所有运行进程CPU,路径在  "/proc/" + pid + "/stat";  //pid为进程号

第四步:读取所有运行线程CPU,路径在 "/proc/" + pid + "/task" + tid +"/stat";   //pid为进程号,tid为线程号

第五步:读取好文件的信息,分别保存在不同集合当中,然后回调回去,存入数据库(根据需求,可灵活运用),避免一边读取文件,一边保存数据库当中,不然将耗费大量的时间,产生的误差特别的大

第六步:数据的内容保存好后,到另外一个activity中,从数据库中读取数据,并列表显示出数据。
注意:读取的时候,可能会碰到读取文件的内容的时候,还没有读好(算所占比例的时候会出现出现“除数为0”),需要定义一个handle,在handle当中读取数据(读的过程中,判断是否数据存储完毕),并显示读取的数据,不能在activity当中不然会出现“AndroidRunTime”错误。



获取正在运行的进程:
	/**	 * 获取正在运行的进程	 * 	 * @return	 */	public List<IsRunningAppInfo> queryRunningApp() {		List<IsRunningAppInfo> listRunApp = new ArrayList<IsRunningAppInfo>();		am = (ActivityManager) context				.getSystemService(Context.ACTIVITY_SERVICE);		List<RunningAppProcessInfo> list = am.getRunningAppProcesses();		RunningAppProcessInfo runningPro = null;		IsRunningAppInfo appInfo = null;		for (int i = 0; i < list.size(); i++) {			runningPro = list.get(i);			appInfo = new IsRunningAppInfo();			appInfo.setPid(runningPro.pid);			appInfo.setProcessName(runningPro.processName);			appInfo.setUid(runningPro.uid);			pkgManager(appInfo);			listRunApp.add(appInfo);		}		return listRunApp;	}	/**	 * 获取应用程序的 程序名,图标	 * 	 * @param appInfo	 * @throws NameNotFoundException	 */	public void pkgManager(IsRunningAppInfo appInfo) {		try {			PackageManager pm = context.getPackageManager();			PackageInfo pkInfo;			pkInfo = pm.getPackageInfo(appInfo.getProcessName(), 0);			appInfo.setIcon(pkInfo.applicationInfo.loadIcon(pm));			appInfo.setAppName(pkInfo.applicationInfo.loadLabel(pm).toString());		} catch (NameNotFoundException e) {			e.printStackTrace();		}	}读取CPU文件:	public void cpuMain() {		sqliteHelp				.clearAllTableData(new String[] {						Config.TBL_CPUMONITOR_PROCESSCPU,						Config.TBL_CPUMONITOR_TheadCPU,						Config.TBL_CPUMONITOR_TOTALCPU }); // 在读取文件前清空所有表数据		R_W_File rw = new R_W_File();		rw.clearFileData(new File(rw.getSdcardPath(), "result.txt"));		i = 0;		while (i < 2) {			queryRunningApp(); // 获取正在运行的应用程序信息			if (i == 0) {				readTotalCPU(i); // 捕捉时,总CPU			}			readProcessCPU(i); // 进程CPU--->线程CPU			readThreadCPU(i);			i++;		}	}	/**	 * 获取正在运行的应用程序	 */	protected void queryRunningApp() {		IsRunningAppProgress pro = new IsRunningAppProgress(context);		appList = pro.queryRunningApp();	}	/**	 * 总CPU使用量	 */	protected void readTotalCPU(int i) {		AsyncTask_TotalCPU taskTotalCPU = new AsyncTask_TotalCPU(context);		taskTotalCPU.execute(i, null, null);	}	/**	 * 进程CPU	 */	protected void readProcessCPU(int i) {		AsyncTask_ProgressCPU taskProcessCPU = null;		taskProcessCPU = new AsyncTask_ProgressCPU(new ProcessCallback(),				appList);		taskProcessCPU.execute(i, null, null);	}	/**	 * 线程CPU	 */	protected void readThreadCPU(int i) {		AsyncTask_TheadCPU taskThreadCPU = new AsyncTask_TheadCPU(				new ThreadCallback(), appList);		taskThreadCPU.execute(i, null, null);	}	/**	 * 回调方法	 */	class ThreadCallback implements ICallbacks {		@Override		public <T> void call(T t1, T t2) {			if ((Integer) t2 == 1) {				readTotalCPU(1); // 捕捉时,总CPU			}			@SuppressWarnings("unchecked")			Map<String[], IsRunningAppInfo> saveThreadCPUMap = (Map<String[], IsRunningAppInfo>) t1;			saveThreadData(saveThreadCPUMap, (Integer) t2);		}	}	/**	 * 回调方法	 */	class ProcessCallback implements ICallbacks {		@Override		public <T> void call(T t1, T t2) {			@SuppressWarnings("unchecked")			Map<String[], IsRunningAppInfo> saveProCPUMap = (Map<String[], IsRunningAppInfo>) t1;			saveProData(saveProCPUMap, (Integer) t2);		}	}	public void saveThreadData(			Map<String[], IsRunningAppInfo> saveThreadCPUMap, int j) {		Set<String[]> key = saveThreadCPUMap.keySet();		Iterator<String[]> it = key.iterator();		String[] str = null;		IsRunningAppInfo appInfo = null;		ContentValues cv = null;		while (it.hasNext()) {			str = it.next();			appInfo = saveThreadCPUMap.get(str);			cv = new ContentValues();			cv.put("processName", appInfo.getProcessName());			cv.put("pid", appInfo.getPid());			cv.put("tid", Long.valueOf(str[0]));			cv.put("utime", Long.valueOf(str[13]));			cv.put("stime", Long.valueOf(str[14]));			cv.put("numTimes", j);			sqliteHelp.append(Config.TBL_CPUMONITOR_TheadCPU, cv);		}		if (j == 1) {			writeData();		}	}	/**	 * 保存进程数据	 * 	 * @param saveProCPUMap	 * @param j	 */	private void saveProData(Map<String[], IsRunningAppInfo> saveProCPUMap,			int j) {		Set<String[]> key = saveProCPUMap.keySet();		Iterator<String[]> it = key.iterator();		String[] str = null;		IsRunningAppInfo runApp = null;		ContentValues cv = null;		while (it.hasNext()) {			str = it.next();			runApp = saveProCPUMap.get(str);			cv = new ContentValues();			if (runApp.getIcon() == null) {				cv.put("icon",						FormatImage.getInstace().getDrawableToByte(								context.getResources().getDrawable(										R.drawable.ic_launcher_default)));			} else				cv.put("icon",						FormatImage.getInstace().getDrawableToByte(								runApp.getIcon()));			if (runApp.getAppName() == null || runApp.getAppName().equals("")) {				cv.put("appName", runApp.getProcessName());			} else				cv.put("appName", runApp.getAppName());			cv.put("processName", runApp.getProcessName());			cv.put("pid", runApp.getPid());			cv.put("utime", str[13]);			cv.put("stime", str[14]);			cv.put("cutime", str[15]);			cv.put("cstime", str[16]);			cv.put("numTimes", j);			sqliteHelp.append(Config.TBL_CPUMONITOR_PROCESSCPU, cv);		}		if (j == 1) {			writeData();		}	}	public void writeData() {		try {			R_W_File files = new R_W_File();			File mFile = new File(files.getSdcardPath(), "result.txt");			files.writeFileDataAtTail(mFile, "1");		} catch (IOException e) {			e.printStackTrace();		}	}}显示CPU列表数据:public View getView(int position, View convertView, ViewGroup parent) {		ProcessCPU pro = list.get(position);		if (convertView == null) {			convertView = inflater.inflate(layoutId, null);			appView = new AppView(convertView);			convertView.setTag(appView);		} else {			appView = (AppView) convertView.getTag();		}		appView.pkgName.setText(pro.getProcessName());		appView.appIcon.setBackgroundDrawable(pro.getIcon()); // 图标		appView.appName.setText(pro.getAppName()); // 应用名		appView.pb.setMax(100);		if (pro.getProcessName().equals("system"))			Log.e("systemValue:" + pro.getUtime() + "  ==totalCPU:" + totalCPU);		double schedule = Double.valueOf(String.format("%.2f", pro.getUtime()				* 100.00 / totalCPU));		appView.pb.setProgress((int) schedule);		appView.tvPb.setText("" + schedule + "%");		return convertView;	}handle中读取并显示数据:	@Override	public void handleMessage(Message msg) {		super.handleMessage(msg);		dialog = (Dialog) msg.obj;		queryTotalCPU();		queryProcessList();		if (adapterCpuChart == null) {			adapterCpuChart = new Adapter_cpu_chart(context,					R.layout.adapter_cpu_chart, list, totalCPU);		}		lvChart.setAdapter(adapterCpuChart);		adapterCpuChart.notifyDataSetChanged();		pbBar.closeDialogProgressBar(dialog);	}	/**	 * 查找总共CPU时间片 每次进行数据查询的时候,将表中的数据重新请空	 */	public void queryTotalCPU() {		sql = "select (max(num1)-min(num1)) as total from "				+ "(select (t.user+t.nice+t.system+t.iowait+t.irq+t.softirq+t.stealstolen+t.guest) as num1 "				+ "from TotalCPU t)";		cursor = sqliteHelp.query(sql);		int index = -1;		long allValue = -1;		long ownValue = -1;		long ownThreadCPU = -1;		if (cursor.moveToFirst()) {			index = cursor.getColumnIndex("total");			allValue = cursor.getLong(index);		}		sqliteHelp.closeDb();		sql = "select  (max(num2)-min(num2)) as ownCPU from (select (p.utime+p.stime+p.cstime+p.cutime) as num2 "				+ "from ProcessCPU p "				+ "where p.processName='"				+ pkgName				+ "') ";		cursor = sqliteHelp.query(sql);		if (cursor.moveToFirst()) {			index = cursor.getColumnIndex("ownCPU");			ownValue = cursor.getLong(index);		}		sqliteHelp.closeDb();		sql = "select  max(num3)-min(num3) as ownThreadCPU "				+ "from (select (t.utime+t.stime) as num3 "				+ "from ThreadCPU t " + "where t.processName='" + pkgName				+ "') ";		cursor = sqliteHelp.query(sql);		if (cursor.moveToFirst()) {			index = cursor.getColumnIndex("ownThreadCPU");			ownThreadCPU = cursor.getLong(index);		}		sqliteHelp.closeDb();		totalCPU = (allValue - ownValue - ownThreadCPU);		Log.e("allValue:" + allValue + "  " + " ownValue:" + ownValue				+ "  ownThreadCPU" + ownThreadCPU);	}	/**	 * 查找所有进程的CPU时间片	 */	public void queryProcessList() {		sql = "select p.processName,p.appName,p.icon,sum(temp.utime) as utime "				+ "from (select processName,(max(utime)-min(utime)) as utime "				+ "from (select processName,appName,icon, (utime+stime+cutime+cstime) as utime "				+ "from ProcessCPU where processName <> '"				+ pkgName				+ "' and numTimes=0 "				+ "union all "				+ "select processName,appName,icon, (utime+stime+cutime+cstime) as utime "				+ "from ProcessCPU where processName <> '"				+ pkgName				+ "' and numTimes=1 ) "				+ "group by processName "				+ "union all select processName,(max(utime)-min(utime)) as utime "				+ "from (select processName, sum(utime+stime) as utime "				+ "from ThreadCPU where processName <> '"				+ pkgName				+ "' and numTimes=0 "				+ "group by processName union all select processName, sum(utime+stime) as utime "				+ "from ThreadCPU where processName <> '"				+ pkgName				+ "' and numTimes=1 "				+ "group by processName) group by processName) as temp,ProcessCPU p "				+ "where p.processName=temp.processName group by p.processName "				+ "order by utime desc limit 10";		list = new ArrayList<ProcessCPU>();		cursor = sqliteHelp.query(sql);		ProcessCPU proCPU = null;		if (cursor.moveToFirst()) {			do {				proCPU = new ProcessCPU();				int processName = cursor.getColumnIndex("processName");				int appName = cursor.getColumnIndex("appName");				int icon = cursor.getColumnIndex("icon");				int utime = cursor.getColumnIndex("utime");				proCPU.setAppName(cursor.getString(appName));				proCPU.setProcessName(cursor.getString(processName));				proCPU.setIcon(FormatImage.getInstace().getByteToDrawable(						cursor.getBlob(icon)));				proCPU.setUtime(cursor.getLong(utime));				list.add(proCPU);			} while (cursor.moveToNext());		}		sqliteHelp.closeDb();	}读取进程CPU:public void readFile() {		String[] str = null;		for (int i = 0; i < list.size(); i++) {			runApp = list.get(i);			file = new File(getPath(runApp.getPid()));			try {				fis = new FileInputStream(file);				br = new BufferedReader(new InputStreamReader(fis));				String readLine;				while ((readLine = br.readLine()) != null) {					str = readLine.split(" ");				}				br.close();				fis.close();			} catch (FileNotFoundException e) {				e.printStackTrace();			} catch (IOException e) {				e.printStackTrace();			}			saveProCPUMap.put(str, runApp);		}	}	/**	 * 获取每个进程的 文件路径	 * 	 * @param pid	 * @return	 */	public String getPath(long pid) {		return "/proc/" + pid + "/stat";	}读取线程CPU:	public void queryThreadCPU(List<IsRunningAppInfo> list) throws IOException {		for (int i = 0; i < list.size(); i++) {			IsRunningAppInfo appInfo = list.get(i);			queryThreadCPU(appInfo);		}	}	/**	 * 根据每一个pid获取CPU使用率	 * 	 * @param pid	 * @return	 * @throws IOException	 */	public void queryThreadCPU(IsRunningAppInfo appInfo) throws IOException {		path = "/proc/" + appInfo.getPid() + "/task";		file = new File(path);		if (file.exists() && file != null) {			files = file.listFiles();			if (files != null) {				queryThreadCPU(files, appInfo);			}		}	}	/**	 * 查询某一个进程的 线程CPU使用情况	 * 	 * @param files	 * @return	 * @throws IOException	 */	private void queryThreadCPU(File[] files, IsRunningAppInfo appInfo)			throws IOException {		String readLine;		String[] tStr = null;		for (int i = 0; i < files.length; i++) {			File f = files[i];			path = f.getPath() + "/stat";			file = new File(path);			fis = new FileInputStream(file);			br = new BufferedReader(new InputStreamReader(fis));			while ((readLine = br.readLine()) != null) {				tStr = readLine.split(" ");			}		}		saveThreadCPUMap.put(tStr, appInfo);	}	@Override	protected void onPostExecute(Void result) {		super.onPostExecute(result);	}读取总CPU:	public Long readFile() {		String[] str = null;		file = new File(path);		try {			fis = new FileInputStream(file);			br = new BufferedReader(new InputStreamReader(fis));			String readLine;			if ((readLine = br.readLine()) != null) {				str = readLine.split(" ");			}			br.close();			fis.close();		} catch (FileNotFoundException e) {			e.printStackTrace();		} catch (IOException e) {			e.printStackTrace();		}		return changeArray(str);	}	private Long changeArray(String[] str) {		Log.e("长度:" + str.length);		ContentValues cv = new ContentValues();		cv.put("user", Long.valueOf(str[2]));		cv.put("nice", Long.valueOf(str[3]));		cv.put("system", Long.valueOf(str[4]));		cv.put("idle", Long.valueOf(str[5]));		cv.put("iowait", Long.valueOf(str[6]));		cv.put("irq", Long.valueOf(str[7]));		cv.put("softirq", Long.valueOf(str[8]));		cv.put("stealstolen", Long.valueOf(str[9]));		cv.put("guest", Long.valueOf(str[10]));		cv.put("numTimes", i);		return sqliteHelp.append(Config.TBL_CPUMONITOR_TOTALCPU, cv);	}


  相关解决方案