am 92c7379c: am c4ef03d0: am 73fb1feb: Merge "Add sample profiling option to am." into lmp-dev
* commit '92c7379cf75b6ddce98f03c223d14267227436d2':
Add sample profiling option to am.
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index fa59e4b..c06ef0d 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -26,6 +26,7 @@
import android.app.IActivityManager;
import android.app.IInstrumentationWatcher;
import android.app.Instrumentation;
+import android.app.ProfilerInfo;
import android.app.UiAutomationConnection;
import android.content.ComponentName;
import android.content.IIntentReceiver;
@@ -76,6 +77,8 @@
private String mReceiverPermission;
private String mProfileFile;
+ private int mSamplingInterval;
+ private boolean mAutoStop;
/**
* Command-line entry point.
@@ -91,7 +94,7 @@
out.println(
"usage: am [subcommand] [options]\n" +
"usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>]\n" +
- " [--R COUNT] [-S] [--opengl-trace]\n" +
+ " [--sampling INTERVAL] [-R COUNT] [-S] [--opengl-trace]\n" +
" [--user <USER_ID> | current] <INTENT>\n" +
" am startservice [--user <USER_ID> | current] <INTENT>\n" +
" am stopservice [--user <USER_ID> | current] <INTENT>\n" +
@@ -133,6 +136,8 @@
" -D: enable debugging\n" +
" -W: wait for launch to complete\n" +
" --start-profiler <FILE>: start profiler and send results to <FILE>\n" +
+ " --sampling INTERVAL: use sample profiling with INTERVAL microseconds\n" +
+ " between samples (use with --start-profiler)\n" +
" -P <FILE>: like above, but profiling stops when app goes idle\n" +
" -R: repeat the activity launch <COUNT> times. Prior to each repeat,\n" +
" the top activity will be finished.\n" +
@@ -360,6 +365,8 @@
mStopOption = false;
mRepeat = 0;
mProfileFile = null;
+ mSamplingInterval = 0;
+ mAutoStop = false;
mUserId = defUser;
Uri data = null;
String type = null;
@@ -526,10 +533,12 @@
mWaitOption = true;
} else if (opt.equals("-P")) {
mProfileFile = nextArgRequired();
- mStartFlags |= ActivityManager.START_FLAG_AUTO_STOP_PROFILER;
+ mAutoStop = true;
} else if (opt.equals("--start-profiler")) {
mProfileFile = nextArgRequired();
- mStartFlags &= ~ActivityManager.START_FLAG_AUTO_STOP_PROFILER;
+ mAutoStop = false;
+ } else if (opt.equals("--sampling")) {
+ mSamplingInterval = Integer.parseInt(nextArgRequired());
} else if (opt.equals("-R")) {
mRepeat = Integer.parseInt(nextArgRequired());
} else if (opt.equals("-S")) {
@@ -685,12 +694,13 @@
mAm.forceStopPackage(packageName, mUserId);
Thread.sleep(250);
}
-
+
System.out.println("Starting: " + intent);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-
+
ParcelFileDescriptor fd = null;
-
+ ProfilerInfo profilerInfo = null;
+
if (mProfileFile != null) {
try {
fd = ParcelFileDescriptor.open(
@@ -702,17 +712,18 @@
System.err.println("Error: Unable to open file: " + mProfileFile);
return;
}
+ profilerInfo = new ProfilerInfo(mProfileFile, fd, mSamplingInterval, mAutoStop);
}
IActivityManager.WaitResult result = null;
int res;
if (mWaitOption) {
result = mAm.startActivityAndWait(null, null, intent, mimeType,
- null, null, 0, mStartFlags, mProfileFile, fd, null, mUserId);
+ null, null, 0, mStartFlags, profilerInfo, null, mUserId);
res = result.result;
} else {
res = mAm.startActivityAsUser(null, null, intent, mimeType,
- null, null, 0, mStartFlags, mProfileFile, fd, null, mUserId);
+ null, null, 0, mStartFlags, profilerInfo, null, mUserId);
}
PrintStream out = mWaitOption ? System.out : System.err;
boolean launched = false;
@@ -942,7 +953,7 @@
SystemProperties.set("dalvik.vm.extra-opts", props);
}
}
-
+
private void runProfile() throws Exception {
String profileFile = null;
boolean start = false;
@@ -996,6 +1007,7 @@
}
ParcelFileDescriptor fd = null;
+ ProfilerInfo profilerInfo = null;
if (start) {
profileFile = nextArgRequired();
@@ -1009,6 +1021,7 @@
System.err.println("Error: Unable to open file: " + profileFile);
return;
}
+ profilerInfo = new ProfilerInfo(profileFile, fd, 0, false);
}
try {
@@ -1022,7 +1035,7 @@
} else if (start) {
//removeWallOption();
}
- if (!mAm.profileControl(process, userId, start, profileFile, fd, profileType)) {
+ if (!mAm.profileControl(process, userId, start, profilerInfo, profileType)) {
wall = false;
throw new AndroidException("PROFILE FAILED on process " + process);
}
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 9b7cc1c..2387553 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -4145,10 +4145,9 @@
intent.prepareToLeaveProcess();
result = ActivityManagerNative.getDefault()
.startActivity(mMainThread.getApplicationThread(), getBasePackageName(),
- intent, intent.resolveTypeIfNeeded(getContentResolver()),
- mToken, mEmbeddedID, requestCode,
- ActivityManager.START_FLAG_ONLY_IF_NEEDED, null, null,
- options);
+ intent, intent.resolveTypeIfNeeded(getContentResolver()), mToken,
+ mEmbeddedID, requestCode, ActivityManager.START_FLAG_ONLY_IF_NEEDED,
+ null, options);
} catch (RemoteException e) {
// Empty
}
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 586e7d4..da7c790 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -193,13 +193,6 @@
public static final int START_FLAG_OPENGL_TRACES = 1<<2;
/**
- * Flag for IActivityManaqer.startActivity: if the app is being
- * launched for profiling, automatically stop the profiler once done.
- * @hide
- */
- public static final int START_FLAG_AUTO_STOP_PROFILER = 1<<3;
-
- /**
* Result for IActivityManaqer.broadcastIntent: success!
* @hide
*/
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 36e8892..16d091a 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -17,6 +17,7 @@
package android.app;
import android.app.ActivityManager.StackInfo;
+import android.app.ProfilerInfo;
import android.content.ComponentName;
import android.content.IIntentReceiver;
import android.content.IIntentSender;
@@ -132,14 +133,12 @@
String resultWho = data.readString();
int requestCode = data.readInt();
int startFlags = data.readInt();
- String profileFile = data.readString();
- ParcelFileDescriptor profileFd = data.readInt() != 0
- ? data.readFileDescriptor() : null;
+ ProfilerInfo profilerInfo = data.readInt() != 0
+ ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
Bundle options = data.readInt() != 0
? Bundle.CREATOR.createFromParcel(data) : null;
int result = startActivity(app, callingPackage, intent, resolvedType,
- resultTo, resultWho, requestCode, startFlags,
- profileFile, profileFd, options);
+ resultTo, resultWho, requestCode, startFlags, profilerInfo, options);
reply.writeNoException();
reply.writeInt(result);
return true;
@@ -157,15 +156,13 @@
String resultWho = data.readString();
int requestCode = data.readInt();
int startFlags = data.readInt();
- String profileFile = data.readString();
- ParcelFileDescriptor profileFd = data.readInt() != 0
- ? ParcelFileDescriptor.CREATOR.createFromParcel(data) : null;
+ ProfilerInfo profilerInfo = data.readInt() != 0
+ ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
Bundle options = data.readInt() != 0
? Bundle.CREATOR.createFromParcel(data) : null;
int userId = data.readInt();
int result = startActivityAsUser(app, callingPackage, intent, resolvedType,
- resultTo, resultWho, requestCode, startFlags,
- profileFile, profileFd, options, userId);
+ resultTo, resultWho, requestCode, startFlags, profilerInfo, options, userId);
reply.writeNoException();
reply.writeInt(result);
return true;
@@ -183,14 +180,12 @@
String resultWho = data.readString();
int requestCode = data.readInt();
int startFlags = data.readInt();
- String profileFile = data.readString();
- ParcelFileDescriptor profileFd = data.readInt() != 0
- ? data.readFileDescriptor() : null;
+ ProfilerInfo profilerInfo = data.readInt() != 0
+ ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
Bundle options = data.readInt() != 0
? Bundle.CREATOR.createFromParcel(data) : null;
int result = startActivityAsCaller(app, callingPackage, intent, resolvedType,
- resultTo, resultWho, requestCode, startFlags,
- profileFile, profileFd, options);
+ resultTo, resultWho, requestCode, startFlags, profilerInfo, options);
reply.writeNoException();
reply.writeInt(result);
return true;
@@ -208,15 +203,13 @@
String resultWho = data.readString();
int requestCode = data.readInt();
int startFlags = data.readInt();
- String profileFile = data.readString();
- ParcelFileDescriptor profileFd = data.readInt() != 0
- ? ParcelFileDescriptor.CREATOR.createFromParcel(data) : null;
+ ProfilerInfo profilerInfo = data.readInt() != 0
+ ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
Bundle options = data.readInt() != 0
? Bundle.CREATOR.createFromParcel(data) : null;
int userId = data.readInt();
WaitResult result = startActivityAndWait(app, callingPackage, intent, resolvedType,
- resultTo, resultWho, requestCode, startFlags,
- profileFile, profileFd, options, userId);
+ resultTo, resultWho, requestCode, startFlags, profilerInfo, options, userId);
reply.writeNoException();
result.writeToParcel(reply, 0);
return true;
@@ -284,15 +277,13 @@
IVoiceInteractor interactor = IVoiceInteractor.Stub.asInterface(
data.readStrongBinder());
int startFlags = data.readInt();
- String profileFile = data.readString();
- ParcelFileDescriptor profileFd = data.readInt() != 0
- ? ParcelFileDescriptor.CREATOR.createFromParcel(data) : null;
+ ProfilerInfo profilerInfo = data.readInt() != 0
+ ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
Bundle options = data.readInt() != 0
? Bundle.CREATOR.createFromParcel(data) : null;
int userId = data.readInt();
- int result = startVoiceActivity(callingPackage, callingPid, callingUid,
- intent, resolvedType, session, interactor, startFlags,
- profileFile, profileFd, options, userId);
+ int result = startVoiceActivity(callingPackage, callingPid, callingUid, intent,
+ resolvedType, session, interactor, startFlags, profilerInfo, options, userId);
reply.writeNoException();
reply.writeInt(result);
return true;
@@ -1468,22 +1459,21 @@
config.writeToParcel(reply, 0);
return true;
}
-
+
case PROFILE_CONTROL_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
String process = data.readString();
int userId = data.readInt();
boolean start = data.readInt() != 0;
int profileType = data.readInt();
- String path = data.readString();
- ParcelFileDescriptor fd = data.readInt() != 0
- ? ParcelFileDescriptor.CREATOR.createFromParcel(data) : null;
- boolean res = profileControl(process, userId, start, path, fd, profileType);
+ ProfilerInfo profilerInfo = data.readInt() != 0
+ ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
+ boolean res = profileControl(process, userId, start, profilerInfo, profileType);
reply.writeNoException();
reply.writeInt(res ? 1 : 0);
return true;
}
-
+
case SHUTDOWN_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
boolean res = shutdown(data.readInt());
@@ -2343,8 +2333,7 @@
public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,
String resolvedType, IBinder resultTo, String resultWho, int requestCode,
- int startFlags, String profileFile,
- ParcelFileDescriptor profileFd, Bundle options) throws RemoteException {
+ int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
@@ -2356,10 +2345,9 @@
data.writeString(resultWho);
data.writeInt(requestCode);
data.writeInt(startFlags);
- data.writeString(profileFile);
- if (profileFd != null) {
+ if (profilerInfo != null) {
data.writeInt(1);
- profileFd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
} else {
data.writeInt(0);
}
@@ -2379,8 +2367,8 @@
public int startActivityAsUser(IApplicationThread caller, String callingPackage, Intent intent,
String resolvedType, IBinder resultTo, String resultWho, int requestCode,
- int startFlags, String profileFile,
- ParcelFileDescriptor profileFd, Bundle options, int userId) throws RemoteException {
+ int startFlags, ProfilerInfo profilerInfo, Bundle options,
+ int userId) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
@@ -2392,10 +2380,9 @@
data.writeString(resultWho);
data.writeInt(requestCode);
data.writeInt(startFlags);
- data.writeString(profileFile);
- if (profileFd != null) {
+ if (profilerInfo != null) {
data.writeInt(1);
- profileFd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
} else {
data.writeInt(0);
}
@@ -2415,8 +2402,7 @@
}
public int startActivityAsCaller(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
- int startFlags, String profileFile,
- ParcelFileDescriptor profileFd, Bundle options) throws RemoteException {
+ int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
@@ -2428,10 +2414,9 @@
data.writeString(resultWho);
data.writeInt(requestCode);
data.writeInt(startFlags);
- data.writeString(profileFile);
- if (profileFd != null) {
+ if (profilerInfo != null) {
data.writeInt(1);
- profileFd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
} else {
data.writeInt(0);
}
@@ -2450,8 +2435,8 @@
}
public WaitResult startActivityAndWait(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho,
- int requestCode, int startFlags, String profileFile,
- ParcelFileDescriptor profileFd, Bundle options, int userId) throws RemoteException {
+ int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle options,
+ int userId) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
@@ -2463,10 +2448,9 @@
data.writeString(resultWho);
data.writeInt(requestCode);
data.writeInt(startFlags);
- data.writeString(profileFile);
- if (profileFd != null) {
+ if (profilerInfo != null) {
data.writeInt(1);
- profileFd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
} else {
data.writeInt(0);
}
@@ -2550,8 +2534,8 @@
}
public int startVoiceActivity(String callingPackage, int callingPid, int callingUid,
Intent intent, String resolvedType, IVoiceInteractionSession session,
- IVoiceInteractor interactor, int startFlags, String profileFile,
- ParcelFileDescriptor profileFd, Bundle options, int userId) throws RemoteException {
+ IVoiceInteractor interactor, int startFlags, ProfilerInfo profilerInfo,
+ Bundle options, int userId) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
@@ -2563,10 +2547,9 @@
data.writeStrongBinder(session.asBinder());
data.writeStrongBinder(interactor.asBinder());
data.writeInt(startFlags);
- data.writeString(profileFile);
- if (profileFd != null) {
+ if (profilerInfo != null) {
data.writeInt(1);
- profileFd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
} else {
data.writeInt(0);
}
@@ -4189,9 +4172,9 @@
data.recycle();
return res;
}
-
+
public boolean profileControl(String process, int userId, boolean start,
- String path, ParcelFileDescriptor fd, int profileType) throws RemoteException
+ ProfilerInfo profilerInfo, int profileType) throws RemoteException
{
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
@@ -4200,10 +4183,9 @@
data.writeInt(userId);
data.writeInt(start ? 1 : 0);
data.writeInt(profileType);
- data.writeString(path);
- if (fd != null) {
+ if (profilerInfo != null) {
data.writeInt(1);
- fd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
} else {
data.writeInt(0);
}
@@ -4214,7 +4196,7 @@
data.recycle();
return res;
}
-
+
public boolean shutdown(int timeout) throws RemoteException
{
Parcel data = Parcel.obtain();
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 0356093..d70e5df 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -124,6 +124,7 @@
import libcore.io.IoUtils;
import dalvik.system.CloseGuard;
+import dalvik.system.VMDebug;
import dalvik.system.VMRuntime;
final class RemoteServiceException extends AndroidRuntimeException {
@@ -282,9 +283,7 @@
Configuration createdConfig;
ActivityClientRecord nextIdle;
- String profileFile;
- ParcelFileDescriptor profileFd;
- boolean autoStopProfiler;
+ ProfilerInfo profilerInfo;
ActivityInfo activityInfo;
CompatibilityInfo compatInfo;
@@ -436,9 +435,7 @@
CompatibilityInfo compatInfo;
/** Initial values for {@link Profiler}. */
- String initProfileFile;
- ParcelFileDescriptor initProfileFd;
- boolean initAutoStopProfiler;
+ ProfilerInfo initProfilerInfo;
public String toString() {
return "AppBindData{appInfo=" + appInfo + "}";
@@ -448,10 +445,12 @@
static final class Profiler {
String profileFile;
ParcelFileDescriptor profileFd;
+ int samplingInterval;
boolean autoStopProfiler;
boolean profiling;
boolean handlingProfiling;
- public void setProfiler(String file, ParcelFileDescriptor fd) {
+ public void setProfiler(ProfilerInfo profilerInfo) {
+ ParcelFileDescriptor fd = profilerInfo.profileFd;
if (profiling) {
if (fd != null) {
try {
@@ -469,16 +468,18 @@
// Ignore
}
}
- profileFile = file;
+ profileFile = profilerInfo.profileFile;
profileFd = fd;
+ samplingInterval = profilerInfo.samplingInterval;
+ autoStopProfiler = profilerInfo.autoStopProfiler;
}
public void startProfiling() {
if (profileFd == null || profiling) {
return;
}
try {
- Debug.startMethodTracing(profileFile, profileFd.getFileDescriptor(),
- 8 * 1024 * 1024, 0);
+ VMDebug.startMethodTracing(profileFile, profileFd.getFileDescriptor(),
+ 8 * 1024 * 1024, 0, samplingInterval != 0, samplingInterval);
profiling = true;
} catch (RuntimeException e) {
Slog.w(TAG, "Profiling failed on path " + profileFile);
@@ -527,11 +528,6 @@
String who;
}
- static final class ProfilerControlData {
- String path;
- ParcelFileDescriptor fd;
- }
-
static final class DumpHeapData {
String path;
ParcelFileDescriptor fd;
@@ -612,7 +608,7 @@
IVoiceInteractor voiceInteractor, int procState, Bundle state,
PersistableBundle persistentState, List<ResultInfo> pendingResults,
List<Intent> pendingNewIntents, boolean notResumed, boolean isForward,
- String profileName, ParcelFileDescriptor profileFd, boolean autoStopProfiler) {
+ ProfilerInfo profilerInfo) {
updateProcessState(procState, false);
@@ -633,9 +629,7 @@
r.startsNotResumed = notResumed;
r.isForward = isForward;
- r.profileFile = profileName;
- r.profileFd = profileFd;
- r.autoStopProfiler = autoStopProfiler;
+ r.profilerInfo = profilerInfo;
updatePendingConfiguration(curConfig);
@@ -742,11 +736,10 @@
sendMessage(H.STOP_SERVICE, token);
}
- public final void bindApplication(String processName,
- ApplicationInfo appInfo, List<ProviderInfo> providers,
- ComponentName instrumentationName, String profileFile,
- ParcelFileDescriptor profileFd, boolean autoStopProfiler,
- Bundle instrumentationArgs, IInstrumentationWatcher instrumentationWatcher,
+ public final void bindApplication(String processName, ApplicationInfo appInfo,
+ List<ProviderInfo> providers, ComponentName instrumentationName,
+ ProfilerInfo profilerInfo, Bundle instrumentationArgs,
+ IInstrumentationWatcher instrumentationWatcher,
IUiAutomationConnection instrumentationUiConnection, int debugMode,
boolean enableOpenGlTrace, boolean isRestrictedBackupMode, boolean persistent,
Configuration config, CompatibilityInfo compatInfo, Map<String, IBinder> services,
@@ -810,9 +803,7 @@
data.persistent = persistent;
data.config = config;
data.compatInfo = compatInfo;
- data.initProfileFile = profileFile;
- data.initProfileFd = profileFd;
- data.initAutoStopProfiler = false;
+ data.initProfilerInfo = profilerInfo;
sendMessage(H.BIND_APPLICATION, data);
}
@@ -878,12 +869,8 @@
sendMessage(H.ACTIVITY_CONFIGURATION_CHANGED, token);
}
- public void profilerControl(boolean start, String path, ParcelFileDescriptor fd,
- int profileType) {
- ProfilerControlData pcd = new ProfilerControlData();
- pcd.path = path;
- pcd.fd = fd;
- sendMessage(H.PROFILER_CONTROL, pcd, start ? 1 : 0, profileType);
+ public void profilerControl(boolean start, ProfilerInfo profilerInfo, int profileType) {
+ sendMessage(H.PROFILER_CONTROL, profilerInfo, start ? 1 : 0, profileType);
}
public void dumpHeap(boolean managed, String path, ParcelFileDescriptor fd) {
@@ -1417,7 +1404,7 @@
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;
case PROFILER_CONTROL:
- handleProfilerControl(msg.arg1 != 0, (ProfilerControlData)msg.obj, msg.arg2);
+ handleProfilerControl(msg.arg1 != 0, (ProfilerInfo)msg.obj, msg.arg2);
break;
case CREATE_BACKUP_AGENT:
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backupCreateAgent");
@@ -2354,10 +2341,9 @@
unscheduleGcIdler();
mSomeActivitiesChanged = true;
- if (r.profileFd != null) {
- mProfiler.setProfiler(r.profileFile, r.profileFd);
+ if (r.profilerInfo != null) {
+ mProfiler.setProfiler(r.profilerInfo);
mProfiler.startProfiling();
- mProfiler.autoStopProfiler = r.autoStopProfiler;
}
// Make sure we are running with the most recent config.
@@ -4118,22 +4104,21 @@
mSomeActivitiesChanged = true;
}
- final void handleProfilerControl(boolean start, ProfilerControlData pcd, int profileType) {
+ final void handleProfilerControl(boolean start, ProfilerInfo profilerInfo, int profileType) {
if (start) {
try {
switch (profileType) {
- default:
- mProfiler.setProfiler(pcd.path, pcd.fd);
- mProfiler.autoStopProfiler = false;
+ default:
+ mProfiler.setProfiler(profilerInfo);
mProfiler.startProfiling();
break;
}
} catch (RuntimeException e) {
- Slog.w(TAG, "Profiling failed on path " + pcd.path
+ Slog.w(TAG, "Profiling failed on path " + profilerInfo.profileFile
+ " -- can the process access this path?");
} finally {
try {
- pcd.fd.close();
+ profilerInfo.profileFd.close();
} catch (IOException e) {
Slog.w(TAG, "Failure closing profile fd", e);
}
@@ -4265,9 +4250,12 @@
mCompatConfiguration = new Configuration(data.config);
mProfiler = new Profiler();
- mProfiler.profileFile = data.initProfileFile;
- mProfiler.profileFd = data.initProfileFd;
- mProfiler.autoStopProfiler = data.initAutoStopProfiler;
+ if (data.initProfilerInfo != null) {
+ mProfiler.profileFile = data.initProfilerInfo.profileFile;
+ mProfiler.profileFd = data.initProfilerInfo.profileFd;
+ mProfiler.samplingInterval = data.initProfilerInfo.samplingInterval;
+ mProfiler.autoStopProfiler = data.initProfilerInfo.autoStopProfiler;
+ }
// send up app name; do this *before* waiting for debugger
Process.setArgV0(data.processName);
@@ -4282,7 +4270,7 @@
HardwareRenderer.disable(false);
}
}
-
+
if (mProfiler.profileFd != null) {
mProfiler.startProfiling();
}
diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java
index 52b69e1..63e8707 100644
--- a/core/java/android/app/ApplicationThreadNative.java
+++ b/core/java/android/app/ApplicationThreadNative.java
@@ -129,7 +129,7 @@
scheduleSendResult(b, ri);
return true;
}
-
+
case SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION:
{
data.enforceInterface(IApplicationThread.descriptor);
@@ -148,17 +148,13 @@
List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
boolean notResumed = data.readInt() != 0;
boolean isForward = data.readInt() != 0;
- String profileName = data.readString();
- ParcelFileDescriptor profileFd = data.readInt() != 0
- ? ParcelFileDescriptor.CREATOR.createFromParcel(data) : null;
- boolean autoStopProfiler = data.readInt() != 0;
- scheduleLaunchActivity(intent, b, ident, info, curConfig, compatInfo,
- voiceInteractor, procState, state, persistentState,
- ri, pi, notResumed, isForward, profileName, profileFd,
- autoStopProfiler);
+ ProfilerInfo profilerInfo = data.readInt() != 0
+ ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
+ scheduleLaunchActivity(intent, b, ident, info, curConfig, compatInfo, voiceInteractor,
+ procState, state, persistentState, ri, pi, notResumed, isForward, profilerInfo);
return true;
}
-
+
case SCHEDULE_RELAUNCH_ACTIVITY_TRANSACTION:
{
data.enforceInterface(IApplicationThread.descriptor);
@@ -274,10 +270,8 @@
data.createTypedArrayList(ProviderInfo.CREATOR);
ComponentName testName = (data.readInt() != 0)
? new ComponentName(data) : null;
- String profileName = data.readString();
- ParcelFileDescriptor profileFd = data.readInt() != 0
- ? ParcelFileDescriptor.CREATOR.createFromParcel(data) : null;
- boolean autoStopProfiler = data.readInt() != 0;
+ ProfilerInfo profilerInfo = data.readInt() != 0
+ ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
Bundle testArgs = data.readBundle();
IBinder binder = data.readStrongBinder();
IInstrumentationWatcher testWatcher = IInstrumentationWatcher.Stub.asInterface(binder);
@@ -292,11 +286,9 @@
CompatibilityInfo compatInfo = CompatibilityInfo.CREATOR.createFromParcel(data);
HashMap<String, IBinder> services = data.readHashMap(null);
Bundle coreSettings = data.readBundle();
- bindApplication(packageName, info,
- providers, testName, profileName, profileFd, autoStopProfiler,
- testArgs, testWatcher, uiAutomationConnection, testMode,
- openGlTrace, restrictedBackupMode, persistent, config, compatInfo,
- services, coreSettings);
+ bindApplication(packageName, info, providers, testName, profilerInfo, testArgs,
+ testWatcher, uiAutomationConnection, testMode, openGlTrace,
+ restrictedBackupMode, persistent, config, compatInfo, services, coreSettings);
return true;
}
@@ -403,7 +395,7 @@
scheduleLowMemory();
return true;
}
-
+
case SCHEDULE_ACTIVITY_CONFIGURATION_CHANGED_TRANSACTION:
{
data.enforceInterface(IApplicationThread.descriptor);
@@ -411,19 +403,18 @@
scheduleActivityConfigurationChanged(b);
return true;
}
-
+
case PROFILER_CONTROL_TRANSACTION:
{
data.enforceInterface(IApplicationThread.descriptor);
boolean start = data.readInt() != 0;
int profileType = data.readInt();
- String path = data.readString();
- ParcelFileDescriptor fd = data.readInt() != 0
- ? ParcelFileDescriptor.CREATOR.createFromParcel(data) : null;
- profilerControl(start, path, fd, profileType);
+ ProfilerInfo profilerInfo = data.readInt() != 0
+ ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
+ profilerControl(start, profilerInfo, profileType);
return true;
}
-
+
case SET_SCHEDULING_GROUP_TRANSACTION:
{
data.enforceInterface(IApplicationThread.descriptor);
@@ -774,8 +765,7 @@
IVoiceInteractor voiceInteractor, int procState, Bundle state,
PersistableBundle persistentState, List<ResultInfo> pendingResults,
List<Intent> pendingNewIntents, boolean notResumed, boolean isForward,
- String profileName, ParcelFileDescriptor profileFd, boolean autoStopProfiler)
- throws RemoteException {
+ ProfilerInfo profilerInfo) throws RemoteException {
Parcel data = Parcel.obtain();
data.writeInterfaceToken(IApplicationThread.descriptor);
intent.writeToParcel(data, 0);
@@ -792,14 +782,12 @@
data.writeTypedList(pendingNewIntents);
data.writeInt(notResumed ? 1 : 0);
data.writeInt(isForward ? 1 : 0);
- data.writeString(profileName);
- if (profileFd != null) {
+ if (profilerInfo != null) {
data.writeInt(1);
- profileFd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
} else {
data.writeInt(0);
}
- data.writeInt(autoStopProfiler ? 1 : 0);
mRemote.transact(SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION, data, null,
IBinder.FLAG_ONEWAY);
data.recycle();
@@ -959,9 +947,8 @@
}
public final void bindApplication(String packageName, ApplicationInfo info,
- List<ProviderInfo> providers, ComponentName testName, String profileName,
- ParcelFileDescriptor profileFd, boolean autoStopProfiler, Bundle testArgs,
- IInstrumentationWatcher testWatcher,
+ 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,
@@ -977,14 +964,12 @@
data.writeInt(1);
testName.writeToParcel(data, 0);
}
- data.writeString(profileName);
- if (profileFd != null) {
+ if (profilerInfo != null) {
data.writeInt(1);
- profileFd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
} else {
data.writeInt(0);
}
- data.writeInt(autoStopProfiler ? 1 : 0);
data.writeBundle(testArgs);
data.writeStrongInterface(testWatcher);
data.writeStrongInterface(uiAutomationConnection);
@@ -1111,7 +1096,7 @@
IBinder.FLAG_ONEWAY);
data.recycle();
}
-
+
public final void scheduleActivityConfigurationChanged(
IBinder token) throws RemoteException {
Parcel data = Parcel.obtain();
@@ -1121,17 +1106,16 @@
IBinder.FLAG_ONEWAY);
data.recycle();
}
-
- public void profilerControl(boolean start, String path,
- ParcelFileDescriptor fd, int profileType) throws RemoteException {
+
+ public void profilerControl(boolean start, ProfilerInfo profilerInfo, int profileType)
+ throws RemoteException {
Parcel data = Parcel.obtain();
data.writeInterfaceToken(IApplicationThread.descriptor);
data.writeInt(start ? 1 : 0);
data.writeInt(profileType);
- data.writeString(path);
- if (fd != null) {
+ if (profilerInfo != null) {
data.writeInt(1);
- fd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
} else {
data.writeInt(0);
}
@@ -1139,7 +1123,7 @@
IBinder.FLAG_ONEWAY);
data.recycle();
}
-
+
public void setSchedulingGroup(int group) throws RemoteException {
Parcel data = Parcel.obtain();
data.writeInterfaceToken(IApplicationThread.descriptor);
@@ -1148,7 +1132,7 @@
IBinder.FLAG_ONEWAY);
data.recycle();
}
-
+
public void dispatchPackageBroadcast(int cmd, String[] packages) throws RemoteException {
Parcel data = Parcel.obtain();
data.writeInterfaceToken(IApplicationThread.descriptor);
@@ -1157,9 +1141,8 @@
mRemote.transact(DISPATCH_PACKAGE_BROADCAST_TRANSACTION, data, null,
IBinder.FLAG_ONEWAY);
data.recycle();
-
}
-
+
public void scheduleCrash(String msg) throws RemoteException {
Parcel data = Parcel.obtain();
data.writeInterfaceToken(IApplicationThread.descriptor);
@@ -1167,7 +1150,6 @@
mRemote.transact(SCHEDULE_CRASH_TRANSACTION, data, null,
IBinder.FLAG_ONEWAY);
data.recycle();
-
}
public void dumpHeap(boolean managed, String path,
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 884b046..bff9d13 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -1256,7 +1256,7 @@
ActivityManagerNative.getDefault().startActivityAsUser(
mMainThread.getApplicationThread(), getBasePackageName(), intent,
intent.resolveTypeIfNeeded(getContentResolver()),
- null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, null, options,
+ null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, options,
user.getIdentifier());
} catch (RemoteException re) {
}
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 57c4b71..71bdf8c 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -61,22 +61,19 @@
* {@hide}
*/
public interface IActivityManager extends IInterface {
- public int startActivity(IApplicationThread caller, String callingPackage,
- Intent intent, String resolvedType, IBinder resultTo, String resultWho,
- int requestCode, int flags, String profileFile,
- ParcelFileDescriptor profileFd, Bundle options) throws RemoteException;
- public int startActivityAsUser(IApplicationThread caller, String callingPackage,
- Intent intent, String resolvedType, IBinder resultTo, String resultWho,
- int requestCode, int flags, String profileFile,
- ParcelFileDescriptor profileFd, Bundle options, int userId) throws RemoteException;
+ public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,
+ String resolvedType, IBinder resultTo, String resultWho, int requestCode, int flags,
+ ProfilerInfo profilerInfo, Bundle options) throws RemoteException;
+ public int startActivityAsUser(IApplicationThread caller, String callingPackage, Intent intent,
+ String resolvedType, IBinder resultTo, String resultWho, int requestCode, int flags,
+ ProfilerInfo profilerInfo, Bundle options, int userId) throws RemoteException;
public int startActivityAsCaller(IApplicationThread caller, String callingPackage,
- Intent intent, String resolvedType, IBinder resultTo, String resultWho,
- int requestCode, int flags, String profileFile,
- ParcelFileDescriptor profileFd, Bundle options) throws RemoteException;
+ Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
+ int flags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException;
public WaitResult startActivityAndWait(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho,
- int requestCode, int flags, String profileFile,
- ParcelFileDescriptor profileFd, Bundle options, int userId) throws RemoteException;
+ int requestCode, int flags, ProfilerInfo profilerInfo, Bundle options,
+ int userId) throws RemoteException;
public int startActivityWithConfig(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho,
int requestCode, int startFlags, Configuration newConfig,
@@ -87,8 +84,8 @@
int flagsMask, int flagsValues, Bundle options) throws RemoteException;
public int startVoiceActivity(String callingPackage, int callingPid, int callingUid,
Intent intent, String resolvedType, IVoiceInteractionSession session,
- IVoiceInteractor interactor, int flags, String profileFile,
- ParcelFileDescriptor profileFd, Bundle options, int userId) throws RemoteException;
+ IVoiceInteractor interactor, int flags, ProfilerInfo profilerInfo, Bundle options,
+ int userId) throws RemoteException;
public boolean startNextMatchingActivity(IBinder callingActivity,
Intent intent, Bundle options) throws RemoteException;
public int startActivityFromRecents(int taskId, Bundle options) throws RemoteException;
@@ -296,13 +293,13 @@
throws RemoteException;
// Get device configuration
public ConfigurationInfo getDeviceConfigurationInfo() throws RemoteException;
-
+
// Turn on/off profiling in a particular process.
public boolean profileControl(String process, int userId, boolean start,
- String path, ParcelFileDescriptor fd, int profileType) throws RemoteException;
-
+ ProfilerInfo profilerInfo, int profileType) throws RemoteException;
+
public boolean shutdown(int timeout) throws RemoteException;
-
+
public void stopAppSwitches() throws RemoteException;
public void resumeAppSwitches() throws RemoteException;
diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java
index 01b6fdf..a7546d9 100644
--- a/core/java/android/app/IApplicationThread.java
+++ b/core/java/android/app/IApplicationThread.java
@@ -62,8 +62,7 @@
IVoiceInteractor voiceInteractor, int procState, Bundle state,
PersistableBundle persistentState, List<ResultInfo> pendingResults,
List<Intent> pendingNewIntents, boolean notResumed, boolean isForward,
- String profileName, ParcelFileDescriptor profileFd, boolean autoStopProfiler)
- throws RemoteException;
+ ProfilerInfo profilerInfo) throws RemoteException;
void scheduleRelaunchActivity(IBinder token, List<ResultInfo> pendingResults,
List<Intent> pendingNewIntents, int configChanges,
boolean notResumed, Configuration config) throws RemoteException;
@@ -94,10 +93,9 @@
static final int DEBUG_ON = 1;
static final int DEBUG_WAIT = 2;
void bindApplication(String packageName, ApplicationInfo info, List<ProviderInfo> providers,
- ComponentName testName, String profileName, ParcelFileDescriptor profileFd,
- boolean autoStopProfiler, Bundle testArguments, IInstrumentationWatcher testWatcher,
- IUiAutomationConnection uiAutomationConnection, int debugMode,
- boolean openGlTrace, boolean restrictedBackupMode, boolean persistent,
+ 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,
Bundle coreSettings) throws RemoteException;
void scheduleExit() throws RemoteException;
@@ -117,7 +115,7 @@
boolean sticky, int sendingUser, int processState) throws RemoteException;
void scheduleLowMemory() throws RemoteException;
void scheduleActivityConfigurationChanged(IBinder token) throws RemoteException;
- void profilerControl(boolean start, String path, ParcelFileDescriptor fd, int profileType)
+ void profilerControl(boolean start, ProfilerInfo profilerInfo, int profileType)
throws RemoteException;
void dumpHeap(boolean managed, String path, ParcelFileDescriptor fd)
throws RemoteException;
diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java
index bc71bad..ba3a234 100644
--- a/core/java/android/app/Instrumentation.java
+++ b/core/java/android/app/Instrumentation.java
@@ -1481,7 +1481,7 @@
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
- requestCode, 0, null, null, options);
+ requestCode, 0, null, options);
checkStartActivityResult(result, intent);
} catch (RemoteException e) {
}
@@ -1598,7 +1598,7 @@
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mWho : null,
- requestCode, 0, null, null, options);
+ requestCode, 0, null, options);
checkStartActivityResult(result, intent);
} catch (RemoteException e) {
}
@@ -1658,7 +1658,7 @@
.startActivityAsUser(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
- requestCode, 0, null, null, options, user.getIdentifier());
+ requestCode, 0, null, options, user.getIdentifier());
checkStartActivityResult(result, intent);
} catch (RemoteException e) {
}
@@ -1695,7 +1695,7 @@
.startActivityAsCaller(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
- requestCode, 0, null, null, options);
+ requestCode, 0, null, options);
checkStartActivityResult(result, intent);
} catch (RemoteException e) {
}
diff --git a/core/java/android/app/ProfilerInfo.java b/core/java/android/app/ProfilerInfo.java
new file mode 100644
index 0000000..cea7c3c
--- /dev/null
+++ b/core/java/android/app/ProfilerInfo.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.ParcelFileDescriptor;
+
+/**
+ * System private API for passing profiler settings.
+ *
+ * {@hide}
+ */
+public class ProfilerInfo implements Parcelable {
+
+ /* Name of profile output file. */
+ public final String profileFile;
+
+ /* File descriptor for profile output file, can be null. */
+ public ParcelFileDescriptor profileFd;
+
+ /* Indicates sample profiling when nonzero, interval in microseconds. */
+ public final int samplingInterval;
+
+ /* Automatically stop the profiler when the app goes idle. */
+ public final boolean autoStopProfiler;
+
+ public ProfilerInfo(String filename, ParcelFileDescriptor fd, int interval, boolean autoStop) {
+ profileFile = filename;
+ profileFd = fd;
+ samplingInterval = interval;
+ autoStopProfiler = autoStop;
+ }
+
+ public int describeContents() {
+ if (profileFd != null) {
+ return profileFd.describeContents();
+ } else {
+ return 0;
+ }
+ }
+
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeString(profileFile);
+ if (profileFd != null) {
+ out.writeInt(1);
+ profileFd.writeToParcel(out, flags);
+ } else {
+ out.writeInt(0);
+ }
+ out.writeInt(samplingInterval);
+ out.writeInt(autoStopProfiler ? 1 : 0);
+ }
+
+ public static final Parcelable.Creator<ProfilerInfo> CREATOR =
+ new Parcelable.Creator<ProfilerInfo>() {
+ public ProfilerInfo createFromParcel(Parcel in) {
+ return new ProfilerInfo(in);
+ }
+
+ public ProfilerInfo[] newArray(int size) {
+ return new ProfilerInfo[size];
+ }
+ };
+
+ private ProfilerInfo(Parcel in) {
+ profileFile = in.readString();
+ profileFd = in.readInt() != 0 ? ParcelFileDescriptor.CREATOR.createFromParcel(in) : null;
+ samplingInterval = in.readInt();
+ autoStopProfiler = in.readInt() != 0;
+ }
+}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java b/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java
index 32f7a1e..1978ded 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java
@@ -242,8 +242,7 @@
null /*resultWho*/,
0 /*requestCode*/,
Intent.FLAG_ACTIVITY_NEW_TASK,
- null /*profileFile*/,
- null /*profileFd*/,
+ null /*profilerInfo*/,
options,
user.getIdentifier());
if (DEBUG) Log.d(TAG, String.format("waitResult[%s,%s,%s,%s] at %s",
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 20206b9..5a836c8 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -5426,7 +5426,7 @@
dock.resolveTypeIfNeeded(mContext.getContentResolver()),
null, null, 0,
ActivityManager.START_FLAG_ONLY_IF_NEEDED,
- null, null, null, UserHandle.USER_CURRENT);
+ null, null, UserHandle.USER_CURRENT);
if (result == ActivityManager.START_RETURN_INTENT_TO_CALLER) {
return false;
}
@@ -5437,7 +5437,7 @@
mHomeIntent.resolveTypeIfNeeded(mContext.getContentResolver()),
null, null, 0,
ActivityManager.START_FLAG_ONLY_IF_NEEDED,
- null, null, null, UserHandle.USER_CURRENT);
+ null, null, UserHandle.USER_CURRENT);
if (result == ActivityManager.START_RETURN_INTENT_TO_CALLER) {
return false;
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index e2a6534..e93dac6 100755
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -37,6 +37,7 @@
import android.app.IActivityContainer;
import android.app.IActivityContainerCallback;
import android.app.IAppTask;
+import android.app.ProfilerInfo;
import android.app.admin.DevicePolicyManager;
import android.app.usage.UsageEvents;
import android.app.usage.UsageStatsManagerInternal;
@@ -1050,8 +1051,9 @@
ProcessRecord mProfileProc = null;
String mProfileFile;
ParcelFileDescriptor mProfileFd;
- int mProfileType = 0;
+ int mSamplingInterval = 0;
boolean mAutoStopProfiler = false;
+ int mProfileType = 0;
String mOpenGlTraceApp = null;
static class ProcessChangeItem {
@@ -3443,33 +3445,30 @@
@Override
public final int startActivity(IApplicationThread caller, String callingPackage,
- Intent intent, String resolvedType, IBinder resultTo,
- String resultWho, int requestCode, int startFlags,
- String profileFile, ParcelFileDescriptor profileFd, Bundle options) {
+ Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
+ int startFlags, ProfilerInfo profilerInfo, Bundle options) {
return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
- resultWho, requestCode,
- startFlags, profileFile, profileFd, options, UserHandle.getCallingUserId());
+ resultWho, requestCode, startFlags, profilerInfo, options,
+ UserHandle.getCallingUserId());
}
@Override
public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
- Intent intent, String resolvedType, IBinder resultTo,
- String resultWho, int requestCode, int startFlags,
- String profileFile, ParcelFileDescriptor profileFd, Bundle options, int userId) {
+ Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
+ int startFlags, ProfilerInfo profilerInfo, Bundle options, int userId) {
enforceNotIsolatedCaller("startActivity");
userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId,
false, ALLOW_FULL_ONLY, "startActivity", null);
// TODO: Switch to user app stacks here.
- return mStackSupervisor.startActivityMayWait(caller, -1, callingPackage, intent, resolvedType,
- null, null, resultTo, resultWho, requestCode, startFlags, profileFile, profileFd,
- null, null, options, userId, null, null);
+ return mStackSupervisor.startActivityMayWait(caller, -1, callingPackage, intent,
+ resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
+ profilerInfo, null, null, options, userId, null, null);
}
@Override
public final int startActivityAsCaller(IApplicationThread caller, String callingPackage,
- Intent intent, String resolvedType, IBinder resultTo,
- String resultWho, int requestCode, int startFlags,
- String profileFile, ParcelFileDescriptor profileFd, Bundle options) {
+ Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
+ int startFlags, ProfilerInfo profilerInfo, Bundle options) {
// This is very dangerous -- it allows you to perform a start activity (including
// permission grants) as any app that may launch one of your own activities. So
@@ -3510,9 +3509,8 @@
// TODO: Switch to user app stacks here.
try {
int ret = mStackSupervisor.startActivityMayWait(null, targetUid, targetPackage, intent,
- resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
- null, null, null, null, options, UserHandle.getUserId(sourceRecord.app.uid),
- null, null);
+ resolvedType, null, null, resultTo, resultWho, requestCode, startFlags, null,
+ null, null, options, UserHandle.getUserId(sourceRecord.app.uid), null, null);
return ret;
} catch (SecurityException e) {
// XXX need to figure out how to propagate to original app.
@@ -3532,32 +3530,30 @@
@Override
public final WaitResult startActivityAndWait(IApplicationThread caller, String callingPackage,
- Intent intent, String resolvedType, IBinder resultTo,
- String resultWho, int requestCode, int startFlags, String profileFile,
- ParcelFileDescriptor profileFd, Bundle options, int userId) {
+ Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
+ int startFlags, ProfilerInfo profilerInfo, Bundle options, int userId) {
enforceNotIsolatedCaller("startActivityAndWait");
userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId,
false, ALLOW_FULL_ONLY, "startActivityAndWait", null);
WaitResult res = new WaitResult();
// TODO: Switch to user app stacks here.
mStackSupervisor.startActivityMayWait(caller, -1, callingPackage, intent, resolvedType,
- null, null, resultTo, resultWho, requestCode, startFlags, profileFile, profileFd,
- res, null, options, userId, null, null);
+ null, null, resultTo, resultWho, requestCode, startFlags, profilerInfo, res, null,
+ options, userId, null, null);
return res;
}
@Override
public final int startActivityWithConfig(IApplicationThread caller, String callingPackage,
- Intent intent, String resolvedType, IBinder resultTo,
- String resultWho, int requestCode, int startFlags, Configuration config,
- Bundle options, int userId) {
+ Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
+ int startFlags, Configuration config, Bundle options, int userId) {
enforceNotIsolatedCaller("startActivityWithConfig");
userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId,
false, ALLOW_FULL_ONLY, "startActivityWithConfig", null);
// TODO: Switch to user app stacks here.
int ret = mStackSupervisor.startActivityMayWait(caller, -1, callingPackage, intent,
resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
- null, null, null, config, options, userId, null, null);
+ null, null, config, options, userId, null, null);
return ret;
}
@@ -3596,8 +3592,8 @@
@Override
public int startVoiceActivity(String callingPackage, int callingPid, int callingUid,
Intent intent, String resolvedType, IVoiceInteractionSession session,
- IVoiceInteractor interactor, int startFlags, String profileFile,
- ParcelFileDescriptor profileFd, Bundle options, int userId) {
+ IVoiceInteractor interactor, int startFlags, ProfilerInfo profilerInfo,
+ Bundle options, int userId) {
if (checkCallingPermission(Manifest.permission.BIND_VOICE_INTERACTION)
!= PackageManager.PERMISSION_GRANTED) {
String msg = "Permission Denial: startVoiceActivity() from pid="
@@ -3614,8 +3610,8 @@
false, ALLOW_FULL_ONLY, "startVoiceActivity", null);
// TODO: Switch to user app stacks here.
return mStackSupervisor.startActivityMayWait(null, callingUid, callingPackage, intent,
- resolvedType, session, interactor, null, null, 0, startFlags,
- profileFile, profileFd, null, null, options, userId, null, null);
+ resolvedType, session, interactor, null, null, 0, startFlags, profilerInfo, null,
+ null, options, userId, null, null);
}
@Override
@@ -3767,7 +3763,7 @@
// TODO: Switch to user app stacks here.
int ret = mStackSupervisor.startActivityMayWait(null, uid, callingPackage, intent,
resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
- null, null, null, null, options, userId, container, inTask);
+ null, null, null, options, userId, container, inTask);
return ret;
}
@@ -5613,11 +5609,13 @@
}
String profileFile = app.instrumentationProfileFile;
ParcelFileDescriptor profileFd = null;
+ int samplingInterval = 0;
boolean profileAutoStop = false;
if (mProfileApp != null && mProfileApp.equals(processName)) {
mProfileProc = app;
profileFile = mProfileFile;
profileFd = mProfileFd;
+ samplingInterval = mSamplingInterval;
profileAutoStop = mAutoStopProfiler;
}
boolean enableOpenGlTrace = false;
@@ -5648,9 +5646,10 @@
if (profileFd != null) {
profileFd = profileFd.dup();
}
- thread.bindApplication(processName, appInfo, providers,
- app.instrumentationClass, profileFile, profileFd, profileAutoStop,
- app.instrumentationArguments, app.instrumentationWatcher,
+ ProfilerInfo profilerInfo = profileFile == null ? null
+ : new ProfilerInfo(profileFile, profileFd, samplingInterval, profileAutoStop);
+ thread.bindApplication(processName, appInfo, providers, app.instrumentationClass,
+ profilerInfo, app.instrumentationArguments, app.instrumentationWatcher,
app.instrumentationUiAutomationConnection, testMode, enableOpenGlTrace,
isRestrictedBackupMode || !normalMode, app.persistent,
new Configuration(mConfiguration), app.compat, getCommonServicesLocked(),
@@ -9695,8 +9694,7 @@
}
}
- void setProfileApp(ApplicationInfo app, String processName, String profileFile,
- ParcelFileDescriptor profileFd, boolean autoStopProfiler) {
+ void setProfileApp(ApplicationInfo app, String processName, ProfilerInfo profilerInfo) {
synchronized (this) {
boolean isDebuggable = "1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0"));
if (!isDebuggable) {
@@ -9705,7 +9703,7 @@
}
}
mProfileApp = processName;
- mProfileFile = profileFile;
+ mProfileFile = profilerInfo.profileFile;
if (mProfileFd != null) {
try {
mProfileFd.close();
@@ -9713,9 +9711,10 @@
}
mProfileFd = null;
}
- mProfileFd = profileFd;
+ mProfileFd = profilerInfo.profileFd;
+ mSamplingInterval = profilerInfo.samplingInterval;
+ mAutoStopProfiler = profilerInfo.autoStopProfiler;
mProfileType = 0;
- mAutoStopProfiler = autoStopProfiler;
}
}
@@ -9727,7 +9726,7 @@
Settings.Global.putInt(
mContext.getContentResolver(),
Settings.Global.ALWAYS_FINISH_ACTIVITIES, enabled ? 1 : 0);
-
+
synchronized (this) {
mAlwaysFinishActivities = enabled;
}
@@ -12303,8 +12302,9 @@
}
pw.println(" mProfileApp=" + mProfileApp + " mProfileProc=" + mProfileProc);
pw.println(" mProfileFile=" + mProfileFile + " mProfileFd=" + mProfileFd);
- pw.println(" mProfileType=" + mProfileType + " mAutoStopProfiler="
+ pw.println(" mSamplingInterval=" + mSamplingInterval + " mAutoStopProfiler="
+ mAutoStopProfiler);
+ pw.println(" mProfileType=" + mProfileType);
}
}
if (dumpPackage == null) {
@@ -17310,10 +17310,9 @@
}
}
- private void stopProfilerLocked(ProcessRecord proc, String path, int profileType) {
+ private void stopProfilerLocked(ProcessRecord proc, int profileType) {
if (proc == null || proc == mProfileProc) {
proc = mProfileProc;
- path = mProfileFile;
profileType = mProfileType;
clearProfilerLocked();
}
@@ -17321,7 +17320,7 @@
return;
}
try {
- proc.thread.profilerControl(false, path, null, profileType);
+ proc.thread.profilerControl(false, null, profileType);
} catch (RemoteException e) {
throw new IllegalStateException("Process disappeared");
}
@@ -17339,10 +17338,11 @@
mProfileFile = null;
mProfileType = 0;
mAutoStopProfiler = false;
+ mSamplingInterval = 0;
}
public boolean profileControl(String process, int userId, boolean start,
- String path, ParcelFileDescriptor fd, int profileType) throws RemoteException {
+ ProfilerInfo profilerInfo, int profileType) throws RemoteException {
try {
synchronized (this) {
@@ -17354,8 +17354,8 @@
+ android.Manifest.permission.SET_ACTIVITY_WATCHER);
}
- if (start && fd == null) {
- throw new IllegalArgumentException("null fd");
+ if (start && (profilerInfo == null || profilerInfo.profileFd == null)) {
+ throw new IllegalArgumentException("null profile info or fd");
}
ProcessRecord proc = null;
@@ -17368,23 +17368,25 @@
}
if (start) {
- stopProfilerLocked(null, null, 0);
- setProfileApp(proc.info, proc.processName, path, fd, false);
+ stopProfilerLocked(null, 0);
+ setProfileApp(proc.info, proc.processName, profilerInfo);
mProfileProc = proc;
mProfileType = profileType;
+ ParcelFileDescriptor fd = profilerInfo.profileFd;
try {
fd = fd.dup();
} catch (IOException e) {
fd = null;
}
- proc.thread.profilerControl(start, path, fd, profileType);
+ profilerInfo.profileFd = fd;
+ proc.thread.profilerControl(start, profilerInfo, profileType);
fd = null;
mProfileFd = null;
} else {
- stopProfilerLocked(proc, path, profileType);
- if (fd != null) {
+ stopProfilerLocked(proc, profileType);
+ if (profilerInfo != null && profilerInfo.profileFd != null) {
try {
- fd.close();
+ profilerInfo.profileFd.close();
} catch (IOException e) {
}
}
@@ -17395,9 +17397,9 @@
} catch (RemoteException e) {
throw new IllegalStateException("Process disappeared");
} finally {
- if (fd != null) {
+ if (profilerInfo != null && profilerInfo.profileFd != null) {
try {
- fd.close();
+ profilerInfo.profileFd.close();
} catch (IOException e) {
}
}
@@ -18407,7 +18409,7 @@
}
return mStackSupervisor.startActivityMayWait(appThread, -1, callingPackage, intent,
resolvedType, null, null, null, null, 0, 0, null, null,
- null, null, options, callingUser, null, tr);
+ null, options, callingUser, null, tr);
}
@Override
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 066ec68..77b4cc9 100755
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -1187,7 +1187,7 @@
final ActivityManagerService service = stackSupervisor.mService;
final ActivityInfo aInfo = stackSupervisor.resolveActivity(intent, resolvedType, 0, null,
- null, userId);
+ userId);
if (aInfo == null) {
throw new XmlPullParserException("restoreActivity resolver error. Intent=" + intent +
" resolvedType=" + resolvedType);
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index a9898ee..6b5c931 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -45,6 +45,7 @@
import android.app.IActivityManager;
import android.app.IApplicationThread;
import android.app.PendingIntent;
+import android.app.ProfilerInfo;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.IActivityManager.WaitResult;
import android.app.ResultInfo;
@@ -734,7 +735,7 @@
}
ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
- String profileFile, ParcelFileDescriptor profileFd, int userId) {
+ ProfilerInfo profilerInfo, int userId) {
// Collect information about the target of the Intent.
ActivityInfo aInfo;
try {
@@ -769,11 +770,9 @@
}
}
- if (profileFile != null) {
+ if (profilerInfo != null) {
if (!aInfo.processName.equals("system")) {
- mService.setProfileApp(aInfo.applicationInfo, aInfo.processName,
- profileFile, profileFd,
- (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0);
+ mService.setProfileApp(aInfo.applicationInfo, aInfo.processName, profilerInfo);
}
}
}
@@ -789,8 +788,8 @@
final int startActivityMayWait(IApplicationThread caller, int callingUid,
String callingPackage, Intent intent, String resolvedType,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
- IBinder resultTo, String resultWho, int requestCode, int startFlags, String profileFile,
- ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config,
+ IBinder resultTo, String resultWho, int requestCode, int startFlags,
+ ProfilerInfo profilerInfo, WaitResult outResult, Configuration config,
Bundle options, int userId, IActivityContainer iContainer, TaskRecord inTask) {
// Refuse possible leaked file descriptors
if (intent != null && intent.hasFileDescriptors()) {
@@ -803,7 +802,7 @@
// Collect information about the target of the Intent.
ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
- profileFile, profileFd, userId);
+ profilerInfo, userId);
ActivityContainer container = (ActivityContainer)iContainer;
synchronized (mService) {
@@ -996,8 +995,7 @@
intent = new Intent(intent);
// Collect information about the target of the Intent.
- ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i],
- 0, null, null, userId);
+ ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i], 0, null, userId);
// TODO: New, check if this is correct
aInfo = mService.getActivityInfoForUser(aInfo, userId);
@@ -1100,13 +1098,11 @@
r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
String profileFile = null;
ParcelFileDescriptor profileFd = null;
- boolean profileAutoStop = false;
if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
if (mService.mProfileProc == null || mService.mProfileProc == app) {
mService.mProfileProc = app;
profileFile = mService.mProfileFile;
profileFd = mService.mProfileFd;
- profileAutoStop = mService.mAutoStopProfiler;
}
}
app.hasShownUi = true;
@@ -1125,13 +1121,15 @@
}
}
+ ProfilerInfo profilerInfo = profileFile != null
+ ? new ProfilerInfo(profileFile, profileFd, mService.mSamplingInterval,
+ mService.mAutoStopProfiler) : null;
app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP);
app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
- System.identityHashCode(r), r.info,
- new Configuration(mService.mConfiguration), r.compat, r.task.voiceInteractor,
- app.repProcState, r.icicle, r.persistentState, results, newIntents, !andResume,
- mService.isNextTransitionForward(), profileFile, profileFd, profileAutoStop
- );
+ System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
+ r.compat, r.task.voiceInteractor, app.repProcState, r.icicle, r.persistentState,
+ results, newIntents, !andResume, mService.isNextTransitionForward(),
+ profilerInfo);
if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
// This may be a heavy-weight process! Note that the package
@@ -3625,8 +3623,8 @@
&& "content".equals(intent.getData().getScheme())) {
mimeType = mService.getProviderMimeType(intent.getData(), userId);
}
- return startActivityMayWait(null, -1, null, intent, mimeType, null, null, null, null, 0, 0, null,
- null, null, null, null, userId, this, null);
+ return startActivityMayWait(null, -1, null, intent, mimeType, null, null, null, null, 0,
+ 0, null, null, null, null, userId, this, null);
}
@Override
@@ -3652,7 +3650,7 @@
resolvedType = mService.getProviderMimeType(intent.getData(), userId);
}
}
- ActivityInfo aInfo = resolveActivity(intent, resolvedType, 0, null, null, userId);
+ ActivityInfo aInfo = resolveActivity(intent, resolvedType, 0, null, userId);
if (aInfo != null && (aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) {
throw new SecurityException(
"Attempt to embed activity that has not set allowEmbedded=\"true\"");
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java
index c0e536a..b36b611 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java
@@ -253,7 +253,7 @@
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
return mAm.startVoiceActivity(mComponent.getPackageName(), callingPid, callingUid,
intent, resolvedType, mActiveSession.mSession, mActiveSession.mInteractor,
- 0, null, null, null, mUser);
+ 0, null, null, mUser);
} catch (RemoteException e) {
throw new IllegalStateException("Unexpected remote error", e);
}
diff --git a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
index a209d6c..8b8d604 100644
--- a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
+++ b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
@@ -344,7 +344,7 @@
}
mResult = mAm.startActivityAndWait(null, null, mLaunchIntent, mimeType,
- null, null, 0, mLaunchIntent.getFlags(), null, null, null,
+ null, null, 0, mLaunchIntent.getFlags(), null, null,
UserHandle.USER_CURRENT);
} catch (RemoteException e) {
Log.w(TAG, "Error launching app", e);
diff --git a/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java b/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java
index f582a91..a7e3bec 100644
--- a/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java
+++ b/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java
@@ -318,7 +318,7 @@
}
mAm.startActivityAndWait(null, null, mLaunchIntent, mimeType,
- null, null, 0, mLaunchIntent.getFlags(), null, null, null,
+ null, null, 0, mLaunchIntent.getFlags(), null, null,
UserHandle.USER_CURRENT_OR_SELF);
} catch (RemoteException e) {
Log.w(TAG, "Error launching app", e);