Add reason, reason_id and launch_dur values to slow_start_reason_with_details.

bug: 308460401

test: diff_tests

Change-Id: Ibb02737a206cce589302f7753b2387d47cff8392
diff --git a/protos/perfetto/metrics/android/startup_metric.proto b/protos/perfetto/metrics/android/startup_metric.proto
index 66f01ec..4a93ebc 100644
--- a/protos/perfetto/metrics/android/startup_metric.proto
+++ b/protos/perfetto/metrics/android/startup_metric.proto
@@ -342,7 +342,7 @@
     optional uint32 thread_utid = 3;
   }
 
-  // Next id: 24
+  // Next id: 25
   message Startup {
     // Random id uniquely identifying an app startup in this trace.
     optional uint32 startup_id = 1;
@@ -424,9 +424,16 @@
     // Optional.
     repeated string slow_start_reason = 17;
 
-    // Same as slow_start_reason, but with more detailed information.
+    // Same as slow_start_reason, but with more detailed information, obsolete.
     repeated SlowStartReasonDetailed slow_start_reason_detailed = 21;
 
+    // Similar to slow_start_reason_detailed, but with much more comprehensive info.
+    // such as expected threshold, actual value and threads/slices to inspect.
+    // slow_start_reason will be obsolete once slow_start_reason_with_details is completed
+    // since slow_start_reason_with_details contains all the data in slow_start_reason
+    // and more.
+    repeated SlowStartReason slow_start_reason_with_details = 24;
+
     reserved 10;
   }
 
diff --git a/protos/perfetto/metrics/perfetto_merged_metrics.proto b/protos/perfetto/metrics/perfetto_merged_metrics.proto
index bffca26..ad2d6b2 100644
--- a/protos/perfetto/metrics/perfetto_merged_metrics.proto
+++ b/protos/perfetto/metrics/perfetto_merged_metrics.proto
@@ -2458,7 +2458,7 @@
     optional uint32 thread_utid = 3;
   }
 
-  // Next id: 24
+  // Next id: 25
   message Startup {
     // Random id uniquely identifying an app startup in this trace.
     optional uint32 startup_id = 1;
@@ -2540,9 +2540,16 @@
     // Optional.
     repeated string slow_start_reason = 17;
 
-    // Same as slow_start_reason, but with more detailed information.
+    // Same as slow_start_reason, but with more detailed information, obsolete.
     repeated SlowStartReasonDetailed slow_start_reason_detailed = 21;
 
+    // Similar to slow_start_reason_detailed, but with much more comprehensive info.
+    // such as expected threshold, actual value and threads/slices to inspect.
+    // slow_start_reason will be obsolete once slow_start_reason_with_details is completed
+    // since slow_start_reason_with_details contains all the data in slow_start_reason
+    // and more.
+    repeated SlowStartReason slow_start_reason_with_details = 24;
+
     reserved 10;
   }
 
diff --git a/python/perfetto/trace_processor/metrics.descriptor b/python/perfetto/trace_processor/metrics.descriptor
index ef13816..f212c89 100644
--- a/python/perfetto/trace_processor/metrics.descriptor
+++ b/python/perfetto/trace_processor/metrics.descriptor
Binary files differ
diff --git a/src/trace_processor/metrics/sql/android/android_startup.sql b/src/trace_processor/metrics/sql/android/android_startup.sql
index 95d050b..2e2e48e 100644
--- a/src/trace_processor/metrics/sql/android/android_startup.sql
+++ b/src/trace_processor/metrics/sql/android/android_startup.sql
@@ -514,7 +514,7 @@
 
       )
     ),
-    'slow_start_reason_detailed', get_slow_start_reason_detailed(launches.startup_id)
+    'slow_start_reason_with_details', get_slow_start_reason_with_details(launches.startup_id)
   ) AS startup
 FROM android_startups launches;
 
diff --git a/src/trace_processor/metrics/sql/android/startup/slow_start_reasons.sql b/src/trace_processor/metrics/sql/android/startup/slow_start_reasons.sql
index 2a673c0..8108fa6 100644
--- a/src/trace_processor/metrics/sql/android/startup/slow_start_reasons.sql
+++ b/src/trace_processor/metrics/sql/android/startup/slow_start_reasons.sql
@@ -201,110 +201,130 @@
     ORDER BY slice_dur DESC
     LIMIT 1;
 
