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

时间:2016-01-29 04:35:55

标签: java android reflection

我使用Android Studio 1.5.1定位Android API 18(在Android KitKat 4.4之前,所以我正在处理Dalvik,而不是ART运行时)。

我的问题是:

  1. 如何使用Java调用隐藏的Android方法getTotalUss() 反射?
  2. 如果不可能,如何以编程方式找到当前进程USS(唯一集大小)内存?
  3. 我正在尝试使用下面的代码来执行此操作,但我在标记为// ERROR的语句中收到编译器错误“Unexpected token”!在下面的代码中。

        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);
    

1 个答案:

答案 0 :(得分:0)

您在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);

有关详细信息,请参阅方法&#39; invoke()的文档。