Make DmesgParser support Kernel 5.15 format am: 36b917de5d am: b7635edede am: db4b875c44

Original change: https://android-review.googlesource.com/c/platform/tools/loganalysis/+/2425005

Change-Id: I0aa341c4b09c70d7d94b3eedfe1a86236a00935c
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/javatests/com/android/loganalysis/parser/DmesgParserTest.java b/javatests/com/android/loganalysis/parser/DmesgParserTest.java
index cc79db7..a7705e3 100644
--- a/javatests/com/android/loganalysis/parser/DmesgParserTest.java
+++ b/javatests/com/android/loganalysis/parser/DmesgParserTest.java
@@ -220,6 +220,31 @@
         assertEquals("No service info should be available", 0, serviceInfoItems.size());
     }
 
+    public void testCompleteStageInfo_onKernel_5_15() {
+        DmesgParser dmesgParser = new DmesgParser();
+        String[] lines =
+                new String[] {
+                    "[    0.370107] [@2 init][....] init: Loading module /lib/modules/foo.ko "
+                            + "with args ''",
+                    "[    0.372497] [@2 init][....] init: Loaded kernel module /lib/modules/foo.ko",
+                    "[    0.372500] [@2 init][....] init: Loading module /lib/modules/bar.ko "
+                            + "with args ''",
+                    "[    1.115467] [@2 init][....] init: Loaded 198 kernel modules took 748 ms",
+                    "[    2.471163] [@2 init][....] init: Wait for property 'apexd.status=ready' "
+                            + "took 403ms",
+                    "[    3.786943] [@2 init][....] ueventd: Coldboot took 0.701291 seconds",
+                    "[    4.295667] [@2 init][....] init: Command 'mount_all --late' action=late-fs"
+                            + " /vendor/etc/init/hw/init.rc:347) took 250ms and succeeded",
+                    "[   41.665818] [@2 init][....] init: init first stage started!"
+                };
+        for (String line : lines) {
+            dmesgParser.parseStageInfo(line);
+        }
+        List<DmesgStageInfoItem> stageInfoItems = dmesgParser.getStageInfoItems();
+        assertEquals(4, stageInfoItems.size());
+        assertEquals(EXPECTED_STAGE_INFO_ITEMS, stageInfoItems);
+    }
+
     /**
      * Test init stages' start time logs
      */
diff --git a/src/com/android/loganalysis/parser/DmesgParser.java b/src/com/android/loganalysis/parser/DmesgParser.java
index f7aac4d..1b83ca4 100644
--- a/src/com/android/loganalysis/parser/DmesgParser.java
+++ b/src/com/android/loganalysis/parser/DmesgParser.java
@@ -49,12 +49,20 @@
     private static final String TOTAL_MODULE = "TOTAL_MODULE";
     private static final String MOUNT_ALL = "mount_all";
 
+    private static final String TIMESTAMP_PATTERN =
+            String.format("\\[\\s+(?<%s>[\\d.]+)]", TIMESTAMP);
+
+    // This is optionally present in dmesg output on some kernels
+    // Matches possibly repeated pairs of square brackets enclosing arbitrary text
+    // An example is [   10.258464] [@3 insmod][....] aml dvb init
+    private static final String CPU_INFO_PATTERN = "(\\[[^]]+])+";
+
     // Matches: [ 14.822691] init:
-    private static final String SERVICE_PREFIX = String.format("^\\[\\s+(?<%s>.*)\\] init:\\s+",
-            TIMESTAMP);
+    private static final String SERVICE_PREFIX =
+            String.format("^%s( %s)? init:\\s+", TIMESTAMP_PATTERN, CPU_INFO_PATTERN);
     // Matches: [    3.791635] ueventd:
-    private static final String UEVENTD_PREFIX = String.format("^\\[\\s+(?<%s>.*)\\] ueventd:\\s+",
-            TIMESTAMP);
+    private static final String UEVENTD_PREFIX =
+            String.format("^%s( %s)? ueventd:\\s+", TIMESTAMP_PATTERN, CPU_INFO_PATTERN);
 
     // Matches: starting service 'ueventd'...
     private static final String START_SERVICE_SUFFIX = String.format("starting service "