-
-CREATE OR REPLACE PERFETTO FUNCTION get_slow_start_reason_detailed(startup_id LONG)
+CREATE OR REPLACE PERFETTO FUNCTION get_slow_start_reason_with_details(startup_id LONG)
 RETURNS PROTO AS
-      SELECT RepeatedField(AndroidStartupMetric_SlowStartReasonDetailed(
+      SELECT RepeatedField(AndroidStartupMetric_SlowStartReason(
+        'reason_id', reason_id,
         'reason', slow_cause,
-        'details', details))
+        'launch_dur', launch_dur))
       FROM (
         SELECT 'No baseline or cloud profiles' AS slow_cause,
-          get_missing_baseline_profile_for_launch(launch.startup_id, launch.package) as details
+          launch.dur as launch_dur,
+          'NO_BASELINE_OR_CLOUD_PROFILES' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND missing_baseline_profile_for_launch(launch.startup_id, launch.package)
 
         UNION ALL
-        SELECT 'Optimized artifacts missing, run from apk' as slow_cause, NULL as details
+        SELECT 'Optimized artifacts missing, run from apk' as slow_cause,
+          launch.dur as launch_dur,
+          'RUN_FROM_APK' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
-          AND  run_from_apk_for_launch(launch.startup_id)
+          AND run_from_apk_for_launch(launch.startup_id)
 
         UNION ALL
-        SELECT 'Unlock running during launch' as slow_cause, NULL as details
+        SELECT 'Unlock running during launch' as slow_cause,
+          launch.dur as launch_dur,
+          'UNLOCK_RUNNING' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
          AND is_unlock_running_during_launch(launch.startup_id)
 
         UNION ALL
-        SELECT 'App in debuggable mode' as slow_cause, NULL as details
-       	FROM android_startups launch
+        SELECT 'App in debuggable mode' as slow_cause,
+          launch.dur as launch_dur,
+          'APP_IN_DEBUGGABLE_MODE' as reason_id
+        FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND is_process_debuggable(launch.package)
 
         UNION ALL
-        SELECT 'GC Activity' as slow_cause, NULL as details
+        SELECT 'GC Activity' as slow_cause,
+          launch.dur as launch_dur,
+          'GC_ACTIVITY' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND total_gc_time_by_launch(launch.startup_id) > 0
 
         UNION ALL
-        SELECT 'dex2oat running during launch' AS slow_cause, NULL as details
+        SELECT 'dex2oat running during launch' AS slow_cause,
+          launch.dur as launch_dur,
+          'DEX2OAT_RUNNING' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id AND
           dur_of_process_running_concurrent_to_launch(launch.startup_id, '*dex2oat64') > 0
 
         UNION ALL
-        SELECT 'installd running during launch' AS slow_cause, NULL as details
+        SELECT 'installd running during launch' AS slow_cause,
+          launch.dur as launch_dur,
+          'INSTALLD_RUNNING' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id AND
           dur_of_process_running_concurrent_to_launch(launch.startup_id, '*installd') > 0
 
         UNION ALL
         SELECT 'Main Thread - Time spent in Runnable state' as slow_cause,
-          get_main_thread_time_for_launch_in_runnable_state(
-            launch.startup_id, launch.dur) as details
+          launch.dur as launch_dur,
+          'MAIN_THREAD_TIME_SPENT_IN_RUNNABLE' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND main_thread_time_for_launch_in_runnable_state(launch.startup_id) > launch.dur * 0.15
 
         UNION ALL
-        SELECT 'Main Thread - Time spent in interruptible sleep state'
-          AS slow_cause, NULL as details
+        SELECT 'Main Thread - Time spent in interruptible sleep state' as slow_cause,
+          launch.dur as launch_dur,
+          'MAIN_THREAD_TIME_SPENT_IN_INTERRUPTIBLE_SLEEP' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND main_thread_time_for_launch_and_state(launch.startup_id, 'S') > 2900e6
 
         UNION ALL
-        SELECT 'Main Thread - Time spent in Blocking I/O' as slow_cause, NULL as details
+        SELECT 'Main Thread - Time spent in Blocking I/O' as slow_cause,
+          launch.dur as launch_dur,
+          'MAIN_THREAD_TIME_SPENT_IN_BLOCKING_IO' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND main_thread_time_for_launch_state_and_io_wait(launch.startup_id, 'D*', TRUE) > 450e6
 
         UNION ALL
         SELECT 'Main Thread - Time spent in OpenDexFilesFromOat*' as slow_cause,
-          get_android_sum_dur_on_main_thread_for_startup_and_slice(
-            launch.startup_id, 'OpenDexFilesFromOat*', launch.dur) as details
+          launch.dur as launch_dur,
+          'MAIN_THREAD_TIME_SPENT_IN_OPEN_DEX_FILES_FROM_OAT' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id AND
           android_sum_dur_on_main_thread_for_startup_and_slice(
           launch.startup_id, 'OpenDexFilesFromOat*') > launch.dur * 0.2
 
         UNION ALL
-        SELECT 'Time spent in bindApplication'
-          AS slow_cause, NULL as details
+        SELECT 'Time spent in bindApplication' as slow_cause,
+          launch.dur as launch_dur,
+          'TIME_SPENT_IN_BIND_APPLICATION' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND android_sum_dur_for_startup_and_slice(launch.startup_id, 'bindApplication') > 1250e6
 
         UNION ALL
-        SELECT 'Time spent in view inflation' as slow_cause, NULL as details
+        SELECT 'Time spent in view inflation' as slow_cause,
+          launch.dur as launch_dur,
+          'TIME_SPENT_IN_VIEW_INFLATION' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND android_sum_dur_for_startup_and_slice(launch.startup_id, 'inflate') > 450e6
 
         UNION ALL
         SELECT 'Time spent in ResourcesManager#getResources' as slow_cause,
-          get_android_sum_dur_for_startup_and_slice(
-            launch.startup_id, 'ResourcesManager#getResources', 130) as details
+          launch.dur as launch_dur,
+          'TIME_SPENT_IN_RESOURCES_MANAGER_GET_RESOURCES' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND android_sum_dur_for_startup_and_slice(
           launch.startup_id, 'ResourcesManager#getResources') > 130e6
 
         UNION ALL
-        SELECT 'Time spent verifying classes'
-          AS slow_cause, NULL as details
+        SELECT 'Time spent verifying classes' as slow_cause,
+          launch.dur as launch_dur,
+          'TIME_SPENT_VERIFYING_CLASSES' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id AND
           android_sum_dur_for_startup_and_slice(launch.startup_id, 'VerifyClass*')
@@ -312,7 +332,8 @@
 
         UNION ALL
         SELECT 'Potential CPU contention with another process' AS slow_cause,
-          get_potential_cpu_contention_with_another_process(launch.startup_id) as details
+          launch.dur as launch_dur,
+          'POTENTIAL_CPU_CONTENTION_WITH_ANOTHER_PROCESS' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id AND
           main_thread_time_for_launch_in_runnable_state(launch.startup_id) > 100e6 AND
@@ -320,7 +341,8 @@
 
         UNION ALL
         SELECT 'JIT Activity' as slow_cause,
-          get_jit_activity(launch.startup_id) as details
+          launch.dur as launch_dur,
+          'JIT_ACTIVITY' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
         AND thread_time_for_launch_state_and_thread(
@@ -330,8 +352,9 @@
         ) > 100e6
 
         UNION ALL
-        SELECT 'Main Thread - Lock contention'
-          AS slow_cause, NULL as details
+        SELECT 'Main Thread - Lock contention' as slow_cause,
+          launch.dur as launch_dur,
+          'MAIN_THREAD_LOCK_CONTENTION' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND android_sum_dur_on_main_thread_for_startup_and_slice(
@@ -340,8 +363,9 @@
         ) > launch.dur * 0.2
 
         UNION ALL
-        SELECT 'Main Thread - Monitor contention'
-          AS slow_cause, NULL as details
+        SELECT 'Main Thread - Monitor contention' as slow_cause,
+          launch.dur as launch_dur,
+          'MAIN_THREAD_MONITOR_CONTENTION' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND android_sum_dur_on_main_thread_for_startup_and_slice(
@@ -350,51 +374,55 @@
         ) > launch.dur * 0.15
 
         UNION ALL
-        SELECT 'JIT compiled methods' as slow_cause, NULL as details
+        SELECT 'JIT compiled methods' as slow_cause,
+          launch.dur as launch_dur,
+          'JIT_COMPILED_METHODS' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND (
           SELECT COUNT(1)
           FROM ANDROID_SLICES_FOR_STARTUP_AND_SLICE_NAME(launch.startup_id, 'JIT compiling*')
-          WHERE thread_name = 'Jit thread pool'
-        ) > 65
+          WHERE thread_name = 'Jit thread pool') > 65
 
         UNION ALL
