java - 如何使用Java反射调用隐藏的Android方法getTotalUss()?

标签 java android reflection

我使用的是针对 Android API 18 的 Android Studio 1.5.1(Android KitKat 4.4 之前的版本,因此我处理的是 Dalvik,而不是 ART 运行时)。

我的问题是:

  1. 如何调用Android隐藏方法getTotalUss()使用Java 反射?
  2. 如果不可能,如何以编程方式查找当前进程的USS(唯一集大小)内存?

我尝试使用下面的代码来执行此操作,但在标记为//ERROR! 的语句处收到编译器错误“意外标记”下面的代码中。

    ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
    ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
    activityManager.getMemoryInfo(memoryInfo);

    List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();

    Map<Integer, String> pidMap = new TreeMap<Integer, String>();
    for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses)
    {
        pidMap.put(runningAppProcessInfo.pid, runningAppProcessInfo.processName);
    }

    Collection<Integer> keys = pidMap.keySet();
    int id= android.os.Process.myPid();
    for(int key : keys)
    {
        if (key != id) continue;
        int pids[] = new int[1];
        int Uss;
        pids[0] = key;
        android.os.Debug.MemoryInfo[] memoryInfoArray = activityManager.getProcessMemoryInfo(pids);
        for(android.os.Debug.MemoryInfo pidMemoryInfo: memoryInfoArray)
        {
            try {

                Class c;
                c = Class.forName("android.app.ActivityManager");
                Method m = c.getMethod("getTotalUss", null);
                Uss = m.invoke(null,int); //             << == ERROR!
            } catch (ClassNotFoundException e) {
            }
            catch (NoSuchMethodException e) {
            }
            catch (IllegalAccessException e) {
            }

            System.out.println("** Uss =  " +  Uss);

最佳答案

您正在 ActivityManager 类上调用 getMethod(),该类不包含 getTotalUss() 方法。这就是您收到错误的原因。

相反,您需要从具有 getTotalUss() 方法的 MemoryInfo 类中反射性地获取该方法。您还需要确保将 pidMemoryInfo 作为接收者传递给 invoke() 调用。就像调用 pidMemoryInfo.getTotalUss() 一样。

Method m = android.os.Debug.MemoryInfo.class.getMethod("getTotalUss", null);
totalUss = (int) m.invoke(pidMemoryInfo,(Object[]) null);

请参阅方法的文档invoke()了解更多详情。

关于java - 如何使用Java反射调用隐藏的Android方法getTotalUss()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35076967/

相关文章:

java - 使用比较器对 Java TreeSet 进行排序

java - 在 2 个表中使用具有相同列名的 ResultSetMetaData

java - 改变锁对象

android - 显示在 ListView 上

java - 从 LinkedHashMap 获取有序 Stream

java - 如何使用反射循环子类中的字段

android - 意外的 e_type : 1 Linking release library using JNI + CMake + Android. mk

c# - 如何检查对象是否是某种类型的数组?

java - 使用 Class.forName 实例化参数化类型

Java通过接口(interface)反射提取泛型类型参数