ActivityManagerShellCommand.java revision 09a88f5f3e7d4a3bbfce04ac06594ac590c67d27
1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.server.am; 18 19import android.app.IActivityManager; 20import android.os.RemoteException; 21import android.os.ShellCommand; 22import android.os.UserHandle; 23 24import com.android.internal.util.ArrayUtils; 25 26import java.io.PrintWriter; 27 28class ActivityManagerShellCommand extends ShellCommand { 29 // IPC interface to activity manager -- don't need to do additional security checks. 30 final IActivityManager mInterface; 31 32 // Internal service impl -- must perform security checks before touching. 33 final ActivityManagerService mInternal; 34 35 final boolean mDumping; 36 37 ActivityManagerShellCommand(ActivityManagerService service, boolean dumping) { 38 mInterface = service; 39 mInternal = service; 40 mDumping = dumping; 41 } 42 43 @Override 44 public int onCommand(String cmd) { 45 if (cmd == null) { 46 return handleDefaultCommands(cmd); 47 } 48 PrintWriter pw = getOutPrintWriter(); 49 try { 50 switch (cmd) { 51 case "force-stop": 52 return runForceStop(pw); 53 case "kill": 54 return runKill(pw); 55 case "kill-all": 56 return runKillAll(pw); 57 case "write": 58 return runWrite(pw); 59 case "track-associations": 60 return runTrackAssociations(pw); 61 case "untrack-associations": 62 return runUntrackAssociations(pw); 63 case "is-user-stopped": 64 return runIsUserStopped(pw); 65 default: 66 return handleDefaultCommands(cmd); 67 } 68 } catch (RemoteException e) { 69 pw.println("Remote exception: " + e); 70 } 71 return -1; 72 } 73 74 int runIsUserStopped(PrintWriter pw) { 75 int userId = UserHandle.parseUserArg(getNextArgRequired()); 76 boolean stopped = mInternal.isUserStopped(userId); 77 pw.println(stopped); 78 return 0; 79 } 80 81 int runForceStop(PrintWriter pw) throws RemoteException { 82 int userId = UserHandle.USER_ALL; 83 84 String opt; 85 while ((opt = getNextOption()) != null) { 86 if (opt.equals("--user")) { 87 userId = UserHandle.parseUserArg(getNextArgRequired()); 88 } else { 89 pw.println("Error: Unknown option: " + opt); 90 return -1; 91 } 92 } 93 mInterface.forceStopPackage(getNextArgRequired(), userId); 94 return 0; 95 } 96 97 int runKill(PrintWriter pw) throws RemoteException { 98 int userId = UserHandle.USER_ALL; 99 100 String opt; 101 while ((opt=getNextOption()) != null) { 102 if (opt.equals("--user")) { 103 userId = UserHandle.parseUserArg(getNextArgRequired()); 104 } else { 105 pw.println("Error: Unknown option: " + opt); 106 return -1; 107 } 108 } 109 mInterface.killBackgroundProcesses(getNextArgRequired(), userId); 110 return 0; 111 } 112 113 int runKillAll(PrintWriter pw) throws RemoteException { 114 mInterface.killAllBackgroundProcesses(); 115 return 0; 116 } 117 118 int runWrite(PrintWriter pw) { 119 mInternal.enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER, 120 "registerUidObserver()"); 121 mInternal.mRecentTasks.flush(); 122 pw.println("All tasks persisted."); 123 return 0; 124 } 125 126 int runTrackAssociations(PrintWriter pw) { 127 mInternal.enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER, 128 "registerUidObserver()"); 129 synchronized (mInternal) { 130 if (!mInternal.mTrackingAssociations) { 131 mInternal.mTrackingAssociations = true; 132 pw.println("Association tracking started."); 133 } else { 134 pw.println("Association tracking already enabled."); 135 } 136 } 137 return 0; 138 } 139 140 int runUntrackAssociations(PrintWriter pw) { 141 mInternal.enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER, 142 "registerUidObserver()"); 143 synchronized (mInternal) { 144 if (mInternal.mTrackingAssociations) { 145 mInternal.mTrackingAssociations = false; 146 mInternal.mAssociations.clear(); 147 pw.println("Association tracking stopped."); 148 } else { 149 pw.println("Association tracking not running."); 150 } 151 } 152 return 0; 153 } 154 155 @Override 156 public void onHelp() { 157 PrintWriter pw = getOutPrintWriter(); 158 dumpHelp(pw, mDumping); 159 } 160 161 static void dumpHelp(PrintWriter pw, boolean dumping) { 162 if (dumping) { 163 pw.println("Activity manager dump options:"); 164 pw.println(" [-a] [-c] [-p PACKAGE] [-h] [WHAT] ..."); 165 pw.println(" WHAT may be one of:"); 166 pw.println(" a[ctivities]: activity stack state"); 167 pw.println(" r[recents]: recent activities state"); 168 pw.println(" b[roadcasts] [PACKAGE_NAME] [history [-s]]: broadcast state"); 169 pw.println(" i[ntents] [PACKAGE_NAME]: pending intent state"); 170 pw.println(" p[rocesses] [PACKAGE_NAME]: process state"); 171 pw.println(" o[om]: out of memory management"); 172 pw.println(" perm[issions]: URI permission grant state"); 173 pw.println(" prov[iders] [COMP_SPEC ...]: content provider state"); 174 pw.println(" provider [COMP_SPEC]: provider client-side state"); 175 pw.println(" s[ervices] [COMP_SPEC ...]: service state"); 176 pw.println(" as[sociations]: tracked app associations"); 177 pw.println(" service [COMP_SPEC]: service client-side state"); 178 pw.println(" package [PACKAGE_NAME]: all state related to given package"); 179 pw.println(" all: dump all activities"); 180 pw.println(" top: dump the top activity"); 181 pw.println(" WHAT may also be a COMP_SPEC to dump activities."); 182 pw.println(" COMP_SPEC may be a component name (com.foo/.myApp),"); 183 pw.println(" a partial substring in a component name, a"); 184 pw.println(" hex object identifier."); 185 pw.println(" -a: include all available server state."); 186 pw.println(" -c: include client state."); 187 pw.println(" -p: limit output to given package."); 188 } else { 189 pw.println("Activity manager (activity) commands:"); 190 pw.println(" help"); 191 pw.println(" Print this help text."); 192 pw.println(" force-stop [--user <USER_ID> | all | current] <PACKAGE>"); 193 pw.println(" Complete stop the given application package."); 194 pw.println(" kill [--user <USER_ID> | all | current] <PACKAGE>"); 195 pw.println(" Kill all processes associated with the given application."); 196 pw.println(" kill-all"); 197 pw.println(" Kill all processes that are safe to kill (cached, etc)"); 198 pw.println(" write"); 199 pw.println(" Write all pending state to storage."); 200 pw.println(" track-associations"); 201 pw.println(" Enable association tracking."); 202 pw.println(" untrack-associations"); 203 pw.println(" Disable and clear association tracking."); 204 pw.println(" is-user-stopped <USER_ID>"); 205 pw.println(" returns whether <USER_ID> has been stopped or not"); 206 } 207 } 208} 209