Loading services/core/java/com/android/server/am/AppStartInfoTracker.java +13 −16 Original line number Diff line number Diff line Loading @@ -196,6 +196,8 @@ public final class AppStartInfoTracker { start.setIntent(intent); start.setStartType(ApplicationStartInfo.START_TYPE_UNSET); start.addStartupTimestamp(ApplicationStartInfo.START_TIMESTAMP_LAUNCH, timestampNanos); // TODO: handle possible alarm activity start. if (intent != null && intent.getCategories() != null && intent.getCategories().contains(Intent.CATEGORY_LAUNCHER)) { start.setReason(ApplicationStartInfo.START_REASON_LAUNCHER); Loading Loading @@ -325,6 +327,8 @@ public final class AppStartInfoTracker { ApplicationStartInfo.START_TIMESTAMP_LAUNCH, startTimeNs); start.setStartType(cold ? ApplicationStartInfo.START_TYPE_COLD : ApplicationStartInfo.START_TYPE_WARM); // TODO: handle possible alarm service start. start.setReason(serviceRecord.permission != null && serviceRecord.permission.contains("android.permission.BIND_JOB_SERVICE") ? ApplicationStartInfo.START_REASON_JOB Loading @@ -336,8 +340,9 @@ public final class AppStartInfoTracker { } } public void handleProcessBroadcastStart(long startTimeNs, ProcessRecord app, BroadcastRecord broadcast, boolean cold) { /** Process a broadcast triggered app start. */ public void handleProcessBroadcastStart(long startTimeNs, ProcessRecord app, Intent intent, boolean isAlarm) { synchronized (mLock) { if (!mEnabled) { return; Loading @@ -347,26 +352,19 @@ public final class AppStartInfoTracker { start.setStartupState(ApplicationStartInfo.STARTUP_STATE_STARTED); start.addStartupTimestamp( ApplicationStartInfo.START_TIMESTAMP_LAUNCH, startTimeNs); start.setStartType(cold ? ApplicationStartInfo.START_TYPE_COLD : ApplicationStartInfo.START_TYPE_WARM); if (broadcast == null) { start.setReason(ApplicationStartInfo.START_REASON_BROADCAST); } else if (broadcast.alarm) { start.setStartType(ApplicationStartInfo.START_TYPE_COLD); if (isAlarm) { start.setReason(ApplicationStartInfo.START_REASON_ALARM); } else if (broadcast.pushMessage || broadcast.pushMessageOverQuota) { start.setReason(ApplicationStartInfo.START_REASON_PUSH); } else if (Intent.ACTION_BOOT_COMPLETED.equals(broadcast.intent.getAction())) { start.setReason(ApplicationStartInfo.START_REASON_BOOT_COMPLETE); } else { start.setReason(ApplicationStartInfo.START_REASON_BROADCAST); } start.setIntent(broadcast != null ? broadcast.intent : null); start.setIntent(intent); addStartInfoLocked(start); } } public void handleProcessContentProviderStart(long startTimeNs, ProcessRecord app, boolean cold) { /** Process a content provider triggered app start. */ public void handleProcessContentProviderStart(long startTimeNs, ProcessRecord app) { synchronized (mLock) { if (!mEnabled) { return; Loading @@ -376,8 +374,7 @@ public final class AppStartInfoTracker { start.setStartupState(ApplicationStartInfo.STARTUP_STATE_STARTED); start.addStartupTimestamp( ApplicationStartInfo.START_TIMESTAMP_LAUNCH, startTimeNs); start.setStartType(cold ? ApplicationStartInfo.START_TYPE_COLD : ApplicationStartInfo.START_TYPE_WARM); start.setStartType(ApplicationStartInfo.START_TYPE_COLD); start.setReason(ApplicationStartInfo.START_REASON_CONTENT_PROVIDER); addStartInfoLocked(start); } Loading services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +4 −0 Original line number Diff line number Diff line Loading @@ -1030,6 +1030,10 @@ class BroadcastQueueModernImpl extends BroadcastQueue { "startProcessLocked failed"); return true; } // TODO: b/335420031 - cache receiver intent to avoid multiple calls to getReceiverIntent. mService.mProcessList.getAppStartInfoTracker().handleProcessBroadcastStart( SystemClock.elapsedRealtimeNanos(), queue.app, r.getReceiverIntent(receiver), r.alarm /* isAlarm */); return false; } Loading services/core/java/com/android/server/am/ContentProviderHelper.java +3 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,7 @@ public class ContentProviderHelper { final int expectedUserId = userId; synchronized (mService) { long startTime = SystemClock.uptimeMillis(); long startElapsedTimeNs = SystemClock.elapsedRealtimeNanos(); ProcessRecord r = null; if (caller != null) { Loading Loading @@ -585,6 +586,8 @@ public class ContentProviderHelper { callingProcessState, ActivityManager.PROCESS_STATE_NONEXISTENT, firstLaunch, 0L /* TODO: stoppedDuration */); mService.mProcessList.getAppStartInfoTracker() .handleProcessContentProviderStart(startElapsedTimeNs, proc); } cpr.launchingApp = proc; mLaunchingProviders.add(cpr); Loading services/tests/mockingservicestests/src/com/android/server/am/ApplicationStartInfoTest.java +3 −3 Original line number Diff line number Diff line Loading @@ -350,7 +350,7 @@ public class ApplicationStartInfoTest { app1PackageName); // packageName mAppStartInfoTracker.handleProcessBroadcastStart(appStartTimestampBroadcast, app, null, true /* isColdStart */); buildIntent(COMPONENT), false /* isAlarm */); list.clear(); mAppStartInfoTracker.getStartInfo(app1PackageName, app1UidUser2, app1PidUser2, 0, list); assertEquals(list.size(), 1); Loading Loading @@ -395,7 +395,7 @@ public class ApplicationStartInfoTest { app2PackageName); // packageName mAppStartInfoTracker.handleProcessContentProviderStart(appStartTimestampRContentProvider, app, false); app); list.clear(); mAppStartInfoTracker.getStartInfo(app2PackageName, app2UidUser2, app2PidUser2, 0, list); assertEquals(list.size(), 1); Loading @@ -409,7 +409,7 @@ public class ApplicationStartInfoTest { app2ProcessName, // processName ApplicationStartInfo.START_REASON_CONTENT_PROVIDER, // reason ApplicationStartInfo.STARTUP_STATE_STARTED, // startup state ApplicationStartInfo.START_TYPE_WARM, // state type ApplicationStartInfo.START_TYPE_COLD, // state type ApplicationStartInfo.LAUNCH_MODE_STANDARD); // launch mode // Case 8: Save and load again Loading services/tests/mockingservicestests/src/com/android/server/am/BaseBroadcastQueueTest.java +5 −0 Original line number Diff line number Diff line Loading @@ -112,6 +112,9 @@ public abstract class BaseBroadcastQueueTest { @Mock ProcessList mProcessList; @Mock AppStartInfoTracker mAppStartInfoTracker; Context mContext; ActivityManagerService mAms; BroadcastConstants mConstants; Loading Loading @@ -172,6 +175,8 @@ public abstract class BaseBroadcastQueueTest { mSkipPolicy = spy(new BroadcastSkipPolicy(mAms)); doReturn(null).when(mSkipPolicy).shouldSkipMessage(any(), any()); doReturn(false).when(mSkipPolicy).disallowBackgroundStart(any()); doReturn(mAppStartInfoTracker).when(mProcessList).getAppStartInfoTracker(); } public void tearDown() throws Exception { Loading Loading
services/core/java/com/android/server/am/AppStartInfoTracker.java +13 −16 Original line number Diff line number Diff line Loading @@ -196,6 +196,8 @@ public final class AppStartInfoTracker { start.setIntent(intent); start.setStartType(ApplicationStartInfo.START_TYPE_UNSET); start.addStartupTimestamp(ApplicationStartInfo.START_TIMESTAMP_LAUNCH, timestampNanos); // TODO: handle possible alarm activity start. if (intent != null && intent.getCategories() != null && intent.getCategories().contains(Intent.CATEGORY_LAUNCHER)) { start.setReason(ApplicationStartInfo.START_REASON_LAUNCHER); Loading Loading @@ -325,6 +327,8 @@ public final class AppStartInfoTracker { ApplicationStartInfo.START_TIMESTAMP_LAUNCH, startTimeNs); start.setStartType(cold ? ApplicationStartInfo.START_TYPE_COLD : ApplicationStartInfo.START_TYPE_WARM); // TODO: handle possible alarm service start. start.setReason(serviceRecord.permission != null && serviceRecord.permission.contains("android.permission.BIND_JOB_SERVICE") ? ApplicationStartInfo.START_REASON_JOB Loading @@ -336,8 +340,9 @@ public final class AppStartInfoTracker { } } public void handleProcessBroadcastStart(long startTimeNs, ProcessRecord app, BroadcastRecord broadcast, boolean cold) { /** Process a broadcast triggered app start. */ public void handleProcessBroadcastStart(long startTimeNs, ProcessRecord app, Intent intent, boolean isAlarm) { synchronized (mLock) { if (!mEnabled) { return; Loading @@ -347,26 +352,19 @@ public final class AppStartInfoTracker { start.setStartupState(ApplicationStartInfo.STARTUP_STATE_STARTED); start.addStartupTimestamp( ApplicationStartInfo.START_TIMESTAMP_LAUNCH, startTimeNs); start.setStartType(cold ? ApplicationStartInfo.START_TYPE_COLD : ApplicationStartInfo.START_TYPE_WARM); if (broadcast == null) { start.setReason(ApplicationStartInfo.START_REASON_BROADCAST); } else if (broadcast.alarm) { start.setStartType(ApplicationStartInfo.START_TYPE_COLD); if (isAlarm) { start.setReason(ApplicationStartInfo.START_REASON_ALARM); } else if (broadcast.pushMessage || broadcast.pushMessageOverQuota) { start.setReason(ApplicationStartInfo.START_REASON_PUSH); } else if (Intent.ACTION_BOOT_COMPLETED.equals(broadcast.intent.getAction())) { start.setReason(ApplicationStartInfo.START_REASON_BOOT_COMPLETE); } else { start.setReason(ApplicationStartInfo.START_REASON_BROADCAST); } start.setIntent(broadcast != null ? broadcast.intent : null); start.setIntent(intent); addStartInfoLocked(start); } } public void handleProcessContentProviderStart(long startTimeNs, ProcessRecord app, boolean cold) { /** Process a content provider triggered app start. */ public void handleProcessContentProviderStart(long startTimeNs, ProcessRecord app) { synchronized (mLock) { if (!mEnabled) { return; Loading @@ -376,8 +374,7 @@ public final class AppStartInfoTracker { start.setStartupState(ApplicationStartInfo.STARTUP_STATE_STARTED); start.addStartupTimestamp( ApplicationStartInfo.START_TIMESTAMP_LAUNCH, startTimeNs); start.setStartType(cold ? ApplicationStartInfo.START_TYPE_COLD : ApplicationStartInfo.START_TYPE_WARM); start.setStartType(ApplicationStartInfo.START_TYPE_COLD); start.setReason(ApplicationStartInfo.START_REASON_CONTENT_PROVIDER); addStartInfoLocked(start); } Loading
services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +4 −0 Original line number Diff line number Diff line Loading @@ -1030,6 +1030,10 @@ class BroadcastQueueModernImpl extends BroadcastQueue { "startProcessLocked failed"); return true; } // TODO: b/335420031 - cache receiver intent to avoid multiple calls to getReceiverIntent. mService.mProcessList.getAppStartInfoTracker().handleProcessBroadcastStart( SystemClock.elapsedRealtimeNanos(), queue.app, r.getReceiverIntent(receiver), r.alarm /* isAlarm */); return false; } Loading
services/core/java/com/android/server/am/ContentProviderHelper.java +3 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,7 @@ public class ContentProviderHelper { final int expectedUserId = userId; synchronized (mService) { long startTime = SystemClock.uptimeMillis(); long startElapsedTimeNs = SystemClock.elapsedRealtimeNanos(); ProcessRecord r = null; if (caller != null) { Loading Loading @@ -585,6 +586,8 @@ public class ContentProviderHelper { callingProcessState, ActivityManager.PROCESS_STATE_NONEXISTENT, firstLaunch, 0L /* TODO: stoppedDuration */); mService.mProcessList.getAppStartInfoTracker() .handleProcessContentProviderStart(startElapsedTimeNs, proc); } cpr.launchingApp = proc; mLaunchingProviders.add(cpr); Loading
services/tests/mockingservicestests/src/com/android/server/am/ApplicationStartInfoTest.java +3 −3 Original line number Diff line number Diff line Loading @@ -350,7 +350,7 @@ public class ApplicationStartInfoTest { app1PackageName); // packageName mAppStartInfoTracker.handleProcessBroadcastStart(appStartTimestampBroadcast, app, null, true /* isColdStart */); buildIntent(COMPONENT), false /* isAlarm */); list.clear(); mAppStartInfoTracker.getStartInfo(app1PackageName, app1UidUser2, app1PidUser2, 0, list); assertEquals(list.size(), 1); Loading Loading @@ -395,7 +395,7 @@ public class ApplicationStartInfoTest { app2PackageName); // packageName mAppStartInfoTracker.handleProcessContentProviderStart(appStartTimestampRContentProvider, app, false); app); list.clear(); mAppStartInfoTracker.getStartInfo(app2PackageName, app2UidUser2, app2PidUser2, 0, list); assertEquals(list.size(), 1); Loading @@ -409,7 +409,7 @@ public class ApplicationStartInfoTest { app2ProcessName, // processName ApplicationStartInfo.START_REASON_CONTENT_PROVIDER, // reason ApplicationStartInfo.STARTUP_STATE_STARTED, // startup state ApplicationStartInfo.START_TYPE_WARM, // state type ApplicationStartInfo.START_TYPE_COLD, // state type ApplicationStartInfo.LAUNCH_MODE_STANDARD); // launch mode // Case 8: Save and load again Loading
services/tests/mockingservicestests/src/com/android/server/am/BaseBroadcastQueueTest.java +5 −0 Original line number Diff line number Diff line Loading @@ -112,6 +112,9 @@ public abstract class BaseBroadcastQueueTest { @Mock ProcessList mProcessList; @Mock AppStartInfoTracker mAppStartInfoTracker; Context mContext; ActivityManagerService mAms; BroadcastConstants mConstants; Loading Loading @@ -172,6 +175,8 @@ public abstract class BaseBroadcastQueueTest { mSkipPolicy = spy(new BroadcastSkipPolicy(mAms)); doReturn(null).when(mSkipPolicy).shouldSkipMessage(any(), any()); doReturn(false).when(mSkipPolicy).disallowBackgroundStart(any()); doReturn(mAppStartInfoTracker).when(mProcessList).getAppStartInfoTracker(); } public void tearDown() throws Exception { Loading