From 8bd2346edf2229ec7f30f6d4832caa9b55fa5fea Mon Sep 17 00:00:00 2001 From: Robert Delgado Date: Tue, 11 Jun 2019 15:34:54 -0700 Subject: [PATCH 1/2] Improved logic for error detection. Test: Ran windump, winlayer, surfacedump, surfacelayer, and a txt file on winscope's autodetect file upload feature. Change-Id: Ia638bb4fbd9c5ad24ac7c84814205eaa8d429824 Merged-In: Ia638bb4fbd9c5ad24ac7c84814205eaa8d429824 --- tools/winscope/src/App.vue | 34 ++++++------- tools/winscope/src/detectfile.js | 84 +++++++++++++++++++++++++------- 2 files changed, 81 insertions(+), 37 deletions(-) diff --git a/tools/winscope/src/App.vue b/tools/winscope/src/App.vue index 19d380c8e..a2bf03e81 100644 --- a/tools/winscope/src/App.vue +++ b/tools/winscope/src/App.vue @@ -202,14 +202,23 @@ export default { var reader = new FileReader(); reader.onload = (e) => { var buffer = new Uint8Array(e.target.result); - var filetype = FILE_TYPES[type] || FILE_TYPES[detectFile(buffer)]; - if (!filetype) { - this.title = this.filename + ": Could not detect file type." - event.target.value = ''; - return; + try { + if (FILE_TYPES[type]) { + var filetype = FILE_TYPES[type]; + var decoded = filetype.protoType.decode(buffer); + modifyProtoFields(decoded, this.store.displayDefaults); + var transformed = filetype.transform(decoded); + } else { + var [filetype, decoded] = detectFile(buffer); + modifyProtoFields(decoded, this.store.displayDefaults); + var transformed = filetype.transform(decoded); + }} catch (ex) { + this.title = this.filename + ': ' + ex; + return; + } finally { + event.target.value ='' } this.title = this.filename + " (loading " + filetype.name + ")"; - // Replace enum values with string representation and // add default values to the proto objects. This function also handles // a special case with TransformProtos where the matrix may be derived @@ -242,22 +251,9 @@ export default { protoObj[fieldName] = fieldProperties.resolvedType.valuesById[protoObj[fieldProperties.name]]; continue; } - modifyProtoFields(protoObj[fieldName], displayDefaults); } } - - try { - var decoded = filetype.protoType.decode(buffer); - modifyProtoFields(decoded, this.store.displayDefaults); - var transformed = filetype.transform(decoded); - } catch (ex) { - this.title = this.filename + " (loading " + filetype.name + "):" + ex; - return; - } finally { - event.target.value = ''; - } - if (filetype.timeline) { this.timeline = transformed.children; } else { diff --git a/tools/winscope/src/detectfile.js b/tools/winscope/src/detectfile.js index 88dc2d1b9..3c4b2c53f 100644 --- a/tools/winscope/src/detectfile.js +++ b/tools/winscope/src/detectfile.js @@ -14,8 +14,52 @@ * limitations under the License. */ + +import jsonProtoDefs from 'frameworks/base/core/proto/android/server/windowmanagertrace.proto' +import jsonProtoDefsSF from 'frameworks/native/services/surfaceflinger/layerproto/layerstrace.proto' +import protobuf from 'protobufjs' +import {transform_layers, transform_layers_trace} from './transform_sf.js' +import {transform_window_service, transform_window_trace} from './transform_wm.js' + +var protoDefs = protobuf.Root.fromJSON(jsonProtoDefs) + .addJSON(jsonProtoDefsSF.nested); + +var WindowTraceMessage = protoDefs.lookupType( + "com.android.server.wm.WindowManagerTraceFileProto"); +var WindowMessage = protoDefs.lookupType( + "com.android.server.wm.WindowManagerServiceDumpProto"); +var LayersMessage = protoDefs.lookupType("android.surfaceflinger.LayersProto"); +var LayersTraceMessage = protoDefs.lookupType("android.surfaceflinger.LayersTraceFileProto"); + + const LAYER_TRACE_MAGIC_NUMBER = [0x09, 0x4c, 0x59, 0x52, 0x54, 0x52, 0x41, 0x43, 0x45] // .LYRTRACE const WINDOW_TRACE_MAGIC_NUMBER = [0x09, 0x57, 0x49, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x45] // .WINTRACE +const FILE_TYPES = { + 'window_trace': { + protoType: WindowTraceMessage, + transform: transform_window_trace, + name: "WindowManager trace", + timeline: true, + }, + 'layers_trace': { + protoType: LayersTraceMessage, + transform: transform_layers_trace, + name: "SurfaceFlinger trace", + timeline: true, + }, + 'layers_dump': { + protoType: LayersMessage, + transform: transform_layers, + name: "SurfaceFlinger dump", + timeline: false, + }, + 'window_dump': { + protoType: WindowMessage, + transform: transform_window_service, + name: "WindowManager dump", + timeline: false, + }, +}; function arrayEquals(a, b) { if (a.length !== b.length) { @@ -33,23 +77,27 @@ function arrayStartsWith(array, prefix) { return arrayEquals(array.slice(0, prefix.length), prefix); } -/** buffer: Uint8Array */ -function detect(buffer) { - if (arrayStartsWith(buffer, LAYER_TRACE_MAGIC_NUMBER)) { - return 'layers_trace' - } - if (arrayStartsWith(buffer, WINDOW_TRACE_MAGIC_NUMBER)) { - return 'window_trace' - } - if (arrayStartsWith(buffer, [0x12])) { - // Because policy is empty, the first field in the dump is 2 currently. - // This might change. - return 'window_dump'; - } - if (arrayStartsWith(buffer, [0x0a])) { - // For now; window_dump might soon start with 0x0a too. - return 'layers_dump'; - } +function decodedFile(filename, buffer) { + var decoded = FILE_TYPES[filename].protoType.decode(buffer); + return [FILE_TYPES[filename], decoded]; } -export default detect; +function detect(buffer) { + if (arrayStartsWith(buffer, LAYER_TRACE_MAGIC_NUMBER)) { + return decodedFile('layers_trace', buffer); + } + if (arrayStartsWith(buffer, WINDOW_TRACE_MAGIC_NUMBER)) { + return decodedFile('window_trace', buffer); + } + for (var filename of ['layers_dump', 'window_dump']) { + try { + var [filetype,decoded] = decodedFile(filename, buffer); + var transformed = filetype.transform(decoded); + return [FILE_TYPES[filename], decoded]; + } catch (ex) { + // ignore exception and try next filetype + } + } + throw new Error('Unable to detect file'); +} +export default detect; \ No newline at end of file From 813431292caca271a57e51052db7cf8415c16ad6 Mon Sep 17 00:00:00 2001 From: Adam Pardyl Date: Mon, 8 Jul 2019 18:22:39 +0200 Subject: [PATCH 2/2] Support multiple trace files. This commit allows to view trace for both SurfaceFlinger and WindowManager at the same time using one timeline. Test: yarn run dev Bug: Change-Id: I11abcf8b6423a03ca9af63e56a7b992958d21175 Merged-In: I11abcf8b6423a03ca9af63e56a7b992958d21175 --- tools/winscope/.gitignore | 1 + tools/winscope/src/App.vue | 432 +++++++------------------------ tools/winscope/src/DataInput.vue | 178 +++++++++++++ tools/winscope/src/DataView.vue | 215 +++++++++++++++ tools/winscope/src/Timeline.vue | 26 +- tools/winscope/src/TreeView.vue | 21 +- tools/winscope/src/detectfile.js | 38 ++- 7 files changed, 545 insertions(+), 366 deletions(-) create mode 100644 tools/winscope/.gitignore create mode 100644 tools/winscope/src/DataInput.vue create mode 100644 tools/winscope/src/DataView.vue diff --git a/tools/winscope/.gitignore b/tools/winscope/.gitignore new file mode 100644 index 000000000..c2658d7d1 --- /dev/null +++ b/tools/winscope/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/tools/winscope/src/App.vue b/tools/winscope/src/App.vue index a2bf03e81..3170b02a1 100644 --- a/tools/winscope/src/App.vue +++ b/tools/winscope/src/App.vue @@ -16,169 +16,63 @@