-        SELECT 'Broadcast dispatched count' as slow_cause, NULL as details
+        SELECT 'Broadcast dispatched count' as slow_cause,
+          launch.dur as launch_dur,
+          'BROADCAST_DISPATCHED_COUNT' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND count_slices_concurrent_to_launch(
           launch.startup_id,
-          'Broadcast dispatched*'
-        ) > 15
+          'Broadcast dispatched*') > 15
 
         UNION ALL
-        SELECT 'Broadcast received count' as slow_cause, NULL as details
+        SELECT 'Broadcast received count' as slow_cause,
+          launch.dur as launch_dur,
+          'BROADCAST_RECEIVED_COUNT' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND count_slices_concurrent_to_launch(
           launch.startup_id,
-          'broadcastReceiveReg*'
-        ) > 50
+          'broadcastReceiveReg*') > 50
 
         UNION ALL
-        SELECT 'Startup running concurrent to launch' as slow_cause, NULL as details
+        SELECT 'Startup running concurrent to launch' as slow_cause,
+          launch.dur as launch_dur,
+          'STARTUP_RUNNING_CONCURRENT' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND EXISTS(
           SELECT package
           FROM android_startups l
           WHERE l.startup_id != launch.startup_id
-            AND _is_spans_overlapping(l.ts, l.ts_end, launch.ts, launch.ts_end)
-        )
+            AND _is_spans_overlapping(l.ts, l.ts_end, launch.ts, launch.ts_end))
 
         UNION ALL
         SELECT 'Main Thread - Binder transactions blocked' as slow_cause,
