diff options
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerShellCommand.java | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 4bbfa3eec67d..d39a977785fd 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -49,10 +49,12 @@ import android.app.BroadcastOptions; import android.app.IActivityController; import android.app.IActivityManager; import android.app.IActivityTaskManager; +import android.app.IProcessObserver; import android.app.IStopUserCallback; import android.app.IUidObserver; import android.app.IUserSwitchObserver; import android.app.KeyguardManager; +import android.app.ProcessStateEnum; import android.app.ProfilerInfo; import android.app.RemoteServiceException.CrashedByAdbException; import android.app.UserSwitchObserver; @@ -359,6 +361,8 @@ final class ActivityManagerShellCommand extends ShellCommand { return runSetBgRestrictionLevel(pw); case "get-bg-restriction-level": return runGetBgRestrictionLevel(pw); + case "observe-foreground-process": + return runGetCurrentForegroundProcess(pw, mInternal, mTaskInterface); default: return handleDefaultCommands(cmd); } @@ -3208,6 +3212,82 @@ final class ActivityManagerShellCommand extends ShellCommand { return -1; } + private int runGetCurrentForegroundProcess(PrintWriter pw, + IActivityManager iam, IActivityTaskManager iatm) + throws RemoteException { + + ProcessObserver observer = new ProcessObserver(pw, iam, iatm, mInternal); + iam.registerProcessObserver(observer); + + final InputStream mInput = getRawInputStream(); + InputStreamReader converter = new InputStreamReader(mInput); + BufferedReader in = new BufferedReader(converter); + String line; + try { + while ((line = in.readLine()) != null) { + boolean addNewline = true; + if (line.length() <= 0) { + addNewline = false; + } else if ("q".equals(line) || "quit".equals(line)) { + break; + } else { + pw.println("Invalid command: " + line); + } + if (addNewline) { + pw.println(""); + } + pw.flush(); + } + } catch (IOException e) { + e.printStackTrace(); + pw.flush(); + } finally { + iam.unregisterProcessObserver(observer); + } + return 0; + } + + static final class ProcessObserver extends IProcessObserver.Stub { + + private PrintWriter mPw; + private IActivityManager mIam; + private IActivityTaskManager mIatm; + private ActivityManagerService mInternal; + + ProcessObserver(PrintWriter mPw, IActivityManager mIam, + IActivityTaskManager mIatm, ActivityManagerService ams) { + this.mPw = mPw; + this.mIam = mIam; + this.mIatm = mIatm; + this.mInternal = ams; + } + + @Override + public void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities) { + if (foregroundActivities) { + try { + int prcState = mIam.getUidProcessState(uid, "android"); + int topPid = mInternal.getTopApp().getPid(); + if (prcState == ProcessStateEnum.TOP && topPid == pid) { + mPw.println("New foreground process: " + pid); + } + mPw.flush(); + } catch (RemoteException e) { + mPw.println("Error occurred in binder call"); + mPw.flush(); + } + } + } + + @Override + public void onForegroundServicesChanged(int pid, int uid, int serviceTypes) { + } + + @Override + public void onProcessDied(int pid, int uid) { + } + } + private int runSetMemoryFactor(PrintWriter pw) throws RemoteException { final String levelArg = getNextArgRequired(); @MemFactor int level = ADJ_MEM_FACTOR_NOTHING; |