diff options
| author | 2024-05-01 13:52:27 +0000 | |
|---|---|---|
| committer | 2024-05-01 16:14:01 +0000 | |
| commit | 129c68ba34e7861fcb52a6c4f3cc2997c12a109e (patch) | |
| tree | 4b7100b8b0a549ccaa76da3b79a39cecd4cd17e2 | |
| parent | efecd13dc0f7b3e3bef4186f61e33fce026ffc81 (diff) | |
Add Application OnCreate timestamp to AppStartInfo
Bug: 287153617
Test: trigger app starts, confirm value is present
Flag: android.app.activity_manager.app_start_info_timestamps
Change-Id: I719a1fa71376e094f7febf95a5aebe3f534d16d5
6 files changed, 31 insertions, 8 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index bc66127de3b0..f30c5758fd9e 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -7435,6 +7435,7 @@ public final class ActivityThread extends ClientTransactionHandler } mDdmSyncStageUpdater.next(Stage.Running); + long timestampApplicationOnCreateNs = 0; try { // If the app is being launched for full backup or restore, bring it up in // a restricted environment with the base application class. @@ -7477,8 +7478,10 @@ public final class ActivityThread extends ClientTransactionHandler + data.instrumentationName + ": " + e.toString(), e); } try { + timestampApplicationOnCreateNs = SystemClock.elapsedRealtimeNanos(); mInstrumentation.callApplicationOnCreate(app); } catch (Exception e) { + timestampApplicationOnCreateNs = 0; if (!mInstrumentation.onException(app, e)) { throw new RuntimeException( "Unable to create application " + app.getClass().getName() @@ -7516,7 +7519,7 @@ public final class ActivityThread extends ClientTransactionHandler } try { - mgr.finishAttachApplication(mStartSeq); + mgr.finishAttachApplication(mStartSeq, timestampApplicationOnCreateNs); } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 3765c817b117..e8b57f224a0b 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -196,7 +196,7 @@ interface IActivityManager { oneway void finishReceiver(in IBinder who, int resultCode, in String resultData, in Bundle map, boolean abortBroadcast, int flags); void attachApplication(in IApplicationThread app, long startSeq); - void finishAttachApplication(long startSeq); + void finishAttachApplication(long startSeq, long timestampApplicationOnCreateNs); List<ActivityManager.RunningTaskInfo> getTasks(int maxNum); @UnsupportedAppUsage void moveTaskToFront(in IApplicationThread caller, in String callingPackage, int task, diff --git a/core/java/android/app/activity_manager.aconfig b/core/java/android/app/activity_manager.aconfig index e4425ca1e8a5..8c4667f15299 100644 --- a/core/java/android/app/activity_manager.aconfig +++ b/core/java/android/app/activity_manager.aconfig @@ -40,3 +40,13 @@ flag { description: "Add a new callback in Service to indicate a FGS has reached its timeout." bug: "317799821" } + +flag { + namespace: "system_performance" + name: "app_start_info_timestamps" + description: "Additional timestamps." + bug: "287153617" + metadata { + purpose: PURPOSE_BUGFIX + } +} diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index c47e42dfd07e..1b59c1829d4c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -5034,7 +5034,7 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override - public final void finishAttachApplication(long startSeq) { + public final void finishAttachApplication(long startSeq, long timestampApplicationOnCreateNs) { final int pid = Binder.getCallingPid(); final int uid = Binder.getCallingUid(); @@ -5054,6 +5054,11 @@ public class ActivityManagerService extends IActivityManager.Stub } finally { Binder.restoreCallingIdentity(origId); } + + if (android.app.Flags.appStartInfoTimestamps() && timestampApplicationOnCreateNs > 0) { + addStartInfoTimestampInternal(ApplicationStartInfo.START_TIMESTAMP_APPLICATION_ONCREATE, + timestampApplicationOnCreateNs, UserHandle.getUserId(uid), uid); + } } private void handleBindApplicationTimeoutSoft(ProcessRecord app, int softTimeoutMillis) { @@ -10253,10 +10258,15 @@ public class ActivityManagerService extends IActivityManager.Stub mUserController.handleIncomingUser(Binder.getCallingPid(), callingUid, userId, true, ALLOW_NON_FULL, "addStartInfoTimestamp", null); - final String packageName = Settings.getPackageNameForUid(mContext, callingUid); + addStartInfoTimestampInternal(key, timestampNs, userId, callingUid); + } - mProcessList.getAppStartInfoTracker().addTimestampToStart(packageName, - UserHandle.getUid(userId, UserHandle.getAppId(callingUid)), timestampNs, key); + private void addStartInfoTimestampInternal(int key, long timestampNs, int userId, int uid) { + mProcessList.getAppStartInfoTracker().addTimestampToStart( + Settings.getPackageNameForUid(mContext, uid), + UserHandle.getUid(userId, UserHandle.getAppId(uid)), + timestampNs, + key); } @Override diff --git a/services/tests/mockingservicestests/src/com/android/server/am/AsyncProcessStartTest.java b/services/tests/mockingservicestests/src/com/android/server/am/AsyncProcessStartTest.java index a8b792e30485..80f7a066985b 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/AsyncProcessStartTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/AsyncProcessStartTest.java @@ -197,7 +197,7 @@ public class AsyncProcessStartTest { + Arrays.toString(invocation.getArguments())); if (!wedge) { if (mRealAms.mConstants.mEnableWaitForFinishAttachApplication) { - mRealAms.finishAttachApplication(0); + mRealAms.finishAttachApplication(0, 0); } } return null; diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ProcessObserverTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ProcessObserverTest.java index 67be93b3b49f..89c67d5e32b7 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/ProcessObserverTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/ProcessObserverTest.java @@ -200,7 +200,7 @@ public class ProcessObserverTest { Log.v(TAG, "Intercepting bindApplication() for " + Arrays.toString(invocation.getArguments())); if (mRealAms.mConstants.mEnableWaitForFinishAttachApplication) { - mRealAms.finishAttachApplication(0); + mRealAms.finishAttachApplication(0, 0); } return null; }).when(thread).bindApplication( |