-          get_main_thread_binder_transactions_blocked(launch.startup_id, 2e7) as details
+          launch.dur as launch_dur,
+          'MAIN_THREAD_BINDER_TRANSCATIONS_BLOCKED' as reason_id
         FROM android_startups launch
         WHERE launch.startup_id = $startup_id
           AND (
           SELECT COUNT(1)
-          FROM BINDER_TRANSACTION_REPLY_SLICES_FOR_LAUNCH(launch.startup_id, 2e7)
-        ) > 0
-      );
+          FROM BINDER_TRANSACTION_REPLY_SLICES_FOR_LAUNCH(launch.startup_id, 2e7)) > 0
+    );
diff --git a/test/trace_processor/diff_tests/metrics/startup/android_startup.out b/test/trace_processor/diff_tests/metrics/startup/android_startup.out
index 9dfc289..9928efb 100644
--- a/test/trace_processor/diff_tests/metrics/startup/android_startup.out
+++ b/test/trace_processor/diff_tests/metrics/startup/android_startup.out
@@ -67,10 +67,11 @@
       installd_dur_ns: 0
       dex2oat_dur_ns: 0
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: MAIN_THREAD_TIME_SPENT_IN_RUNNABLE
       reason: "Main Thread - Time spent in Runnable state"
-      details: " target 15% actual 74.07% [ longest_chunk: start_s 3.0e-08 dur_ms 8.0e-0 thread_id 3 thread_name com.google.android.calendar ] [ extra_info:  launches_dur_ms 0.0001 runnable_dur_ms 8.0e-0 R_sum_dur_ms 8.0e-0 R+(Preempted)_sum_dur_ms 0.0 ]"
-    } 
+      launch_dur: 108
+    }
     startup_type: "warm"
   }
 }
diff --git a/test/trace_processor/diff_tests/metrics/startup/android_startup_attribution.out b/test/trace_processor/diff_tests/metrics/startup/android_startup_attribution.out
index 9b6e742..30a1b23 100644
--- a/test/trace_processor/diff_tests/metrics/startup/android_startup_attribution.out
+++ b/test/trace_processor/diff_tests/metrics/startup/android_startup_attribution.out
@@ -134,14 +134,20 @@
     slow_start_reason: "GC Activity"
     slow_start_reason: "Main Thread - Time spent in OpenDexFilesFromOat*"
     slow_start_reason: "Main Thread - Binder transactions blocked"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: GC_ACTIVITY
       reason: "GC Activity"
