Loading core/java/android/app/ActivityThread.java +16 −0 Original line number Diff line number Diff line Loading @@ -974,6 +974,10 @@ public final class ActivityThread { sendMessage(H.DUMP_HEAP, dhd, managed ? 1 : 0, 0, true /*async*/); } public void attachAgent(String agent) { sendMessage(H.ATTACH_AGENT, agent); } public void setSchedulingGroup(int group) { // Note: do this immediately, since going into the foreground // should happen regardless of what pending work we have to do Loading Loading @@ -1408,6 +1412,7 @@ public final class ActivityThread { public static final int MULTI_WINDOW_MODE_CHANGED = 152; public static final int PICTURE_IN_PICTURE_MODE_CHANGED = 153; public static final int LOCAL_VOICE_INTERACTION_STARTED = 154; public static final int ATTACH_AGENT = 155; String codeToString(int code) { if (DEBUG_MESSAGES) { Loading Loading @@ -1464,6 +1469,7 @@ public final class ActivityThread { case MULTI_WINDOW_MODE_CHANGED: return "MULTI_WINDOW_MODE_CHANGED"; case PICTURE_IN_PICTURE_MODE_CHANGED: return "PICTURE_IN_PICTURE_MODE_CHANGED"; case LOCAL_VOICE_INTERACTION_STARTED: return "LOCAL_VOICE_INTERACTION_STARTED"; case ATTACH_AGENT: return "ATTACH_AGENT"; } } return Integer.toString(code); Loading Loading @@ -1718,6 +1724,8 @@ public final class ActivityThread { case LOCAL_VOICE_INTERACTION_STARTED: handleLocalVoiceInteractionStarted((IBinder) ((SomeArgs) msg.obj).arg1, (IVoiceInteractor) ((SomeArgs) msg.obj).arg2); case ATTACH_AGENT: handleAttachAgent((String) msg.obj); break; } Object obj = msg.obj; Loading Loading @@ -2987,6 +2995,14 @@ public final class ActivityThread { } } static final void handleAttachAgent(String agent) { try { VMDebug.attachAgent(agent); } catch (IOException e) { Slog.e(TAG, "Attaching agent failed: " + agent); } } private static final ThreadLocal<Intent> sCurrentBroadcastIntent = new ThreadLocal<Intent>(); /** Loading core/java/android/app/ApplicationThreadNative.java +16 −0 Original line number Diff line number Diff line Loading @@ -502,6 +502,14 @@ public abstract class ApplicationThreadNative extends Binder return true; } case ATTACH_AGENT_TRANSACTION: { data.enforceInterface(IApplicationThread.descriptor); String agent = data.readString(); attachAgent(agent); return true; } case DUMP_ACTIVITY_TRANSACTION: { data.enforceInterface(IApplicationThread.descriptor); ParcelFileDescriptor fd = data.readFileDescriptor(); Loading Loading @@ -1305,6 +1313,14 @@ class ApplicationThreadProxy implements IApplicationThread { data.recycle(); } public void attachAgent(String agent) throws RemoteException { Parcel data = Parcel.obtain(); data.writeInterfaceToken(IApplicationThread.descriptor); data.writeString(agent); mRemote.transact(ATTACH_AGENT_TRANSACTION, data, null, IBinder.FLAG_ONEWAY); data.recycle(); } public void setCoreSettings(Bundle coreSettings) throws RemoteException { Parcel data = Parcel.obtain(); data.writeInterfaceToken(IApplicationThread.descriptor); Loading core/java/android/app/IApplicationThread.java +2 −0 Original line number Diff line number Diff line Loading @@ -123,6 +123,7 @@ public interface IApplicationThread extends IInterface { throws RemoteException; void dumpHeap(boolean managed, String path, ParcelFileDescriptor fd) throws RemoteException; void attachAgent(String path) throws RemoteException; void setSchedulingGroup(int group) throws RemoteException; // the package has been removed, clean up internal references static final int PACKAGE_REMOVED = 0; Loading Loading @@ -225,4 +226,5 @@ public interface IApplicationThread extends IInterface { int SCHEDULE_MULTI_WINDOW_CHANGED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+58; int SCHEDULE_PICTURE_IN_PICTURE_CHANGED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+59; int SCHEDULE_LOCAL_VOICE_INTERACTION_STARTED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+60; int ATTACH_AGENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+61; } core/java/android/os/ShellCommand.java +1 −1 Original line number Diff line number Diff line Loading @@ -274,7 +274,7 @@ public abstract class ShellCommand { /** * Implement parsing and execution of a command. If it isn't a command you understand, * call {@link #handleDefaultCommands(String)} and return its result as a last resort. * User {@link #getNextOption()}, {@link #getNextArg()}, and {@link #getNextArgRequired()} * Use {@link #getNextOption()}, {@link #getNextArg()}, and {@link #getNextArgRequired()} * to process additional command line arguments. Command output can be written to * {@link #getOutPrintWriter()} and errors to {@link #getErrPrintWriter()}. * Loading services/core/java/com/android/server/am/ActivityManagerService.java +25 −0 Original line number Diff line number Diff line Loading @@ -22278,4 +22278,29 @@ public final class ActivityManagerService extends ActivityManagerNative // before the profile user is unlocked. return rInfo != null && rInfo.activityInfo != null; } /** * Attach an agent to the specified process (proces name or PID) */ public void attachAgent(String process, String path) { try { synchronized (this) { ProcessRecord proc = findProcessLocked(process, UserHandle.USER_SYSTEM, "attachAgent"); if (proc == null || proc.thread == null) { throw new IllegalArgumentException("Unknown process: " + process); } boolean isDebuggable = "1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0")); if (!isDebuggable) { if ((proc.info.flags & ApplicationInfo.FLAG_DEBUGGABLE) == 0) { throw new SecurityException("Process not debuggable: " + proc); } } proc.thread.attachAgent(path); } } catch (RemoteException e) { throw new IllegalStateException("Process disappeared"); } } } Loading
core/java/android/app/ActivityThread.java +16 −0 Original line number Diff line number Diff line Loading @@ -974,6 +974,10 @@ public final class ActivityThread { sendMessage(H.DUMP_HEAP, dhd, managed ? 1 : 0, 0, true /*async*/); } public void attachAgent(String agent) { sendMessage(H.ATTACH_AGENT, agent); } public void setSchedulingGroup(int group) { // Note: do this immediately, since going into the foreground // should happen regardless of what pending work we have to do Loading Loading @@ -1408,6 +1412,7 @@ public final class ActivityThread { public static final int MULTI_WINDOW_MODE_CHANGED = 152; public static final int PICTURE_IN_PICTURE_MODE_CHANGED = 153; public static final int LOCAL_VOICE_INTERACTION_STARTED = 154; public static final int ATTACH_AGENT = 155; String codeToString(int code) { if (DEBUG_MESSAGES) { Loading Loading @@ -1464,6 +1469,7 @@ public final class ActivityThread { case MULTI_WINDOW_MODE_CHANGED: return "MULTI_WINDOW_MODE_CHANGED"; case PICTURE_IN_PICTURE_MODE_CHANGED: return "PICTURE_IN_PICTURE_MODE_CHANGED"; case LOCAL_VOICE_INTERACTION_STARTED: return "LOCAL_VOICE_INTERACTION_STARTED"; case ATTACH_AGENT: return "ATTACH_AGENT"; } } return Integer.toString(code); Loading Loading @@ -1718,6 +1724,8 @@ public final class ActivityThread { case LOCAL_VOICE_INTERACTION_STARTED: handleLocalVoiceInteractionStarted((IBinder) ((SomeArgs) msg.obj).arg1, (IVoiceInteractor) ((SomeArgs) msg.obj).arg2); case ATTACH_AGENT: handleAttachAgent((String) msg.obj); break; } Object obj = msg.obj; Loading Loading @@ -2987,6 +2995,14 @@ public final class ActivityThread { } } static final void handleAttachAgent(String agent) { try { VMDebug.attachAgent(agent); } catch (IOException e) { Slog.e(TAG, "Attaching agent failed: " + agent); } } private static final ThreadLocal<Intent> sCurrentBroadcastIntent = new ThreadLocal<Intent>(); /** Loading
core/java/android/app/ApplicationThreadNative.java +16 −0 Original line number Diff line number Diff line Loading @@ -502,6 +502,14 @@ public abstract class ApplicationThreadNative extends Binder return true; } case ATTACH_AGENT_TRANSACTION: { data.enforceInterface(IApplicationThread.descriptor); String agent = data.readString(); attachAgent(agent); return true; } case DUMP_ACTIVITY_TRANSACTION: { data.enforceInterface(IApplicationThread.descriptor); ParcelFileDescriptor fd = data.readFileDescriptor(); Loading Loading @@ -1305,6 +1313,14 @@ class ApplicationThreadProxy implements IApplicationThread { data.recycle(); } public void attachAgent(String agent) throws RemoteException { Parcel data = Parcel.obtain(); data.writeInterfaceToken(IApplicationThread.descriptor); data.writeString(agent); mRemote.transact(ATTACH_AGENT_TRANSACTION, data, null, IBinder.FLAG_ONEWAY); data.recycle(); } public void setCoreSettings(Bundle coreSettings) throws RemoteException { Parcel data = Parcel.obtain(); data.writeInterfaceToken(IApplicationThread.descriptor); Loading
core/java/android/app/IApplicationThread.java +2 −0 Original line number Diff line number Diff line Loading @@ -123,6 +123,7 @@ public interface IApplicationThread extends IInterface { throws RemoteException; void dumpHeap(boolean managed, String path, ParcelFileDescriptor fd) throws RemoteException; void attachAgent(String path) throws RemoteException; void setSchedulingGroup(int group) throws RemoteException; // the package has been removed, clean up internal references static final int PACKAGE_REMOVED = 0; Loading Loading @@ -225,4 +226,5 @@ public interface IApplicationThread extends IInterface { int SCHEDULE_MULTI_WINDOW_CHANGED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+58; int SCHEDULE_PICTURE_IN_PICTURE_CHANGED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+59; int SCHEDULE_LOCAL_VOICE_INTERACTION_STARTED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+60; int ATTACH_AGENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+61; }
core/java/android/os/ShellCommand.java +1 −1 Original line number Diff line number Diff line Loading @@ -274,7 +274,7 @@ public abstract class ShellCommand { /** * Implement parsing and execution of a command. If it isn't a command you understand, * call {@link #handleDefaultCommands(String)} and return its result as a last resort. * User {@link #getNextOption()}, {@link #getNextArg()}, and {@link #getNextArgRequired()} * Use {@link #getNextOption()}, {@link #getNextArg()}, and {@link #getNextArgRequired()} * to process additional command line arguments. Command output can be written to * {@link #getOutPrintWriter()} and errors to {@link #getErrPrintWriter()}. * Loading
services/core/java/com/android/server/am/ActivityManagerService.java +25 −0 Original line number Diff line number Diff line Loading @@ -22278,4 +22278,29 @@ public final class ActivityManagerService extends ActivityManagerNative // before the profile user is unlocked. return rInfo != null && rInfo.activityInfo != null; } /** * Attach an agent to the specified process (proces name or PID) */ public void attachAgent(String process, String path) { try { synchronized (this) { ProcessRecord proc = findProcessLocked(process, UserHandle.USER_SYSTEM, "attachAgent"); if (proc == null || proc.thread == null) { throw new IllegalArgumentException("Unknown process: " + process); } boolean isDebuggable = "1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0")); if (!isDebuggable) { if ((proc.info.flags & ApplicationInfo.FLAG_DEBUGGABLE) == 0) { throw new SecurityException("Process not debuggable: " + proc); } } proc.thread.attachAgent(path); } } catch (RemoteException e) { throw new IllegalStateException("Process disappeared"); } } }