【Android】获取当前的app中cpu和内存的百分比 -调研报告

背景

项目要求获取当前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的波动太大,不准确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值