+      launch_dur: 999999900
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: MAIN_THREAD_TIME_SPENT_IN_OPEN_DEX_FILES_FROM_OAT
       reason: "Main Thread - Time spent in OpenDexFilesFromOat*"
+      launch_dur: 999999900
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: MAIN_THREAD_BINDER_TRANSCATIONS_BLOCKED
       reason: "Main Thread - Binder transactions blocked"
+      launch_dur: 999999900
     }
   }
 }
diff --git a/test/trace_processor/diff_tests/metrics/startup/android_startup_attribution_slow.out b/test/trace_processor/diff_tests/metrics/startup/android_startup_attribution_slow.out
index 3e8ff27..cd305f1 100644
--- a/test/trace_processor/diff_tests/metrics/startup/android_startup_attribution_slow.out
+++ b/test/trace_processor/diff_tests/metrics/startup/android_startup_attribution_slow.out
@@ -98,15 +98,20 @@
     slow_start_reason: "GC Activity"
     slow_start_reason: "JIT Activity"
     slow_start_reason: "JIT compiled methods"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: GC_ACTIVITY
       reason: "GC Activity"
+      launch_dur: 999999900000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: JIT_ACTIVITY
       reason: "JIT Activity"
-      details: " target 100ms actual 20000.ms [ longest_chunk: start_s 154.99 dur_ms 10000. thread_id 4 thread_name Jit thread pool ]"
+      launch_dur: 999999900000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: JIT_COMPILED_METHODS
       reason: "JIT compiled methods"
+      launch_dur: 999999900000000000
     }
   }
 }
diff --git a/test/trace_processor/diff_tests/metrics/startup/android_startup_breakdown.out b/test/trace_processor/diff_tests/metrics/startup/android_startup_breakdown.out
index f40578d..e91c756 100644
--- a/test/trace_processor/diff_tests/metrics/startup/android_startup_breakdown.out
+++ b/test/trace_processor/diff_tests/metrics/startup/android_startup_breakdown.out
@@ -119,26 +119,35 @@
     slow_start_reason: "Time spent in bindApplication"
     slow_start_reason: "Time spent in view inflation"
     slow_start_reason: "Time spent in ResourcesManager#getResources"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: NO_BASELINE_OR_CLOUD_PROFILES
       reason: "No baseline or cloud profiles"
-      details: " target FALSE actual TRUE [ longest_chunk: start_s 154.0 dur_ms 1000.0 thread_id -1 thread_name com.google.android.calendar ] [ extra_info:  slice_name location=/system/framework/oat/arm/com.google.android.calendar.odex status=up-to-date filter=speed reason=install-dm ]"
+      launch_dur: 108000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: RUN_FROM_APK
       reason: "Optimized artifacts missing, run from apk"
+      launch_dur: 108000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: TIME_SPENT_IN_BIND_APPLICATION
       reason: "Time spent in bindApplication"
+      launch_dur: 108000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: TIME_SPENT_IN_VIEW_INFLATION
       reason: "Time spent in view inflation"
+      launch_dur: 108000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: TIME_SPENT_IN_RESOURCES_MANAGER_GET_RESOURCES
       reason: "Time spent in ResourcesManager#getResources"
-      details: " target 130ms actual 1000.0ms [ longest_chunk: start_s 138.0 dur_ms 1000.0 thread_id 3 thread_name com.google.android.calendar ]"
+      launch_dur: 108000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: POTENTIAL_CPU_CONTENTION_WITH_ANOTHER_PROCESS
       reason: "Potential CPU contention with another process"
-      details: " target 100ms actual 5000.0ms most_active_process_for_launch init [ longest_chunk: start_s 155.0 dur_ms 5000.0 thread_id 3 thread_name com.google.android.calendar ] [ extra_info:  runnable_dur_ms 5000.0 R_sum_dur_ms 5000.0 R+(Preempted)_sum_dur 0 ]"
+      launch_dur: 108000000000
     }
     startup_type: "cold"
   }
