diff options
| -rw-r--r-- | core/api/current.txt | 7 | ||||
| -rw-r--r-- | core/java/android/app/ActivityThread.java | 13 | ||||
| -rw-r--r-- | core/java/android/app/IApplicationThread.aidl | 3 | ||||
| -rw-r--r-- | core/java/android/os/Process.java | 77 | ||||
| -rw-r--r-- | core/jni/android_util_Process.cpp | 2 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java | 3 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 6 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ProcessList.java | 23 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ProcessRecord.java | 34 | ||||
| -rw-r--r-- | services/java/com/android/server/SystemServer.java | 3 |
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. |