summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/current.txt7
-rw-r--r--core/java/android/app/ActivityThread.java13
-rw-r--r--core/java/android/app/IApplicationThread.aidl3
-rw-r--r--core/java/android/os/Process.java77
-rw-r--r--core/jni/android_util_Process.cpp2
-rw-r--r--core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java3
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java6
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java23
-rw-r--r--services/core/java/com/android/server/am/ProcessRecord.java34
-rw-r--r--services/java/com/android/server/SystemServer.java3
10 files changed, 138 insertions, 33 deletions
diff --git a/core/api/current.txt b/core/api/current.txt
index 5656c31c330a..6dc342b12c4c 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -31957,8 +31957,10 @@ package android.os {
method public static final long getElapsedCpuTime();
method public static final int[] getExclusiveCores();
method public static final int getGidForName(String);
- method public static final long getStartElapsedRealtime();
- method public static final long getStartUptimeMillis();
+ method public static long getStartElapsedRealtime();
+ method public static long getStartRequestedElapsedRealtime();
+ method public static long getStartRequestedUptimeMillis();
+ method public static long getStartUptimeMillis();
method public static final int getThreadPriority(int) throws java.lang.IllegalArgumentException;
method public static final int getUidForName(String);
method public static final boolean is64Bit();
@@ -31966,6 +31968,7 @@ package android.os {
method public static final boolean isIsolated();
method public static final void killProcess(int);
method public static final int myPid();
+ method @NonNull public static String myProcessName();
method public static final int myTid();
method public static final int myUid();
method public static android.os.UserHandle myUserHandle();
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 19223f9c62ef..ffa7cf18819e 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -37,8 +37,10 @@ import static android.window.ConfigurationHelper.shouldUpdateResources;
import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;
+import android.annotation.ElapsedRealtimeLong;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UptimeMillisLong;
import android.app.assist.AssistContent;
import android.app.assist.AssistStructure;
import android.app.backup.BackupAgent;
@@ -888,6 +890,9 @@ public final class ActivityThread extends ClientTransactionHandler
SharedMemory mSerializedSystemFontMap;
+ long startRequestedElapsedTime;
+ long startRequestedUptime;
+
@Override
public String toString() {
return "AppBindData{appInfo=" + appInfo + "}";
@@ -1099,7 +1104,8 @@ public final class ActivityThread extends ClientTransactionHandler
CompatibilityInfo compatInfo, Map services, Bundle coreSettings,
String buildSerial, AutofillOptions autofillOptions,
ContentCaptureOptions contentCaptureOptions, long[] disabledCompatChanges,
- SharedMemory serializedSystemFontMap) {
+ SharedMemory serializedSystemFontMap,
+ long startRequestedElapsedTime, long startRequestedUptime) {
if (services != null) {
if (false) {
// Test code to make sure the app could see the passed-in services.
@@ -1149,6 +1155,8 @@ public final class ActivityThread extends ClientTransactionHandler
data.contentCaptureOptions = contentCaptureOptions;
data.disabledCompatChanges = disabledCompatChanges;
data.mSerializedSystemFontMap = serializedSystemFontMap;
+ data.startRequestedElapsedTime = startRequestedElapsedTime;
+ data.startRequestedUptime = startRequestedUptime;
sendMessage(H.BIND_APPLICATION, data);
}
@@ -6407,7 +6415,8 @@ public final class ActivityThread extends ClientTransactionHandler
DdmVmInternal.setRecentAllocationsTrackingEnabled(true);
}
// Note when this process has started.
- Process.setStartTimes(SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
+ Process.setStartTimes(SystemClock.elapsedRealtime(), SystemClock.uptimeMillis(),
+ data.startRequestedElapsedTime, data.startRequestedUptime);
AppCompatCallbacks.install(data.disabledCompatChanges);
// Let libcore handle any compat changes after installing the list of compat changes.
diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl
index d6ff6d3dfc3a..0e42a791cc3a 100644
--- a/core/java/android/app/IApplicationThread.aidl
+++ b/core/java/android/app/IApplicationThread.aidl
@@ -80,7 +80,8 @@ oneway interface IApplicationThread {
in CompatibilityInfo compatInfo, in Map services,
in Bundle coreSettings, in String buildSerial, in AutofillOptions autofillOptions,
in ContentCaptureOptions contentCaptureOptions, in long[] disabledCompatChanges,
- in SharedMemory serializedSystemFontMap);
+ in SharedMemory serializedSystemFontMap,
+ long startRequestedElapsedTime, long startRequestedUptime);
void runIsolatedEntryPoint(in String entryPoint, in String[] entryPointArgs);
void scheduleExit();
void scheduleServiceArgs(IBinder token, in ParceledListSlice args);
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 9f37c4877199..c9670ff93f60 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -18,11 +18,14 @@ package android.os;
import static android.annotation.SystemApi.Client.MODULE_LIBRARIES;
+import android.annotation.ElapsedRealtimeLong;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.TestApi;
+import android.annotation.UptimeMillisLong;
import android.compat.annotation.UnsupportedAppUsage;
+import android.os.Build.VERSION_CODES;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
@@ -553,9 +556,26 @@ public class Process {
public static final int SIGNAL_KILL = 9;
public static final int SIGNAL_USR1 = 10;
+ /**
+ * When the process started and ActivityThread.handleBindApplication() was executed.
+ */
private static long sStartElapsedRealtime;
+
+ /**
+ * When the process started and ActivityThread.handleBindApplication() was executed.
+ */
private static long sStartUptimeMillis;
+ /**
+ * When the activity manager was about to ask zygote to fork.
+ */
+ private static long sStartRequestedElapsedRealtime;
+
+ /**
+ * When the activity manager was about to ask zygote to fork.
+ */
+ private static long sStartRequestedUptimeMillis;
+
private static final int PIDFD_UNKNOWN = 0;
private static final int PIDFD_SUPPORTED = 1;
private static final int PIDFD_UNSUPPORTED = 2;
@@ -605,6 +625,12 @@ public class Process {
*/
public static final ZygoteProcess ZYGOTE_PROCESS = new ZygoteProcess();
+
+ /**
+ * The process name set via {@link #setArgV0(String)}.
+ */
+ private static String sArgV0;
+
/**
* Start a new process.
*
@@ -718,21 +744,44 @@ public class Process {
/**
* Return the {@link SystemClock#elapsedRealtime()} at which this process was started.
*/
- public static final long getStartElapsedRealtime() {
+ @ElapsedRealtimeLong
+ public static long getStartElapsedRealtime() {
return sStartElapsedRealtime;
}
/**
* Return the {@link SystemClock#uptimeMillis()} at which this process was started.
*/
- public static final long getStartUptimeMillis() {
+ @UptimeMillisLong
+ public static long getStartUptimeMillis() {
return sStartUptimeMillis;
}
+ /**
+ * Return the {@link SystemClock#elapsedRealtime()} at which the system decides to start
+ * this process.
+ */
+ @ElapsedRealtimeLong
+ public static long getStartRequestedElapsedRealtime() {
+ return sStartRequestedElapsedRealtime;
+ }
+
+ /**
+ * Return the {@link SystemClock#uptimeMillis()} at which the system decides to start
+ * this process.
+ */
+ @UptimeMillisLong
+ public static long getStartRequestedUptimeMillis() {
+ return sStartRequestedUptimeMillis;
+ }
+
/** @hide */
- public static final void setStartTimes(long elapsedRealtime, long uptimeMillis) {
+ public static final void setStartTimes(long elapsedRealtime, long uptimeMillis,
+ long startRequestedElapsedRealtime, long startRequestedUptime) {
sStartElapsedRealtime = elapsedRealtime;
sStartUptimeMillis = uptimeMillis;
+ sStartRequestedElapsedRealtime = startRequestedElapsedRealtime;
+ sStartRequestedUptimeMillis = startRequestedUptime;
}
/**
@@ -1135,8 +1184,26 @@ public class Process {
*
* {@hide}
*/
- @UnsupportedAppUsage
- public static final native void setArgV0(String text);
+ @UnsupportedAppUsage(maxTargetSdk = VERSION_CODES.S, publicAlternatives = "Do not try to "
+ + "change the process name. (If you must, you could use {@code pthread_setname_np(3)}, "
+ + "but this could confuse the system)")
+ public static void setArgV0(@NonNull String text) {
+ sArgV0 = text;
+ setArgV0Native(text);
+ }
+
+ private static native void setArgV0Native(String text);
+
+ /**
+ * Return the name of this process.
+ */
+ @NonNull
+ public static String myProcessName() {
+ // Note this could be different from the actual process name if someone changes the
+ // process name using native code (using pthread_setname_np()). But sArgV0
+ // is the name that the system thinks this process has.
+ return sArgV0;
+ }
/**
* Kill the process with the given PID.
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index 4d8d4dbf67fa..7c67cbcbd23c 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -1346,7 +1346,7 @@ static const JNINativeMethod methods[] = {
{"createProcessGroup", "(II)I", (void*)android_os_Process_createProcessGroup},
{"getExclusiveCores", "()[I", (void*)android_os_Process_getExclusiveCores},
{"setSwappiness", "(IZ)Z", (void*)android_os_Process_setSwappiness},
- {"setArgV0", "(Ljava/lang/String;)V", (void*)android_os_Process_setArgV0},
+ {"setArgV0Native", "(Ljava/lang/String;)V", (void*)android_os_Process_setArgV0},
{"setUid", "(I)I", (void*)android_os_Process_setUid},
{"setGid", "(I)I", (void*)android_os_Process_setGid},
{"sendSignal", "(II)V", (void*)android_os_Process_sendSignal},
diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
index df0c64c810c6..207671e71854 100644
--- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
+++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
@@ -453,7 +453,8 @@ public class TransactionParcelTests {
boolean b2, boolean b3, Configuration configuration,
CompatibilityInfo compatibilityInfo, Map map, Bundle bundle1, String s1,
AutofillOptions ao, ContentCaptureOptions co, long[] disableCompatChanges,
- SharedMemory serializedSystemFontMap)
+ SharedMemory serializedSystemFontMap,
+ long startRequestedElapsedTime, long startRequestedUptime)
throws RemoteException {
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 0eed1909944f..537ea7c04997 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -4666,7 +4666,8 @@ public class ActivityManagerService extends IActivityManager.Stub
app.getCompat(), getCommonServicesLocked(app.isolated),
mCoreSettingsObserver.getCoreSettingsLocked(),
buildSerial, autofillOptions, contentCaptureOptions,
- app.getDisabledCompatChanges(), serializedSystemFontMap);
+ app.getDisabledCompatChanges(), serializedSystemFontMap,
+ app.getStartElapsedTime(), app.getStartUptime());
} else {
thread.bindApplication(processName, appInfo, providerList, null, profilerInfo,
null, null, null, testMode,
@@ -4676,7 +4677,8 @@ public class ActivityManagerService extends IActivityManager.Stub
app.getCompat(), getCommonServicesLocked(app.isolated),
mCoreSettingsObserver.getCoreSettingsLocked(),
buildSerial, autofillOptions, contentCaptureOptions,
- app.getDisabledCompatChanges(), serializedSystemFontMap);
+ app.getDisabledCompatChanges(), serializedSystemFontMap,
+ app.getStartElapsedTime(), app.getStartUptime());
}
if (profilerInfo != null) {
profilerInfo.closeFd();
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index ca32e08dcdde..dc554d60fd7c 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -1793,13 +1793,14 @@ public final class ProcessList {
if (app.isPendingStart()) {
return true;
}
- long startTime = SystemClock.uptimeMillis();
+ final long startUptime = SystemClock.uptimeMillis();
+ final long startElapsedTime = SystemClock.elapsedRealtime();
if (app.getPid() > 0 && app.getPid() != ActivityManagerService.MY_PID) {
- checkSlow(startTime, "startProcess: removing from pids map");
+ checkSlow(startUptime, "startProcess: removing from pids map");
mService.removePidLocked(app.getPid(), app);
app.setBindMountPending(false);
mService.mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app);
- checkSlow(startTime, "startProcess: done removing from pids map");
+ checkSlow(startUptime, "startProcess: done removing from pids map");
app.setPid(0);
app.setStartSeq(0);
}
@@ -1812,9 +1813,9 @@ public final class ProcessList {
"startProcessLocked removing on hold: " + app);
mService.mProcessesOnHold.remove(app);
- checkSlow(startTime, "startProcess: starting to update cpu stats");
+ checkSlow(startUptime, "startProcess: starting to update cpu stats");
mService.updateCpuStats();
- checkSlow(startTime, "startProcess: done updating cpu stats");
+ checkSlow(startUptime, "startProcess: done updating cpu stats");
try {
final int userId = UserHandle.getUserId(app.uid);
@@ -1831,7 +1832,7 @@ public final class ProcessList {
if (!app.isolated) {
int[] permGids = null;
try {
- checkSlow(startTime, "startProcess: getting gids from package manager");
+ checkSlow(startUptime, "startProcess: getting gids from package manager");
final IPackageManager pm = AppGlobals.getPackageManager();
permGids = pm.getPackageGids(app.info.packageName,
MATCH_DIRECT_BOOT_AUTO, app.userId);
@@ -1869,7 +1870,7 @@ public final class ProcessList {
gids = computeGidsForProcess(mountExternal, uid, permGids, externalStorageAccess);
}
app.setMountMode(mountExternal);
- checkSlow(startTime, "startProcess: building args");
+ checkSlow(startUptime, "startProcess: building args");
if (mService.mAtmInternal.isFactoryTestProcess(app.getWindowProcessController())) {
uid = 0;
}
@@ -2027,7 +2028,7 @@ public final class ProcessList {
return startProcessLocked(hostingRecord, entryPoint, app, uid, gids,
runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi,
- instructionSet, invokeWith, startTime);
+ instructionSet, invokeWith, startUptime, startElapsedTime);
} catch (RuntimeException e) {
Slog.e(ActivityManagerService.TAG, "Failure starting process " + app.processName, e);
@@ -2047,7 +2048,7 @@ public final class ProcessList {
boolean startProcessLocked(HostingRecord hostingRecord, String entryPoint, ProcessRecord app,
int uid, int[] gids, int runtimeFlags, int zygotePolicyFlags, int mountExternal,
String seInfo, String requiredAbi, String instructionSet, String invokeWith,
- long startTime) {
+ long startUptime, long startElapsedTime) {
app.setPendingStart(true);
app.setRemoved(false);
synchronized (mProcLock) {
@@ -2068,7 +2069,7 @@ public final class ProcessList {
}
final long startSeq = ++mProcStartSeqCounter;
app.setStartSeq(startSeq);
- app.setStartParams(uid, hostingRecord, seInfo, startTime);
+ app.setStartParams(uid, hostingRecord, seInfo, startUptime, startElapsedTime);
app.setUsingWrapper(invokeWith != null
|| Zygote.getWrapProperty(app.processName) != null);
mPendingStarts.put(startSeq, app);
@@ -2085,7 +2086,7 @@ public final class ProcessList {
final Process.ProcessStartResult startResult = startProcess(hostingRecord,
entryPoint, app,
uid, gids, runtimeFlags, zygotePolicyFlags, mountExternal, seInfo,
- requiredAbi, instructionSet, invokeWith, startTime);
+ requiredAbi, instructionSet, invokeWith, startUptime);
handleProcessStartedLocked(app, startResult.pid, startResult.usingWrapper,
startSeq, false);
} catch (RuntimeException e) {
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 8ae1259ce4d1..8c556264f1a3 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -178,9 +178,14 @@ class ProcessRecord implements WindowProcessListener {
private volatile String mSeInfo;
/**
- * When the process is started.
+ * When the process is started. (before zygote fork)
*/
- private volatile long mStartTime;
+ private volatile long mStartUptime;
+
+ /**
+ * When the process is started. (before zygote fork)
+ */
+ private volatile long mStartElapsedTime;
/**
* This will be same as {@link #uid} usually except for some apps used during factory testing.
@@ -372,16 +377,18 @@ class ProcessRecord implements WindowProcessListener {
Runnable mSuccessorStartRunnable;
void setStartParams(int startUid, HostingRecord hostingRecord, String seInfo,
- long startTime) {
+ long startUptime, long startElapsedTime) {
this.mStartUid = startUid;
this.mHostingRecord = hostingRecord;
this.mSeInfo = seInfo;
- this.mStartTime = startTime;
+ this.mStartUptime = startUptime;
+ this.mStartElapsedTime = startElapsedTime;
}
@GuardedBy({"mService", "mProcLock"})
void dump(PrintWriter pw, String prefix) {
final long nowUptime = SystemClock.uptimeMillis();
+ final long nowElapsedTime = SystemClock.elapsedRealtime();
pw.print(prefix); pw.print("user #"); pw.print(userId);
pw.print(" uid="); pw.print(info.uid);
@@ -442,6 +449,10 @@ class ProcessRecord implements WindowProcessListener {
pw.print(prefix); pw.print("pid="); pw.println(mPid);
pw.print(prefix); pw.print("lastActivityTime=");
TimeUtils.formatDuration(mLastActivityTime, nowUptime, pw);
+ pw.print(prefix); pw.print("startUptimeTime=");
+ TimeUtils.formatDuration(mStartElapsedTime, nowUptime, pw);
+ pw.print(prefix); pw.print("startElapsedTime=");
+ TimeUtils.formatDuration(mStartElapsedTime, nowElapsedTime, pw);
pw.println();
if (mPersistent || mRemoved) {
pw.print(prefix); pw.print("persistent="); pw.print(mPersistent);
@@ -671,12 +682,21 @@ class ProcessRecord implements WindowProcessListener {
mSeInfo = seInfo;
}
+ long getStartUptime() {
+ return mStartUptime;
+ }
+
+ /**
+ * Same as {@link #getStartUptime()}.
+ * @deprecated use {@link #getStartUptime()} instead for clarity.
+ */
+ @Deprecated
long getStartTime() {
- return mStartTime;
+ return mStartUptime;
}
- void setStartTime(long startTime) {
- mStartTime = startTime;
+ long getStartElapsedTime() {
+ return mStartElapsedTime;
}
int getStartUid() {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 752ad0b9c48a..7ef80ae02756 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -631,7 +631,8 @@ public final class SystemServer implements Dumpable {
mStartCount = SystemProperties.getInt(SYSPROP_START_COUNT, 0) + 1;
mRuntimeStartElapsedTime = SystemClock.elapsedRealtime();
mRuntimeStartUptime = SystemClock.uptimeMillis();
- Process.setStartTimes(mRuntimeStartElapsedTime, mRuntimeStartUptime);
+ Process.setStartTimes(mRuntimeStartElapsedTime, mRuntimeStartUptime,
+ mRuntimeStartElapsedTime, mRuntimeStartUptime);
// Remember if it's runtime restart(when sys.boot_completed is already set) or reboot
// We don't use "mStartCount > 1" here because it'll be wrong on a FDE device.