diff --git a/test/trace_processor/diff_tests/metrics/startup/android_startup_breakdown_slow.out b/test/trace_processor/diff_tests/metrics/startup/android_startup_breakdown_slow.out
index 891060b..bb11660 100644
--- a/test/trace_processor/diff_tests/metrics/startup/android_startup_breakdown_slow.out
+++ b/test/trace_processor/diff_tests/metrics/startup/android_startup_breakdown_slow.out
@@ -118,22 +118,30 @@
     slow_start_reason: "Time spent in bindApplication"
     slow_start_reason: "Time spent in view inflation"
     slow_start_reason: "Time spent in ResourcesManager#getResources"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: RUN_FROM_APK
       reason: "Optimized artifacts missing, run from apk"
+      launch_dur: 108000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: TIME_SPENT_IN_BIND_APPLICATION
       reason: "Time spent in bindApplication"
+      launch_dur: 108000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: TIME_SPENT_IN_VIEW_INFLATION
       reason: "Time spent in view inflation"
+      launch_dur: 108000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: TIME_SPENT_IN_RESOURCES_MANAGER_GET_RESOURCES
       reason: "Time spent in ResourcesManager#getResources"
-      details: " target 130ms actual 5000.0ms [ longest_chunk: start_s 137.0 dur_ms 5000.0 thread_id 3 thread_name com.google.android.calendar ]"
+      launch_dur: 108000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: POTENTIAL_CPU_CONTENTION_WITH_ANOTHER_PROCESS
       reason: "Potential CPU contention with another process"
-      details: " target 100ms actual 5000.0ms most_active_process_for_launch init [ longest_chunk: start_s 155.0 dur_ms 5000.0 thread_id 3 thread_name com.google.android.calendar ] [ extra_info:  runnable_dur_ms 5000.0 R_sum_dur_ms 5000.0 R+(Preempted)_sum_dur 0 ]"
+      launch_dur: 108000000000
     }
     startup_type: "cold"
   }
diff --git a/test/trace_processor/diff_tests/metrics/startup/android_startup_broadcast_multiple.out b/test/trace_processor/diff_tests/metrics/startup/android_startup_broadcast_multiple.out
index 02e142c..7f7d68c 100644
--- a/test/trace_processor/diff_tests/metrics/startup/android_startup_broadcast_multiple.out
+++ b/test/trace_processor/diff_tests/metrics/startup/android_startup_broadcast_multiple.out
@@ -31,11 +31,15 @@
     }
     slow_start_reason: "Broadcast dispatched count"
     slow_start_reason: "Broadcast received count"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: BROADCAST_DISPATCHED_COUNT
       reason: "Broadcast dispatched count"
+      launch_dur: 100
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: BROADCAST_RECEIVED_COUNT
       reason: "Broadcast received count"
+      launch_dur: 100
     }
   }
 }
diff --git a/test/trace_processor/diff_tests/metrics/startup/android_startup_installd_dex2oat.out b/test/trace_processor/diff_tests/metrics/startup/android_startup_installd_dex2oat.out
index 1fd7f2e..488e597 100644
--- a/test/trace_processor/diff_tests/metrics/startup/android_startup_installd_dex2oat.out
+++ b/test/trace_processor/diff_tests/metrics/startup/android_startup_installd_dex2oat.out
@@ -62,8 +62,10 @@
       dex2oat_dur_ns: 5
     }
     slow_start_reason: "dex2oat running during launch"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: DEX2OAT_RUNNING
       reason: "dex2oat running during launch"
+      launch_dur: 100
     }
   }
   startup {
@@ -98,8 +100,10 @@
       dex2oat_dur_ns: 0
     }
     slow_start_reason: "installd running during launch"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: INSTALLD_RUNNING
       reason: "installd running during launch"
+      launch_dur: 100
     }
   }
   startup {
@@ -136,11 +140,15 @@
     }
     slow_start_reason: "dex2oat running during launch"
     slow_start_reason: "installd running during launch"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: DEX2OAT_RUNNING
       reason: "dex2oat running during launch"
+      launch_dur: 100
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: INSTALLD_RUNNING
       reason: "installd running during launch"
+      launch_dur: 100
     }
   }
 }