{{title}}

- -
- Show default properties - - If checked, shows the value of all properties. - Otherwise, hides all properties whose value is the default for its data type. - - -
- - - - -
- - Detect type - {{v.name}} - -
- + Clear
- -
- -

Timeline

- +
+ + + +

Timeline

+
+ + + {{file.type.icon}} + + +
- -
- -

Screen

- - - -
- - - -

Hierarchy

- Only visible - Flat -
- -
- - - -

Properties

-
- -
-
- -
-
+
- - diff --git a/tools/winscope/src/DataInput.vue b/tools/winscope/src/DataInput.vue new file mode 100644 index 000000000..fe7710f18 --- /dev/null +++ b/tools/winscope/src/DataInput.vue @@ -0,0 +1,178 @@ + + + diff --git a/tools/winscope/src/DataView.vue b/tools/winscope/src/DataView.vue new file mode 100644 index 000000000..5a32b423e --- /dev/null +++ b/tools/winscope/src/DataView.vue @@ -0,0 +1,215 @@ + + + + \ No newline at end of file diff --git a/tools/winscope/src/Timeline.vue b/tools/winscope/src/Timeline.vue index f3ef8b2f0..e9525a46d 100644 --- a/tools/winscope/src/Timeline.vue +++ b/tools/winscope/src/Timeline.vue @@ -14,19 +14,15 @@ --> - + diff --git a/tools/winscope/src/TreeView.vue b/tools/winscope/src/TreeView.vue index 09fadf2bf..c7050f0db 100644 --- a/tools/winscope/src/TreeView.vue +++ b/tools/winscope/src/TreeView.vue @@ -21,14 +21,11 @@
- +
- +