@gravitylabsllc/porthole 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +123 -0
- package/dist/adb.js +430 -21
- package/dist/adb.js.map +1 -1
- package/dist/args.js +144 -0
- package/dist/args.js.map +1 -0
- package/dist/capture.js +139 -30
- package/dist/capture.js.map +1 -1
- package/dist/cli.js +221 -62
- package/dist/cli.js.map +1 -1
- package/dist/device.js +337 -4
- package/dist/device.js.map +1 -1
- package/dist/index.js +2030 -377
- package/dist/index.js.map +1 -1
- package/dist/moment.js +240 -0
- package/dist/moment.js.map +1 -0
- package/dist/perfetto.js +826 -0
- package/dist/perfetto.js.map +1 -0
- package/dist/report.js +68 -7
- package/dist/report.js.map +1 -1
- package/dist/save.js +252 -0
- package/dist/save.js.map +1 -0
- package/dist/sessions.js +704 -0
- package/dist/sessions.js.map +1 -0
- package/dist/system.js +169 -0
- package/dist/system.js.map +1 -0
- package/dist/systrace.js +198 -0
- package/dist/systrace.js.map +1 -0
- package/dist/timeline.js +731 -29
- package/dist/timeline.js.map +1 -1
- package/dist/trace.js +317 -27
- package/dist/trace.js.map +1 -1
- package/dist/watermark.js +220 -0
- package/dist/watermark.js.map +1 -0
- package/package.json +10 -4
- package/src/adb.ts +583 -0
- package/src/args.ts +177 -0
- package/src/capture.ts +292 -0
- package/src/cli.ts +367 -0
- package/src/device.ts +635 -0
- package/src/index.ts +2545 -0
- package/src/moment.ts +306 -0
- package/src/perfetto.ts +972 -0
- package/src/report.ts +285 -0
- package/src/save.ts +322 -0
- package/src/sessions.ts +894 -0
- package/src/system.ts +221 -0
- package/src/systrace.ts +258 -0
- package/src/timeline.ts +1036 -0
- package/src/trace.ts +769 -0
- package/src/watermark.ts +337 -0
- package/ui/dist/assets/index-DtnyBXCM.css +1 -0
- package/ui/dist/assets/index-h7VNB9Fl.js +70 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index--1mlZuNZ.css +0 -1
- package/ui/dist/assets/index-BeVGHRFm.js +0 -68
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
|
package/dist/system.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// Copyright 2026 Gravity Labs
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* What the rest of the device was doing, from what adb can be asked directly.
|
|
5
|
+
*
|
|
6
|
+
* Porthole sees inside one process. When it reports a 400ms stall whose stack
|
|
7
|
+
* bottoms out in a native read, or a janky frame dominated by swapBuffers, the
|
|
8
|
+
* reason is usually below the app and it has no way to look — which is the
|
|
9
|
+
* point at which a developer gives up and opens a system trace by hand.
|
|
10
|
+
*
|
|
11
|
+
* A good share of those cases are answerable without a trace at all: the device
|
|
12
|
+
* was thermally throttled, the governor was holding the cores low, or something
|
|
13
|
+
* else on the device was eating the CPU. Those come straight out of dumpsys and
|
|
14
|
+
* sysfs, cost nothing, and need no extra tooling.
|
|
15
|
+
*
|
|
16
|
+
* Everything here parses defensively. `dumpsys` output varies by vendor and by
|
|
17
|
+
* release, and the honest failure is to say a source could not be read rather
|
|
18
|
+
* than to guess a number from a format that turned out to be different.
|
|
19
|
+
*/
|
|
20
|
+
const num = (value, fallback = NaN) => {
|
|
21
|
+
if (value === undefined)
|
|
22
|
+
return fallback;
|
|
23
|
+
const parsed = Number(value.trim());
|
|
24
|
+
return Number.isFinite(parsed) ? parsed : fallback;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* `dumpsys thermalservice`.
|
|
28
|
+
*
|
|
29
|
+
* The interesting line is the status: devices report a throttling severity, and
|
|
30
|
+
* anything above NONE means the system was deliberately slowing itself down —
|
|
31
|
+
* which explains a regression that no code change can account for.
|
|
32
|
+
*/
|
|
33
|
+
/** android.os.Temperature throttling constants, as reported by ordinal. */
|
|
34
|
+
const SEVERITY = {
|
|
35
|
+
"0": "NONE",
|
|
36
|
+
"1": "LIGHT",
|
|
37
|
+
"2": "MODERATE",
|
|
38
|
+
"3": "SEVERE",
|
|
39
|
+
"4": "CRITICAL",
|
|
40
|
+
"5": "EMERGENCY",
|
|
41
|
+
"6": "SHUTDOWN",
|
|
42
|
+
};
|
|
43
|
+
export function parseThermal(output) {
|
|
44
|
+
const readings = [];
|
|
45
|
+
// Temperature{mValue=41.2, mType=3, mName=CPU, mStatus=0}
|
|
46
|
+
//
|
|
47
|
+
// Anchored on the type. The dump also lists CoolingDevice entries with the
|
|
48
|
+
// identical inner shape, and an unanchored match read one of those as a
|
|
49
|
+
// sensor: "hottest sensor tpu at 7964000°C", which is a throttling level.
|
|
50
|
+
for (const match of output.matchAll(/Temperature\{mValue=([-\d.]+),\s*mType=\d+,\s*mName=([^,}]+)/g)) {
|
|
51
|
+
const celsius = num(match[1]);
|
|
52
|
+
if (Number.isFinite(celsius))
|
|
53
|
+
readings.push({ name: match[2].trim(), celsius });
|
|
54
|
+
}
|
|
55
|
+
// Some devices name the status, some give the enum ordinal. Reported by
|
|
56
|
+
// name either way, because "Thermal status 0" reads like a throttle.
|
|
57
|
+
const raw = output.match(/Thermal Status:\s*(\w+)/i)?.[1] ?? null;
|
|
58
|
+
const status = raw === null ? null : (SEVERITY[raw] ?? raw.toUpperCase());
|
|
59
|
+
// The dump lists each sensor more than once, in different sections.
|
|
60
|
+
const unique = [...new Map(readings.map((r) => [r.name, r])).values()];
|
|
61
|
+
const hottest = unique.reduce((worst, r) => (worst === null || r.celsius > worst.celsius ? r : worst), null);
|
|
62
|
+
return { readings: unique, throttling: status, hottest };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Per-core frequency and governor, read out of sysfs in one shell round trip.
|
|
66
|
+
*
|
|
67
|
+
* A core pinned well below its maximum while the app is janking is the shape of
|
|
68
|
+
* thermal or power-save throttling, and it is invisible from inside the process.
|
|
69
|
+
*/
|
|
70
|
+
export function parseCpu(output) {
|
|
71
|
+
const cores = [];
|
|
72
|
+
// Emitted as `cpu0 governor 300000 2400000`, one core per line.
|
|
73
|
+
for (const line of output.split("\n")) {
|
|
74
|
+
const parts = line.trim().split(/\s+/);
|
|
75
|
+
if (parts.length < 4 || !parts[0].startsWith("cpu"))
|
|
76
|
+
continue;
|
|
77
|
+
const cpu = num(parts[0].slice(3));
|
|
78
|
+
if (!Number.isFinite(cpu))
|
|
79
|
+
continue;
|
|
80
|
+
cores.push({
|
|
81
|
+
cpu,
|
|
82
|
+
governor: parts[1] === "?" ? null : parts[1],
|
|
83
|
+
curKhz: num(parts[2], 0),
|
|
84
|
+
maxKhz: num(parts[3], 0),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// A maximum below the current reading means these files are not the
|
|
88
|
+
// frequencies we assumed — an emulator returns 5270965 and 2 — and
|
|
89
|
+
// dividing them produced a confident 263657263% of maximum. Anything
|
|
90
|
+
// that fails the ordering is treated as unreadable rather than believed.
|
|
91
|
+
const comparable = cores.filter((c) => c.curKhz > 0 && c.maxKhz >= c.curKhz);
|
|
92
|
+
const belowMax = comparable.filter((c) => c.curKhz < c.maxKhz * 0.9).length;
|
|
93
|
+
const headroom = comparable.length
|
|
94
|
+
? Math.round((comparable.reduce((sum, c) => sum + c.curKhz / c.maxKhz, 0) / comparable.length) * 100)
|
|
95
|
+
: null;
|
|
96
|
+
return { cores, belowMax, headroom };
|
|
97
|
+
}
|
|
98
|
+
/** `dumpsys cpuinfo` — who was actually using the CPU, app included. */
|
|
99
|
+
/** Summary rows dumpsys mixes in among the processes. */
|
|
100
|
+
const AGGREGATES = new Set(["TOTAL", "TOTAL:", "IOW", "irq", "softirq"]);
|
|
101
|
+
export function parseTop(output, limit = 8) {
|
|
102
|
+
const out = [];
|
|
103
|
+
// " 12% 1234/com.example: 8% user + 4% kernel", and without the pid on
|
|
104
|
+
// some lines. The pid group has to be explicit: a lazy prefix matches empty
|
|
105
|
+
// and lets "1234/com.example" through as the name.
|
|
106
|
+
for (const match of output.matchAll(/^\s*([\d.]+)%\s+(?:\d+\/)?([^\s:]+):/gm)) {
|
|
107
|
+
const percent = num(match[1]);
|
|
108
|
+
if (!Number.isFinite(percent))
|
|
109
|
+
continue;
|
|
110
|
+
// dumpsys ends with `95% TOTAL: ...`, which is the sum and not a
|
|
111
|
+
// process. Left in, it is the busiest thing on every device.
|
|
112
|
+
if (AGGREGATES.has(match[2]))
|
|
113
|
+
continue;
|
|
114
|
+
out.push({ percent, name: match[2] });
|
|
115
|
+
}
|
|
116
|
+
return out.sort((a, b) => b.percent - a.percent).slice(0, limit);
|
|
117
|
+
}
|
|
118
|
+
/** `dumpsys meminfo` — whether the device as a whole was under pressure. */
|
|
119
|
+
export function parseMemory(output) {
|
|
120
|
+
const total = num(output.match(/Total RAM:\s*([\d,]+)/)?.[1]?.replace(/,/g, ""));
|
|
121
|
+
const free = num(output.match(/Free RAM:\s*([\d,]+)/)?.[1]?.replace(/,/g, ""));
|
|
122
|
+
if (!Number.isFinite(total))
|
|
123
|
+
return null;
|
|
124
|
+
return {
|
|
125
|
+
totalMb: Math.round(total / 1024),
|
|
126
|
+
availableMb: Number.isFinite(free) ? Math.round(free / 1024) : 0,
|
|
127
|
+
lowMemory: /lowMemory=true/i.test(output),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* One sentence naming only what was actually observed.
|
|
132
|
+
*
|
|
133
|
+
* Deliberately does not conclude. "Two cores below maximum" is a fact; "the app
|
|
134
|
+
* is slow because of throttling" is a guess, and this file has no idea what the
|
|
135
|
+
* app was doing at the time.
|
|
136
|
+
*/
|
|
137
|
+
export function describeSystem(context) {
|
|
138
|
+
const parts = [];
|
|
139
|
+
if (context.thermal?.throttling && context.thermal.throttling.toUpperCase() !== "NONE") {
|
|
140
|
+
parts.push(`Thermal status ${context.thermal.throttling}.`);
|
|
141
|
+
}
|
|
142
|
+
if (context.thermal?.hottest) {
|
|
143
|
+
parts.push(`Hottest sensor ${context.thermal.hottest.name} at ${context.thermal.hottest.celsius}°C.`);
|
|
144
|
+
}
|
|
145
|
+
if (context.cpu && context.cpu.headroom !== null) {
|
|
146
|
+
parts.push(`CPUs at ${context.cpu.headroom}% of maximum clock` +
|
|
147
|
+
(context.cpu.belowMax ? `, ${context.cpu.belowMax} core(s) well below.` : "."));
|
|
148
|
+
}
|
|
149
|
+
if (context.top.length) {
|
|
150
|
+
const other = context.top[0];
|
|
151
|
+
parts.push(`Busiest process ${other.name} at ${other.percent}%.`);
|
|
152
|
+
}
|
|
153
|
+
if (context.memory) {
|
|
154
|
+
parts.push(`${context.memory.availableMb}MB free of ${context.memory.totalMb}MB` +
|
|
155
|
+
(context.memory.lowMemory ? " — system reports low memory." : "."));
|
|
156
|
+
}
|
|
157
|
+
if (context.unavailable.length) {
|
|
158
|
+
parts.push(`Could not read: ${context.unavailable.map((u) => u.source).join(", ")}.`);
|
|
159
|
+
}
|
|
160
|
+
return parts.length ? parts.join(" ") : "Nothing readable from the device.";
|
|
161
|
+
}
|
|
162
|
+
/** The single shell command that reads every core's governor and frequency. */
|
|
163
|
+
export const CPU_PROBE = "for c in /sys/devices/system/cpu/cpu[0-9]*; do " +
|
|
164
|
+
"n=$(basename $c); " +
|
|
165
|
+
"g=$(cat $c/cpufreq/scaling_governor 2>/dev/null || echo '?'); " +
|
|
166
|
+
"f=$(cat $c/cpufreq/scaling_cur_freq 2>/dev/null || echo 0); " +
|
|
167
|
+
"m=$(cat $c/cpufreq/cpuinfo_max_freq 2>/dev/null || echo 0); " +
|
|
168
|
+
"echo \"$n $g $f $m\"; done";
|
|
169
|
+
//# sourceMappingURL=system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.js","sourceRoot":"","sources":["../src/system.ts"],"names":[],"mappings":"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"}
|
package/dist/systrace.js
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
// Copyright 2026 Gravity Labs
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { open } from "node:fs/promises";
|
|
4
|
+
/**
|
|
5
|
+
* Recording a Perfetto trace from the device, and saying what is in it.
|
|
6
|
+
*
|
|
7
|
+
* Deliberately does not return the trace. A ten-second capture is tens of
|
|
8
|
+
* megabytes of protobuf, and the instinct to hand that to a model is the wrong
|
|
9
|
+
* one — it is not summarisable by reading it, and the useful form is a file you
|
|
10
|
+
* open in a trace viewer plus a sentence saying whether it is worth opening.
|
|
11
|
+
*
|
|
12
|
+
* What makes this worth having at all is that the app's own spans are already
|
|
13
|
+
* inside it. The runtime writes its navigations, HTTP calls, queries and stalls
|
|
14
|
+
* as atrace sections, so a capture arrives annotated with what the app was
|
|
15
|
+
* doing rather than only what the kernel was doing.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* A useful default for looking at jank.
|
|
19
|
+
*
|
|
20
|
+
* Note what is *not* here: `app`. The runtime's sections are written under
|
|
21
|
+
* ATRACE_TAG_APP, and that tag is not a category — it is enabled per package
|
|
22
|
+
* with perfetto's `--app`. Passing "app" in this list enables nothing, which
|
|
23
|
+
* was verified by reading debug.atrace.tags.enableflags during a capture and
|
|
24
|
+
* finding 0xa: VIEW and GRAPHICS set, ATRACE_TAG_APP (0x1000) clear. The
|
|
25
|
+
* capture succeeded and contained no Porthole slices at all.
|
|
26
|
+
*/
|
|
27
|
+
export const DEFAULT_CATEGORIES = [
|
|
28
|
+
"sched",
|
|
29
|
+
"freq",
|
|
30
|
+
"idle",
|
|
31
|
+
"gfx",
|
|
32
|
+
"view",
|
|
33
|
+
"wm",
|
|
34
|
+
"am",
|
|
35
|
+
"binder_driver",
|
|
36
|
+
"dalvik",
|
|
37
|
+
];
|
|
38
|
+
/**
|
|
39
|
+
* Works out what to record, and says when the request undercuts itself.
|
|
40
|
+
*
|
|
41
|
+
* Without a package in `apps`, the capture contains no Porthole sections and
|
|
42
|
+
* gives no indication why — it simply succeeds and is unannotated, which reads
|
|
43
|
+
* as the runtime being broken. So the absence is called out rather than left to
|
|
44
|
+
* be discovered in a trace viewer.
|
|
45
|
+
*/
|
|
46
|
+
export function planCapture(options) {
|
|
47
|
+
const notes = [];
|
|
48
|
+
const seconds = Math.min(Math.max(Math.round(options.seconds ?? 10), 1), 120);
|
|
49
|
+
if (options.seconds !== undefined && seconds !== Math.round(options.seconds)) {
|
|
50
|
+
notes.push(`Duration clamped to ${seconds}s; 1 to 120 is the supported range.`);
|
|
51
|
+
}
|
|
52
|
+
const categories = (options.categories?.length ? [...options.categories] : [...DEFAULT_CATEGORIES]).filter((c) => {
|
|
53
|
+
// Passing it is harmless but does nothing, and someone who passed it
|
|
54
|
+
// believes their app sections are being recorded. They are not.
|
|
55
|
+
if (c === "app") {
|
|
56
|
+
notes.push("Dropped the `app` category: it is not one. App sections come from " +
|
|
57
|
+
"ATRACE_TAG_APP, which is enabled per package — pass the package in `apps`.");
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
});
|
|
62
|
+
const apps = options.apps?.filter((a) => a.trim().length > 0) ?? [];
|
|
63
|
+
if (apps.length === 0) {
|
|
64
|
+
notes.push("No app named, so this trace will have no Porthole sections in it. Pass the " +
|
|
65
|
+
"package under test in `apps` to record the runtime's navigations, calls and stalls.");
|
|
66
|
+
}
|
|
67
|
+
const stamp = options.now ?? Date.now();
|
|
68
|
+
return {
|
|
69
|
+
categories,
|
|
70
|
+
apps,
|
|
71
|
+
seconds,
|
|
72
|
+
// The traced service writes here; a path under /sdcard is not writable by it.
|
|
73
|
+
devicePath: `/data/misc/perfetto-traces/porthole-${stamp}.pftrace`,
|
|
74
|
+
notes,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** The on-device command, in Perfetto's shorthand form. */
|
|
78
|
+
export function captureArgs(plan) {
|
|
79
|
+
return [
|
|
80
|
+
"shell",
|
|
81
|
+
"perfetto",
|
|
82
|
+
"-o",
|
|
83
|
+
plan.devicePath,
|
|
84
|
+
"-t",
|
|
85
|
+
`${plan.seconds}s`,
|
|
86
|
+
// One --app per package. This, not a category, is what turns on the tag
|
|
87
|
+
// the runtime's sections are written under.
|
|
88
|
+
...plan.apps.flatMap((app) => ["--app", app]),
|
|
89
|
+
...plan.categories,
|
|
90
|
+
];
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* How many bytes `countPortholeLabels` reads at once.
|
|
94
|
+
*
|
|
95
|
+
* Large enough that a hundred-megabyte capture is a hundred `read()` calls,
|
|
96
|
+
* not a hundred thousand; small enough that peak memory while scanning stays
|
|
97
|
+
* a handful of megabytes rather than growing with the file. This is the
|
|
98
|
+
* whole fix for GRA-89's heap-exhaustion half: the code this replaced read
|
|
99
|
+
* the entire capture into a `Buffer` and then decoded the entire buffer into
|
|
100
|
+
* a second, same-sized string before scanning either — two copies of
|
|
101
|
+
* whatever the file's size happened to be, all at once.
|
|
102
|
+
*/
|
|
103
|
+
export const CHUNK_BYTES = 1024 * 1024;
|
|
104
|
+
/**
|
|
105
|
+
* How much of one chunk's tail is re-scanned as part of the next.
|
|
106
|
+
*
|
|
107
|
+
* The marker is `porthole: ` (10 characters) plus the capture group's own
|
|
108
|
+
* bound of up to 110 more, 120 characters at the outside. 128 bytes of
|
|
109
|
+
* overlap — one byte per latin1 character — covers that with eight to
|
|
110
|
+
* spare, so a marker whose bytes straddle a chunk boundary is always whole
|
|
111
|
+
* in at least one of the two scans that see it: incomplete (and so
|
|
112
|
+
* unmatched) in the chunk it starts in, complete once its own tail is
|
|
113
|
+
* carried into the front of the next chunk's text.
|
|
114
|
+
*/
|
|
115
|
+
export const OVERLAP_BYTES = 128;
|
|
116
|
+
const PORTHOLE_MARKER = /porthole: ([^|\x00-\x1f]{1,110})/g;
|
|
117
|
+
/**
|
|
118
|
+
* Whether the app's own sections made it into the capture — read a chunk at
|
|
119
|
+
* a time rather than all at once.
|
|
120
|
+
*
|
|
121
|
+
* `index.ts` used to `readFileSync` the whole trace and hand this function
|
|
122
|
+
* the resulting `Buffer`, which this then decoded whole with
|
|
123
|
+
* `.toString("latin1")` before scanning it. At the tool's own 120s maximum a
|
|
124
|
+
* real capture is hundreds of megabytes; doubling that into a same-sized JS
|
|
125
|
+
* string is exactly the shape that exhausts Node's heap before the tool can
|
|
126
|
+
* report anything. This reads and decodes `CHUNK_BYTES` at a time instead,
|
|
127
|
+
* so peak memory is a small, fixed multiple of one chunk no matter how large
|
|
128
|
+
* the capture is — see `systrace.test.ts`'s RSS-bound case, which measures
|
|
129
|
+
* this rather than asserting it by argument.
|
|
130
|
+
*
|
|
131
|
+
* A byte search for the prefix, not a parse, exactly as before: slice names
|
|
132
|
+
* are interned as plain strings in the protobuf, so finding one is good
|
|
133
|
+
* evidence it is there and not finding it is good evidence it is not.
|
|
134
|
+
*
|
|
135
|
+
* Counting matches would overstate it — a name is referenced many times, not
|
|
136
|
+
* interned once — so this keeps the same `Set` of distinct names the
|
|
137
|
+
* non-streaming version used, which is also what makes the chunk overlap
|
|
138
|
+
* cheap to get slightly too generous rather than exactly right: a name
|
|
139
|
+
* re-matched out of the carried tail, because it happened to sit wholly
|
|
140
|
+
* inside the last `OVERLAP_BYTES` of the previous chunk rather than
|
|
141
|
+
* straddling the boundary, is a duplicate insert into a `Set`, not a double
|
|
142
|
+
* count. Only a marker that is never matched in full, in either chunk, would
|
|
143
|
+
* be missed — which is exactly what the overlap exists to prevent.
|
|
144
|
+
*/
|
|
145
|
+
export async function countPortholeLabels(filePath) {
|
|
146
|
+
const names = new Set();
|
|
147
|
+
const handle = await open(filePath, "r");
|
|
148
|
+
try {
|
|
149
|
+
const size = (await handle.stat()).size;
|
|
150
|
+
const buffer = Buffer.alloc(CHUNK_BYTES);
|
|
151
|
+
let position = 0;
|
|
152
|
+
let carry = "";
|
|
153
|
+
while (position < size) {
|
|
154
|
+
const toRead = Math.min(CHUNK_BYTES, size - position);
|
|
155
|
+
const { bytesRead } = await handle.read(buffer, 0, toRead, position);
|
|
156
|
+
if (bytesRead === 0)
|
|
157
|
+
break; // defensive: a file truncated out from under this scan, not a loop forever re-reading zero bytes
|
|
158
|
+
const text = carry + buffer.toString("latin1", 0, bytesRead);
|
|
159
|
+
for (const match of text.matchAll(PORTHOLE_MARKER))
|
|
160
|
+
names.add(match[1].trimEnd());
|
|
161
|
+
carry = text.slice(-OVERLAP_BYTES);
|
|
162
|
+
position += bytesRead;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
await handle.close();
|
|
167
|
+
}
|
|
168
|
+
return names.size;
|
|
169
|
+
}
|
|
170
|
+
/** One sentence: whether it worked, how big, and whether it is annotated. */
|
|
171
|
+
export function describeCapture(result) {
|
|
172
|
+
const mb = (result.bytes / (1024 * 1024)).toFixed(1);
|
|
173
|
+
const parts = [`Captured ${result.seconds}s to ${result.path} (${mb}MB).`];
|
|
174
|
+
parts.push(result.portholeLabels > 0
|
|
175
|
+
? `${result.portholeLabels} Porthole track(s) in it, so the app's own navigations, ` +
|
|
176
|
+
"calls and queries are on the timeline."
|
|
177
|
+
: result.apps.length === 0
|
|
178
|
+
? "No Porthole labels found — either no package was named, so the app tag was never " +
|
|
179
|
+
"enabled, or the app was not running with the runtime attached. The trace is still " +
|
|
180
|
+
"valid, it is just not annotated."
|
|
181
|
+
: // GRA-186: on the Pixel 9 Pro Fold (Android 17) a process already
|
|
182
|
+
// running when the session starts never picks up the newly-enabled
|
|
183
|
+
// app tag — it is consulted once, at process attach, not re-read
|
|
184
|
+
// live. Naming that here, rather than the old generic "package or
|
|
185
|
+
// runtime is wrong" wording, is what turns a false "something is
|
|
186
|
+
// misconfigured" reading into the actual, actionable remedy.
|
|
187
|
+
`No Porthole labels found even though ${result.apps.join(", ")} was targeted — this ` +
|
|
188
|
+
"device/build only reads the app trace tag when its process starts, so a process " +
|
|
189
|
+
"already running before the capture began is never marked (seen on a Pixel 9 Pro " +
|
|
190
|
+
"Fold, Android 17). Pass `restartApp: true`, or launch the app after the capture " +
|
|
191
|
+
"starts, to catch it.");
|
|
192
|
+
if (result.restarted) {
|
|
193
|
+
parts.push("The app was restarted for this capture, so it contains a cold start.");
|
|
194
|
+
}
|
|
195
|
+
parts.push("Open it at ui.perfetto.dev; nothing here reads it for you.");
|
|
196
|
+
return [...parts, ...result.notes].join(" ");
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=systrace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systrace.js","sourceRoot":"","sources":["../src/systrace.ts"],"names":[],"mappings":"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"}
|