diff --git a/test/trace_processor/diff_tests/metrics/startup/android_startup_installd_dex2oat_slow.out b/test/trace_processor/diff_tests/metrics/startup/android_startup_installd_dex2oat_slow.out
index 91e0d5a..2cc2b16 100644
--- a/test/trace_processor/diff_tests/metrics/startup/android_startup_installd_dex2oat_slow.out
+++ b/test/trace_processor/diff_tests/metrics/startup/android_startup_installd_dex2oat_slow.out
@@ -62,8 +62,10 @@
       dex2oat_dur_ns: 5000000000
     }
     slow_start_reason: "dex2oat running during launch"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: DEX2OAT_RUNNING
       reason: "dex2oat running during launch"
+      launch_dur: 100000000000
     }
   }
   startup {
@@ -101,14 +103,20 @@
     slow_start_reason: "dex2oat running during launch"
     slow_start_reason: "installd running during launch"
     slow_start_reason: "Startup running concurrent to launch"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: DEX2OAT_RUNNING
       reason: "dex2oat running during launch"
+      launch_dur: 250000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: INSTALLD_RUNNING
       reason: "installd running during launch"
+      launch_dur: 250000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: STARTUP_RUNNING_CONCURRENT
       reason: "Startup running concurrent to launch"
+      launch_dur: 250000000000
     }
     startup_concurrent_to_launch: "com.google.android.gm"
   }
@@ -145,14 +153,20 @@
     slow_start_reason: "dex2oat running during launch"
     slow_start_reason: "installd running during launch"
     slow_start_reason: "Startup running concurrent to launch"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: DEX2OAT_RUNNING
       reason: "dex2oat running during launch"
+      launch_dur: 100000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: INSTALLD_RUNNING
       reason: "installd running during launch"
+      launch_dur: 100000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: STARTUP_RUNNING_CONCURRENT
       reason: "Startup running concurrent to launch"
+      launch_dur: 100000000000
     }
     startup_concurrent_to_launch: "com.google.android.deskclock"
   }
diff --git a/test/trace_processor/diff_tests/metrics/startup/android_startup_lock_contention_slow.out b/test/trace_processor/diff_tests/metrics/startup/android_startup_lock_contention_slow.out
index 3e5f6a6..05fc7d1 100644
--- a/test/trace_processor/diff_tests/metrics/startup/android_startup_lock_contention_slow.out
+++ b/test/trace_processor/diff_tests/metrics/startup/android_startup_lock_contention_slow.out
@@ -72,14 +72,20 @@
     slow_start_reason: "Time spent in bindApplication"
     slow_start_reason: "Main Thread - Lock contention"
     slow_start_reason: "Main Thread - Monitor contention"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: TIME_SPENT_IN_BIND_APPLICATION
       reason: "Time spent in bindApplication"
+      launch_dur: 100000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: MAIN_THREAD_LOCK_CONTENTION
       reason: "Main Thread - Lock contention"
+      launch_dur: 100000000000
     }
-    slow_start_reason_detailed {
-      reason: "Main Thread - Monitor contention"
+    slow_start_reason_with_details {
+     reason_id: MAIN_THREAD_MONITOR_CONTENTION
+     reason: "Main Thread - Monitor contention"
+     launch_dur: 100000000000
     }
     startup_type: "cold"
   }
diff --git a/test/trace_processor/diff_tests/metrics/startup/android_startup_minsdk33.out b/test/trace_processor/diff_tests/metrics/startup/android_startup_minsdk33.out
index e56ae6f..1ee29d4 100644
--- a/test/trace_processor/diff_tests/metrics/startup/android_startup_minsdk33.out
+++ b/test/trace_processor/diff_tests/metrics/startup/android_startup_minsdk33.out
@@ -30,8 +30,10 @@
       dex2oat_dur_ns: 0
     }
     slow_start_reason: "App in debuggable mode"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: APP_IN_DEBUGGABLE_MODE
       reason: "App in debuggable mode"
+      launch_dur: 100
     }
   }
   startup {
@@ -86,8 +88,10 @@
     }
     startup_type: "hot"
     slow_start_reason: "App in debuggable mode"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: APP_IN_DEBUGGABLE_MODE
       reason: "App in debuggable mode"
+      launch_dur: 10
     }
   }
 }
