背景
项目要求获取当前app运行时的cpu和内存状况。
调研
CPU获取
- Android实现获取当前的app的cpu实时使用情况的代码
以下是获取当前app的CPU实时使用情况的代码(Java):
private static final String TAG = "CPUUsage";
public static float getCPUUsage() {
try {
String pkgName = YourApplication.getInstance().getPackageName();
int pid = android.os.Process.myPid();
String path = "/proc/" + pid + "/stat";
BufferedReader reader = new BufferedReader(new FileReader(path));
String line = reader.readLine();
reader.close();
String[] tokens = line.split(" ");
long utime = Long.parseLong(tokens[13]);
long stime = Long.parseLong(tokens[14]);
long cutime = Long.parseLong(tokens[15]);
long cstime = Long.parseLong(tokens[16]);
long starttime = Long.parseLong(tokens[21]);
long totalTime = utime + stime + cutime + cstime;
long elapsedTime = SystemClock.elapsedRealtime() * 1000;
float cpuUsage = (totalTime / (float) (elapsedTime - starttime)) * 100;
Log.d(TAG, "CPU usage: " + cpuUsage);
return cpuUsage;
} catch (IOException e) {
Log.e(TAG, "Error getting CPU usage", e);
return 0;
}
}
此代码通过读取进程的
/proc/<pid>/stat
文件来获取CPU使用情况。其中,<pid>
为当前进程的 ID。CPU使用情况通过计算进程的用户时间(utime)、系统时间(stime)、子进程用户时间(cutime)和子进程系统时间(cstime)的总和,以及从系统启动到现在经过的时间(elapsedTime)和进程启动时刻(starttime)之间的差值来计算得出。最终的结果为百分比形式的CPU使用率。
以下是获取当前应用CPU实时使用情况的代码2:
public static float getCpuUsage() {
try {
RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r");
String[] cpuInfo = reader.readLine().split("\\s+");
long idle1 = Long.parseLong(cpuInfo[4]);
long cpu1 = Long.parseLong(cpuInfo[2]) + Long.parseLong(cpuInfo[3]) + Long.parseLong(cpuInfo[5])
+ Long.parseLong(cpuInfo[6]) + Long.parseLong(cpuInfo[7]) + Long.parseLong(cpuInfo[8]);
SystemClock.sleep(360);
reader.seek(0);
cpuInfo = reader.readLine().split("\\s+");
long idle2 = Long.parseLong(cpuInfo[4]);
long cpu2 = Long.parseLong(cpuInfo[2]) + Long.parseLong(cpuInfo[3]) + Long.parseLong(cpuInfo[5])
+ Long.parseLong(cpuInfo[6]) + Long.parseLong(cpuInfo[7]) + Long.parseLong(cpuInfo[8]);
return (float) (cpu2 - cpu1) / ((cpu2 + idle2) - (cpu1 + idle1)) * 100;
} catch (IOException ex) {
ex.printStackTrace();
return 0;
}
}
此代码将读取/ proc / stat文件以获取当前CPU使用情况。然后,它将等待360毫秒,然后重新读取文件以获取新的CPU使用情况。最后,它将计算两个时间戳之间的CPU使用率,并将其返回为百分比。请注意,此方法返回的值是当前应用程序的CPU使用率,而不是整个设备的CPU使用率。
效果
第一个方法可以实现获取到cpu的数据,但是不太准确。第二个方法压根儿就获取不到cpu数据。
内存获取
请你提供详细的 Android实现获取当前的app的内存实时使用情况的代码
以下是获取当前app的内存实时使用情况的代码(Java):
private static final String TAG = "MemoryUsage";
public static long getMemoryUsage() {
try {
String pkgName = YourApplication.getInstance().getPackageName();
ActivityManager activityManager = (ActivityManager) YourApplication.getInstance().getSystemService(Context.ACTIVITY_SERVICE);
Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo();
Debug.getMemoryInfo(memoryInfo);
int[] pids = new int[1];
pids[0] = android.os.Process.myPid();
Debug.MemoryInfo[] memoryInfos = activityManager.getProcessMemoryInfo(pids);
long memoryUsage = memoryInfos[0].getTotalPss() * 1024; // getTotalPss()返回值单位是KB,需要转换成字节
Log.d(TAG, "Memory usage of " + pkgName + " is " + memoryUsage + " bytes");
return memoryUsage;
} catch (Exception e) {
Log.e(TAG, "Failed to get memory usage", e);
return 0;
}
}
这个方法使用了Android系统的ActivityManager和Debug类来获取当前进程的内存信息,其中getTotalPss()方法返回的是当前进程占用的内存大小,单位是KB,因此需要乘以1024转换成字节。
- 以下是获取当前应用内存实时使用情况的代码2:
public static String getMemoryUsage(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
MemoryInfo memoryInfo = new MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
long usedMemory = memoryInfo.totalMem - memoryInfo.availMem;
float usedPercent = (float) usedMemory / memoryInfo.totalMem * 100;
return String.format("%.2f%%", usedPercent);
}
这个方法将返回应用程序当前使用的内存百分比,作为一个字符串。您可以在需要时调用此方法。例如:
String memoryUsage = getMemoryUsage(getApplicationContext());
Log.d("Memory Usage", memoryUsage);
请注意,此方法只返回当前应用程序的内存使用情况。如果您需要监视整个设备的内存使用情况,请考虑使用系统API,例如android.os.Debug.MemoryInfo
等。
请你提供详细的 Android实现获取当前的app的内存实时使用情况(百分比的返回形式)的代码
以下是获取当前应用内存实时使用情况的代码:
public static String getMemoryUsage(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
MemoryInfo memoryInfo = new MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
long totalMemory = memoryInfo.totalMem;
long availableMemory = memoryInfo.availMem;
long usedMemory = totalMemory - availableMemory;
double percentUsed = ((double) usedMemory / (double) totalMemory) * 100.0;
return String.format("%.2f%%", percentUsed);
}
这个方法接受一个上下文参数,返回一个字符串,表示当前应用程序的内存使用情况百分比。它使用
ActivityManager
类来获取当前设备的内存信息,然后计算使用的内存量和总内存量之间的比例,最后将其格式化为百分比形式的字符串,使用String.format()
方法。
上述两个方法获取内存的准确率都挺高的,基本满足产品要求。
总结
在android中内存的数据相对容易获取,但是cpu的波动太大,不准确。