我使用的是针对 Android API 18 的 Android Studio 1.5.1(Android KitKat 4.4 之前的版本,因此我处理的是 Dalvik,而不是 ART 运行时)。
我的问题是:
- 如何调用Android隐藏方法getTotalUss()使用Java 反射?
- 如果不可能,如何以编程方式查找当前进程的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/