diff --git a/test/trace_processor/diff_tests/metrics/startup/android_startup_process_track.out b/test/trace_processor/diff_tests/metrics/startup/android_startup_process_track.out
index fb10a32..efd407a 100644
--- a/test/trace_processor/diff_tests/metrics/startup/android_startup_process_track.out
+++ b/test/trace_processor/diff_tests/metrics/startup/android_startup_process_track.out
@@ -66,9 +66,10 @@
       dex2oat_dur_ns: 0
     }
     startup_type: "cold"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: MAIN_THREAD_TIME_SPENT_IN_RUNNABLE
       reason: "Main Thread - Time spent in Runnable state"
-      details: " target 15% actual 57.14% [ longest_chunk: start_s 3.0e-09 dur_ms 4.0e-0 thread_id 3 thread_name com.google.android.calendar ] [ extra_info:  launches_dur_ms 7.0e-0 runnable_dur_ms 4.0e-0 R_sum_dur_ms 4.0e-0 R+(Preempted)_sum_dur_ms 0.0 ]"
+      launch_dur: 7
     }
   }
   startup {
@@ -139,9 +140,10 @@
       dex2oat_dur_ns: 0
     }
     startup_type: "cold"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: MAIN_THREAD_TIME_SPENT_IN_RUNNABLE
       reason: "Main Thread - Time spent in Runnable state"
-      details: " target 15% actual 57.14% [ longest_chunk: start_s 1.03e-07 dur_ms 4.0e-0 thread_id 4 thread_name com.google.android.calendar ] [ extra_info:  launches_dur_ms 7.0e-0 runnable_dur_ms 4.0e-0 R_sum_dur_ms 4.0e-0 R+(Preempted)_sum_dur_ms 0.0 ]"
+      launch_dur: 7
     }
   }
 }
diff --git a/test/trace_processor/diff_tests/metrics/startup/android_startup_slow.out b/test/trace_processor/diff_tests/metrics/startup/android_startup_slow.out
index 4cdc5e9..1b038e6 100644
--- a/test/trace_processor/diff_tests/metrics/startup/android_startup_slow.out
+++ b/test/trace_processor/diff_tests/metrics/startup/android_startup_slow.out
@@ -70,19 +70,25 @@
     startup_type: "warm"
     slow_start_reason: "Main Thread - Time spent in interruptible sleep state"
     slow_start_reason: "Main Thread - Time spent in Blocking I/O"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: MAIN_THREAD_TIME_SPENT_IN_RUNNABLE
       reason: "Main Thread - Time spent in Runnable state"
-      details: " target 15% actual 74.07% [ longest_chunk: start_s 30.0 dur_ms 80000. thread_id 3 thread_name com.google.android.calendar ] [ extra_info:  launches_dur_ms 108000 runnable_dur_ms 80000. R_sum_dur_ms 80000. R+(Preempted)_sum_dur_ms 0.0 ]"
+      launch_dur: 108000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: MAIN_THREAD_TIME_SPENT_IN_INTERRUPTIBLE_SLEEP
       reason: "Main Thread - Time spent in interruptible sleep state"
+      launch_dur: 108000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: MAIN_THREAD_TIME_SPENT_IN_BLOCKING_IO
       reason: "Main Thread - Time spent in Blocking I/O"
+      launch_dur: 108000000000
     }
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: POTENTIAL_CPU_CONTENTION_WITH_ANOTHER_PROCESS
       reason: "Potential CPU contention with another process"
-      details: " target 100ms actual 80000.ms most_active_process_for_launch init [ longest_chunk: start_s 30.0 dur_ms 80000. thread_id 3 thread_name com.google.android.calendar ] [ extra_info:  runnable_dur_ms 80000. R_sum_dur_ms 80000. R+(Preempted)_sum_dur 0 ]"
+      launch_dur: 108000000000
     }
   }
 }
diff --git a/test/trace_processor/diff_tests/metrics/startup/android_startup_unlock.out b/test/trace_processor/diff_tests/metrics/startup/android_startup_unlock.out
index 9686456..cf87a52 100644
--- a/test/trace_processor/diff_tests/metrics/startup/android_startup_unlock.out
+++ b/test/trace_processor/diff_tests/metrics/startup/android_startup_unlock.out
@@ -30,8 +30,10 @@
       dex2oat_dur_ns: 0
     }
     slow_start_reason: "Unlock running during launch"
-    slow_start_reason_detailed {
+    slow_start_reason_with_details {
+      reason_id: UNLOCK_RUNNING
       reason: "Unlock running during launch"
+      launch_dur: 100
     }
   }
 }