From 757ca2aa0d9859767c8cf2adffd17acd3929dc18 Mon Sep 17 00:00:00 2001 From: Nataniel Borges Date: Wed, 29 Sep 2021 15:59:01 +0200 Subject: [PATCH] Fix parsing of WM trace in critical mode When tracing WM in critical mode, the children object is not always assigned and this previously crashed the WM trace parsing in winscope. Fix the WM trace parsing by assuming all null children as empty arrays Test: run winscope, collect critical trace, open critical trace in winscope Change-Id: Ib98c820969df56eee822fedc66897deb600857e7 --- tools/winscope/adb_proxy/winscope_proxy.py | 2 +- tools/winscope/src/DataAdb.vue | 4 ++-- tools/winscope/src/decode.js | 6 ++++++ tools/winscope/src/flickerlib/WindowManagerState.ts | 3 ++- tools/winscope/src/flickerlib/windows/Activity.ts | 2 +- tools/winscope/src/flickerlib/windows/DisplayArea.ts | 2 +- tools/winscope/src/flickerlib/windows/DisplayContent.ts | 2 +- tools/winscope/src/flickerlib/windows/Task.ts | 2 +- tools/winscope/src/flickerlib/windows/TaskFragment.ts | 2 +- tools/winscope/src/flickerlib/windows/WindowContainer.ts | 3 ++- tools/winscope/src/flickerlib/windows/WindowState.ts | 2 +- tools/winscope/src/flickerlib/windows/WindowToken.ts | 2 +- 12 files changed, 20 insertions(+), 12 deletions(-) diff --git a/tools/winscope/adb_proxy/winscope_proxy.py b/tools/winscope/adb_proxy/winscope_proxy.py index 344c3cc5b..9beaa6518 100755 --- a/tools/winscope/adb_proxy/winscope_proxy.py +++ b/tools/winscope/adb_proxy/winscope_proxy.py @@ -230,7 +230,7 @@ class WindowManagerTraceSelectedConfig: # defaults set for all configs self.selectedConfigs = { "wmbuffersize": "16000", - "tracinglevel": "all", + "tracinglevel": "debug", "tracingtype": "frame", } diff --git a/tools/winscope/src/DataAdb.vue b/tools/winscope/src/DataAdb.vue index 6490f394b..ff3bcd764 100644 --- a/tools/winscope/src/DataAdb.vue +++ b/tools/winscope/src/DataAdb.vue @@ -234,8 +234,8 @@ const WM_SELECTED_CONFIG = { 'transaction', ], 'tracinglevel': [ - 'all', - 'trim', + 'verbose', + 'debug', 'critical', ], }; diff --git a/tools/winscope/src/decode.js b/tools/winscope/src/decode.js index dde10413f..c4ed60623 100644 --- a/tools/winscope/src/decode.js +++ b/tools/winscope/src/decode.js @@ -537,6 +537,7 @@ function decodeAndTransformProto(buffer, params, displayDefaults) { // From S onwards, returns a LayerTrace object, iterating over multiple items allows // winscope to handle both the new and legacy formats // TODO Refactor the decode.js code into a set of decoders to clean up the code + let lastError = null; for (var x = 0; x < objTypesProto.length; x++) { const objType = objTypesProto[x]; const transform = transforms[x]; @@ -546,9 +547,14 @@ function decodeAndTransformProto(buffer, params, displayDefaults) { const transformed = transform(decoded); return transformed; } catch (e) { + lastError = e; // check next parser } } + + if (lastError) { + throw lastError; + } throw new UndetectableFileType('Unable to parse file'); } diff --git a/tools/winscope/src/flickerlib/WindowManagerState.ts b/tools/winscope/src/flickerlib/WindowManagerState.ts index 0f132547c..57f3dd7c4 100644 --- a/tools/winscope/src/flickerlib/WindowManagerState.ts +++ b/tools/winscope/src/flickerlib/WindowManagerState.ts @@ -89,7 +89,8 @@ function createWindowManagerPolicy(proto: any): WindowManagerPolicy { function createRootWindowContainer(proto: any): RootWindowContainer { const windowContainer = WindowContainer.fromProto( /* proto */ proto.windowContainer, - /* childrenProto */ proto.windowContainer.children.reverse() + /* childrenProto */ proto.windowContainer?.children?.reverse() ?? [], + /* isActivityInTree */ false ); if (windowContainer == null) { diff --git a/tools/winscope/src/flickerlib/windows/Activity.ts b/tools/winscope/src/flickerlib/windows/Activity.ts index 60e28cdd8..77574b641 100644 --- a/tools/winscope/src/flickerlib/windows/Activity.ts +++ b/tools/winscope/src/flickerlib/windows/Activity.ts @@ -25,7 +25,7 @@ Activity.fromProto = function (proto: any): Activity { } else { const windowContainer = WindowContainer.fromProto( /* proto */ proto.windowToken.windowContainer, - /* protoChildren */ proto.windowToken.windowContainer.children.reverse(), + /* protoChildren */ proto.windowToken.windowContainer?.children?.reverse() ?? [], /* isActivityInTree */ true, /* nameOverride */ null, /* identifierOverride */ proto.identifier diff --git a/tools/winscope/src/flickerlib/windows/DisplayArea.ts b/tools/winscope/src/flickerlib/windows/DisplayArea.ts index 0abfdeeaa..a46eaefe4 100644 --- a/tools/winscope/src/flickerlib/windows/DisplayArea.ts +++ b/tools/winscope/src/flickerlib/windows/DisplayArea.ts @@ -24,7 +24,7 @@ DisplayArea.fromProto = function (proto: any, isActivityInTree: Boolean): Displa } else { const windowContainer = WindowContainer.fromProto( /* proto */ proto.windowContainer, - /* protoChildren */ proto.windowContainer.children.reverse(), + /* protoChildren */ proto.windowContainer?.children?.reverse() ?? [], /* isActivityInTree */ isActivityInTree, /* nameOverride */ proto.name ); diff --git a/tools/winscope/src/flickerlib/windows/DisplayContent.ts b/tools/winscope/src/flickerlib/windows/DisplayContent.ts index 7a9f6af5a..39703ef04 100644 --- a/tools/winscope/src/flickerlib/windows/DisplayContent.ts +++ b/tools/winscope/src/flickerlib/windows/DisplayContent.ts @@ -24,7 +24,7 @@ DisplayContent.fromProto = function (proto: any, isActivityInTree: Boolean): Dis } else { const windowContainer = WindowContainer.fromProto( /* proto */ proto.rootDisplayArea.windowContainer, - /* protoChildren */ proto.rootDisplayArea.windowContainer.children.reverse(), + /* protoChildren */ proto.rootDisplayArea.windowContainer?.children?.reverse() ?? [], /* isActivityInTree */ isActivityInTree, /* nameOverride */ proto.displayInfo?.name ?? null ); diff --git a/tools/winscope/src/flickerlib/windows/Task.ts b/tools/winscope/src/flickerlib/windows/Task.ts index 685d94173..858360717 100644 --- a/tools/winscope/src/flickerlib/windows/Task.ts +++ b/tools/winscope/src/flickerlib/windows/Task.ts @@ -25,7 +25,7 @@ Task.fromProto = function (proto: any, isActivityInTree: Boolean): Task { const windowContainerProto = proto.taskFragment?.windowContainer ?? proto.windowContainer; const windowContainer = WindowContainer.fromProto( /* proto */ windowContainerProto, - /* protoChildren */ windowContainerProto.children.reverse(), + /* protoChildren */ windowContainerProto?.children?.reverse() ?? [], /* isActivityInTree */ isActivityInTree ); diff --git a/tools/winscope/src/flickerlib/windows/TaskFragment.ts b/tools/winscope/src/flickerlib/windows/TaskFragment.ts index 8f5eeed99..10f5502b3 100644 --- a/tools/winscope/src/flickerlib/windows/TaskFragment.ts +++ b/tools/winscope/src/flickerlib/windows/TaskFragment.ts @@ -24,7 +24,7 @@ TaskFragment.fromProto = function (proto: any, isActivityInTree: Boolean): TaskF } else { const windowContainer = WindowContainer.fromProto( /* proto */ proto.windowContainer, - /* protoChildren */ proto.windowContainer.children.reverse(), + /* protoChildren */ proto.windowContainer?.children?.reverse() ?? [], /* isActivityInTree */ isActivityInTree); const entry = new TaskFragment( proto.activityType, diff --git a/tools/winscope/src/flickerlib/windows/WindowContainer.ts b/tools/winscope/src/flickerlib/windows/WindowContainer.ts index 9a99226d8..7d71f38b2 100644 --- a/tools/winscope/src/flickerlib/windows/WindowContainer.ts +++ b/tools/winscope/src/flickerlib/windows/WindowContainer.ts @@ -47,7 +47,8 @@ WindowContainer.fromProto = function ( const children = protoChildren .filter(it => it != null) - .map(it => WindowContainer.childrenFromProto(it, isActivityInTree)); + .map(it => WindowContainer.childrenFromProto(it, isActivityInTree)) + .filter(it => it != null); const identifier = identifierOverride ?? proto.identifier; var name = nameOverride ?? identifier?.title ?? ""; diff --git a/tools/winscope/src/flickerlib/windows/WindowState.ts b/tools/winscope/src/flickerlib/windows/WindowState.ts index 0b79d7306..a9cdf0829 100644 --- a/tools/winscope/src/flickerlib/windows/WindowState.ts +++ b/tools/winscope/src/flickerlib/windows/WindowState.ts @@ -29,7 +29,7 @@ import WindowContainer from "./WindowContainer" const name = getName(identifierName); const windowContainer = WindowContainer.fromProto( /* proto */ proto.windowContainer, - /* protoChildren */ proto.windowContainer.children.reverse(), + /* protoChildren */ proto.windowContainer?.children.reverse() ?? [], /* isActivityInTree */ isActivityInTree, /* nameOverride */ name, /* identifierOverride */ proto.identifier diff --git a/tools/winscope/src/flickerlib/windows/WindowToken.ts b/tools/winscope/src/flickerlib/windows/WindowToken.ts index 3187dd06e..ca973237d 100644 --- a/tools/winscope/src/flickerlib/windows/WindowToken.ts +++ b/tools/winscope/src/flickerlib/windows/WindowToken.ts @@ -25,7 +25,7 @@ WindowToken.fromProto = function (proto: any, isActivityInTree: Boolean): Window const windowContainer = WindowContainer.fromProto( /* proto */ proto.windowContainer, - /* protoChildren */ proto.windowContainer.children.reverse(), + /* protoChildren */ proto.windowContainer?.children?.reverse() ?? [], /* isActivityInTree */ isActivityInTree, /* nameOverride */ null, /* identifierOverride */ null,