am 9a65f9dd: Merge "Add an AM option to start with allocation tracking"
* commit '9a65f9ddd066c1824e2068ed114d72862689f6b0': Add an AM option to start with allocation tracking
This commit is contained in:
@@ -103,7 +103,7 @@ public class Am extends BaseCommand {
|
||||
"usage: am [subcommand] [options]\n" +
|
||||
"usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>]\n" +
|
||||
" [--sampling INTERVAL] [-R COUNT] [-S] [--opengl-trace]\n" +
|
||||
" [--user <USER_ID> | current] <INTENT>\n" +
|
||||
" [--track-allocation] [--user <USER_ID> | current] <INTENT>\n" +
|
||||
" am startservice [--user <USER_ID> | current] <INTENT>\n" +
|
||||
" am stopservice [--user <USER_ID> | current] <INTENT>\n" +
|
||||
" am force-stop [--user <USER_ID> | all | current] <PACKAGE>\n" +
|
||||
@@ -149,6 +149,7 @@ public class Am extends BaseCommand {
|
||||
" the top activity will be finished.\n" +
|
||||
" -S: force stop the target app before starting the activity\n" +
|
||||
" --opengl-trace: enable tracing of OpenGL functions\n" +
|
||||
" --track-allocation: enable tracking of object allocations\n" +
|
||||
" --user <USER_ID> | current: Specify which user to run as; if not\n" +
|
||||
" specified then run as the current user.\n" +
|
||||
"\n" +
|
||||
@@ -583,6 +584,8 @@ public class Am extends BaseCommand {
|
||||
mStopOption = true;
|
||||
} else if (opt.equals("--opengl-trace")) {
|
||||
mStartFlags |= ActivityManager.START_FLAG_OPENGL_TRACES;
|
||||
} else if (opt.equals("--track-allocation")) {
|
||||
mStartFlags |= ActivityManager.START_FLAG_TRACK_ALLOCATION;
|
||||
} else if (opt.equals("--user")) {
|
||||
mUserId = parseUserArg(nextArgRequired());
|
||||
} else if (opt.equals("--receiver-permission")) {
|
||||
|
||||
@@ -199,6 +199,13 @@ public class ActivityManager {
|
||||
*/
|
||||
public static final int START_FLAG_OPENGL_TRACES = 1<<2;
|
||||
|
||||
/**
|
||||
* Flag for IActivityManaqer.startActivity: launch the app for
|
||||
* allocation tracking.
|
||||
* @hide
|
||||
*/
|
||||
public static final int START_FLAG_TRACK_ALLOCATION = 1<<3;
|
||||
|
||||
/**
|
||||
* Result for IActivityManaqer.broadcastIntent: success!
|
||||
* @hide
|
||||
|
||||
@@ -133,6 +133,7 @@ import libcore.net.event.NetworkEventDispatcher;
|
||||
import dalvik.system.CloseGuard;
|
||||
import dalvik.system.VMDebug;
|
||||
import dalvik.system.VMRuntime;
|
||||
import org.apache.harmony.dalvik.ddmc.DdmVmInternal;
|
||||
|
||||
final class RemoteServiceException extends AndroidRuntimeException {
|
||||
public RemoteServiceException(String msg) {
|
||||
@@ -443,6 +444,7 @@ public final class ActivityThread {
|
||||
IUiAutomationConnection instrumentationUiAutomationConnection;
|
||||
int debugMode;
|
||||
boolean enableOpenGlTrace;
|
||||
boolean trackAllocation;
|
||||
boolean restrictedBackupMode;
|
||||
boolean persistent;
|
||||
Configuration config;
|
||||
@@ -756,9 +758,9 @@ public final class ActivityThread {
|
||||
ProfilerInfo profilerInfo, Bundle instrumentationArgs,
|
||||
IInstrumentationWatcher instrumentationWatcher,
|
||||
IUiAutomationConnection instrumentationUiConnection, int debugMode,
|
||||
boolean enableOpenGlTrace, boolean isRestrictedBackupMode, boolean persistent,
|
||||
Configuration config, CompatibilityInfo compatInfo, Map<String, IBinder> services,
|
||||
Bundle coreSettings) {
|
||||
boolean enableOpenGlTrace, boolean trackAllocation, boolean isRestrictedBackupMode,
|
||||
boolean persistent, Configuration config, CompatibilityInfo compatInfo,
|
||||
Map<String, IBinder> services, Bundle coreSettings) {
|
||||
|
||||
if (services != null) {
|
||||
// Setup the service cache in the ServiceManager
|
||||
@@ -814,6 +816,7 @@ public final class ActivityThread {
|
||||
data.instrumentationUiAutomationConnection = instrumentationUiConnection;
|
||||
data.debugMode = debugMode;
|
||||
data.enableOpenGlTrace = enableOpenGlTrace;
|
||||
data.trackAllocation = trackAllocation;
|
||||
data.restrictedBackupMode = isRestrictedBackupMode;
|
||||
data.persistent = persistent;
|
||||
data.config = config;
|
||||
@@ -4314,6 +4317,10 @@ public final class ActivityThread {
|
||||
}
|
||||
|
||||
private void handleBindApplication(AppBindData data) {
|
||||
if (data.trackAllocation) {
|
||||
DdmVmInternal.enableRecentAllocations(true);
|
||||
}
|
||||
|
||||
mBoundApplication = data;
|
||||
mConfiguration = new Configuration(data.config);
|
||||
mCompatConfiguration = new Configuration(data.config);
|
||||
|
||||
@@ -284,6 +284,7 @@ public abstract class ApplicationThreadNative extends Binder
|
||||
IUiAutomationConnection.Stub.asInterface(binder);
|
||||
int testMode = data.readInt();
|
||||
boolean openGlTrace = data.readInt() != 0;
|
||||
boolean trackAllocation = data.readInt() != 0;
|
||||
boolean restrictedBackupMode = (data.readInt() != 0);
|
||||
boolean persistent = (data.readInt() != 0);
|
||||
Configuration config = Configuration.CREATOR.createFromParcel(data);
|
||||
@@ -291,7 +292,7 @@ public abstract class ApplicationThreadNative extends Binder
|
||||
HashMap<String, IBinder> services = data.readHashMap(null);
|
||||
Bundle coreSettings = data.readBundle();
|
||||
bindApplication(packageName, info, providers, testName, profilerInfo, testArgs,
|
||||
testWatcher, uiAutomationConnection, testMode, openGlTrace,
|
||||
testWatcher, uiAutomationConnection, testMode, openGlTrace, trackAllocation,
|
||||
restrictedBackupMode, persistent, config, compatInfo, services, coreSettings);
|
||||
return true;
|
||||
}
|
||||
@@ -961,13 +962,14 @@ class ApplicationThreadProxy implements IApplicationThread {
|
||||
data.recycle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void bindApplication(String packageName, ApplicationInfo info,
|
||||
List<ProviderInfo> providers, ComponentName testName, ProfilerInfo profilerInfo,
|
||||
Bundle testArgs, IInstrumentationWatcher testWatcher,
|
||||
IUiAutomationConnection uiAutomationConnection, int debugMode,
|
||||
boolean openGlTrace, boolean restrictedBackupMode, boolean persistent,
|
||||
Configuration config, CompatibilityInfo compatInfo, Map<String, IBinder> services,
|
||||
Bundle coreSettings) throws RemoteException {
|
||||
boolean openGlTrace, boolean trackAllocation, boolean restrictedBackupMode,
|
||||
boolean persistent, Configuration config, CompatibilityInfo compatInfo,
|
||||
Map<String, IBinder> services, Bundle coreSettings) throws RemoteException {
|
||||
Parcel data = Parcel.obtain();
|
||||
data.writeInterfaceToken(IApplicationThread.descriptor);
|
||||
data.writeString(packageName);
|
||||
@@ -990,6 +992,7 @@ class ApplicationThreadProxy implements IApplicationThread {
|
||||
data.writeStrongInterface(uiAutomationConnection);
|
||||
data.writeInt(debugMode);
|
||||
data.writeInt(openGlTrace ? 1 : 0);
|
||||
data.writeInt(trackAllocation ? 1 : 0);
|
||||
data.writeInt(restrictedBackupMode ? 1 : 0);
|
||||
data.writeInt(persistent ? 1 : 0);
|
||||
config.writeToParcel(data, 0);
|
||||
|
||||
@@ -96,8 +96,9 @@ public interface IApplicationThread extends IInterface {
|
||||
void bindApplication(String packageName, ApplicationInfo info, List<ProviderInfo> providers,
|
||||
ComponentName testName, ProfilerInfo profilerInfo, Bundle testArguments,
|
||||
IInstrumentationWatcher testWatcher, IUiAutomationConnection uiAutomationConnection,
|
||||
int debugMode, boolean openGlTrace, boolean restrictedBackupMode, boolean persistent,
|
||||
Configuration config, CompatibilityInfo compatInfo, Map<String, IBinder> services,
|
||||
int debugMode, boolean openGlTrace, boolean trackAllocation,
|
||||
boolean restrictedBackupMode, boolean persistent, Configuration config,
|
||||
CompatibilityInfo compatInfo, Map<String, IBinder> services,
|
||||
Bundle coreSettings) throws RemoteException;
|
||||
void scheduleExit() throws RemoteException;
|
||||
void scheduleSuicide() throws RemoteException;
|
||||
|
||||
@@ -1122,6 +1122,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
boolean mAutoStopProfiler = false;
|
||||
int mProfileType = 0;
|
||||
String mOpenGlTraceApp = null;
|
||||
String mTrackAllocationApp = null;
|
||||
|
||||
final long[] mTmpLong = new long[1];
|
||||
|
||||
@@ -6000,6 +6001,11 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
enableOpenGlTrace = true;
|
||||
mOpenGlTraceApp = null;
|
||||
}
|
||||
boolean enableTrackAllocation = false;
|
||||
if (mTrackAllocationApp != null && mTrackAllocationApp.equals(processName)) {
|
||||
enableTrackAllocation = true;
|
||||
mTrackAllocationApp = null;
|
||||
}
|
||||
|
||||
// If the app is being launched for restore or full backup, set it up specially
|
||||
boolean isRestrictedBackupMode = false;
|
||||
@@ -6028,7 +6034,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
thread.bindApplication(processName, appInfo, providers, app.instrumentationClass,
|
||||
profilerInfo, app.instrumentationArguments, app.instrumentationWatcher,
|
||||
app.instrumentationUiAutomationConnection, testMode, enableOpenGlTrace,
|
||||
isRestrictedBackupMode || !normalMode, app.persistent,
|
||||
enableTrackAllocation, isRestrictedBackupMode || !normalMode, app.persistent,
|
||||
new Configuration(mConfiguration), app.compat,
|
||||
getCommonServicesLocked(app.isolated),
|
||||
mCoreSettingsObserver.getCoreSettingsLocked());
|
||||
@@ -10349,7 +10355,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
synchronized (this) {
|
||||
boolean isDebuggable = "1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0"));
|
||||
if (!isDebuggable) {
|
||||
if ((app.flags&ApplicationInfo.FLAG_DEBUGGABLE) == 0) {
|
||||
if ((app.flags & ApplicationInfo.FLAG_DEBUGGABLE) == 0) {
|
||||
throw new SecurityException("Process not debuggable: " + app.packageName);
|
||||
}
|
||||
}
|
||||
@@ -10358,11 +10364,24 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
}
|
||||
}
|
||||
|
||||
void setTrackAllocationApp(ApplicationInfo app, String processName) {
|
||||
synchronized (this) {
|
||||
boolean isDebuggable = "1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0"));
|
||||
if (!isDebuggable) {
|
||||
if ((app.flags & ApplicationInfo.FLAG_DEBUGGABLE) == 0) {
|
||||
throw new SecurityException("Process not debuggable: " + app.packageName);
|
||||
}
|
||||
}
|
||||
|
||||
mTrackAllocationApp = processName;
|
||||
}
|
||||
}
|
||||
|
||||
void setProfileApp(ApplicationInfo app, String processName, ProfilerInfo profilerInfo) {
|
||||
synchronized (this) {
|
||||
boolean isDebuggable = "1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0"));
|
||||
if (!isDebuggable) {
|
||||
if ((app.flags&ApplicationInfo.FLAG_DEBUGGABLE) == 0) {
|
||||
if ((app.flags & ApplicationInfo.FLAG_DEBUGGABLE) == 0) {
|
||||
throw new SecurityException("Process not debuggable: " + app.packageName);
|
||||
}
|
||||
}
|
||||
@@ -13173,6 +13192,15 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
pw.println(" mOpenGlTraceApp=" + mOpenGlTraceApp);
|
||||
}
|
||||
}
|
||||
if (mTrackAllocationApp != null) {
|
||||
if (dumpPackage == null || dumpPackage.equals(mTrackAllocationApp)) {
|
||||
if (needSep) {
|
||||
pw.println();
|
||||
needSep = false;
|
||||
}
|
||||
pw.println(" mTrackAllocationApp=" + mTrackAllocationApp);
|
||||
}
|
||||
}
|
||||
if (mProfileApp != null || mProfileProc != null || mProfileFile != null
|
||||
|| mProfileFd != null) {
|
||||
if (dumpPackage == null || dumpPackage.equals(mProfileApp)) {
|
||||
|
||||
@@ -811,20 +811,20 @@ public final class ActivityStackSupervisor implements DisplayListener {
|
||||
aInfo.applicationInfo.packageName, aInfo.name));
|
||||
|
||||
// Don't debug things in the system process
|
||||
if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
|
||||
if (!aInfo.processName.equals("system")) {
|
||||
if (!aInfo.processName.equals("system")) {
|
||||
if ((startFlags & ActivityManager.START_FLAG_DEBUG) != 0) {
|
||||
mService.setDebugApp(aInfo.processName, true, false);
|
||||
}
|
||||
}
|
||||
|
||||
if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
|
||||
if (!aInfo.processName.equals("system")) {
|
||||
if ((startFlags & ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
|
||||
mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
|
||||
}
|
||||
}
|
||||
|
||||
if (profilerInfo != null) {
|
||||
if (!aInfo.processName.equals("system")) {
|
||||
if ((startFlags & ActivityManager.START_FLAG_TRACK_ALLOCATION) != 0) {
|
||||
mService.setTrackAllocationApp(aInfo.applicationInfo, aInfo.processName);
|
||||
}
|
||||
|
||||
if (profilerInfo != null) {
|
||||
mService.setProfileApp(aInfo.applicationInfo, aInfo.processName, profilerInfo);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user