perfetto-analyzer 1.0.4 → 1.0.6
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/CHANGELOG.md +20 -0
- package/package.json +1 -1
- package/skill/CHANGELOG.md +61 -0
- package/skill/scripts/configs/oom.textproto +25 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.0.6] - 2026-07-09
|
|
4
|
+
|
|
5
|
+
### Corrigido
|
|
6
|
+
- **`skill/CHANGELOG.md`** — CHANGELOG.md agora é instalado junto com a skill em `~/.claude/skills/perfetto-analyzer/CHANGELOG.md`, tornando a versão instalada visível sem precisar acessar o pacote npm.
|
|
7
|
+
|
|
8
|
+
## [1.0.5] - 2026-07-09
|
|
9
|
+
|
|
10
|
+
### Adicionado
|
|
11
|
+
- **`parse_perfetto_pb.py`** — Nova função `extract_thread_states()` que analisa a tabela `thread_state` do Perfetto: detecta I/O síncrono (estado `D` — uninterruptible sleep com `blocked_function`) e contenção de locks Java (slices de Monitor) por thread do app. Dado ausente nos traces anteriores que agora resolve o padrão "app travou mas o profiler não mostra nada".
|
|
12
|
+
- **`parse_perfetto_pb.py`** — Nova função `extract_cpu_megacycles()` usando o stdlib module `linux.cpu.utilization.process` (Android 12+). Retorna `[]` silenciosamente em versões anteriores.
|
|
13
|
+
- **`scripts/configs/oom.textproto`** — Novo tipo de trace `oom`: captura heap dump automaticamente ao momento do `OutOfMemoryError` via trigger `android.java_hprof.oom`. Aguarda até 1h o crash acontecer.
|
|
14
|
+
- **`analyze_metrics.py`** — Nova função `analyze_thread_states()` que gera issue `critical` quando a main thread está em I/O síncrono >10ms e `warning` para contenção de lock >5ms.
|
|
15
|
+
- **`generate_report.py`** — Nova seção **"Contenção de Threads"** na seção CPU com tabelas separadas para I/O bloqueante e Monitor contention.
|
|
16
|
+
- **`generate_report.py`** — Nova seção **"CPU Megacycles por Processo"** exibida quando disponível (Android 12+).
|
|
17
|
+
- **`collect_trace.py`** — Suporte ao tipo `oom`: modo especial sem countdown, aguarda o crash via Ctrl+C para cancelar.
|
|
18
|
+
|
|
19
|
+
### Referências (cookbooks do Perfetto que inspiraram estas melhorias)
|
|
20
|
+
- [Android Trace Analysis](https://perfetto.dev/docs/getting-started/android-trace-analysis)
|
|
21
|
+
- [Android OOM](https://perfetto.dev/docs/case-studies/android-outofmemoryerror)
|
|
22
|
+
|
|
3
23
|
## [1.0.4] - 2026-07-09
|
|
4
24
|
|
|
5
25
|
### Adicionado
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "perfetto-analyzer",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"description": "AI skill for Android performance analysis using Perfetto — works with Claude Code, Cursor, GitHub Copilot, Codex, Antigravity and Devin",
|
|
5
5
|
"bin": {
|
|
6
6
|
"perfetto-analyzer": "bin/cli.js"
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [1.0.6] - 2026-07-09
|
|
4
|
+
|
|
5
|
+
### Corrigido
|
|
6
|
+
- **`skill/CHANGELOG.md`** — CHANGELOG.md agora é instalado junto com a skill em `~/.claude/skills/perfetto-analyzer/CHANGELOG.md`, tornando a versão instalada visível sem precisar acessar o pacote npm.
|
|
7
|
+
|
|
8
|
+
## [1.0.5] - 2026-07-09
|
|
9
|
+
|
|
10
|
+
### Adicionado
|
|
11
|
+
- **`parse_perfetto_pb.py`** — Nova função `extract_thread_states()` que analisa a tabela `thread_state` do Perfetto: detecta I/O síncrono (estado `D` — uninterruptible sleep com `blocked_function`) e contenção de locks Java (slices de Monitor) por thread do app. Dado ausente nos traces anteriores que agora resolve o padrão "app travou mas o profiler não mostra nada".
|
|
12
|
+
- **`parse_perfetto_pb.py`** — Nova função `extract_cpu_megacycles()` usando o stdlib module `linux.cpu.utilization.process` (Android 12+). Retorna `[]` silenciosamente em versões anteriores.
|
|
13
|
+
- **`scripts/configs/oom.textproto`** — Novo tipo de trace `oom`: captura heap dump automaticamente ao momento do `OutOfMemoryError` via trigger `android.java_hprof.oom`. Aguarda até 1h o crash acontecer.
|
|
14
|
+
- **`analyze_metrics.py`** — Nova função `analyze_thread_states()` que gera issue `critical` quando a main thread está em I/O síncrono >10ms e `warning` para contenção de lock >5ms.
|
|
15
|
+
- **`generate_report.py`** — Nova seção **"Contenção de Threads"** na seção CPU com tabelas separadas para I/O bloqueante e Monitor contention.
|
|
16
|
+
- **`generate_report.py`** — Nova seção **"CPU Megacycles por Processo"** exibida quando disponível (Android 12+).
|
|
17
|
+
- **`collect_trace.py`** — Suporte ao tipo `oom`: modo especial sem countdown, aguarda o crash via Ctrl+C para cancelar.
|
|
18
|
+
|
|
19
|
+
### Referências (cookbooks do Perfetto que inspiraram estas melhorias)
|
|
20
|
+
- [Android Trace Analysis](https://perfetto.dev/docs/getting-started/android-trace-analysis)
|
|
21
|
+
- [Android OOM](https://perfetto.dev/docs/case-studies/android-outofmemoryerror)
|
|
22
|
+
|
|
23
|
+
## [1.0.4] - 2026-07-09
|
|
24
|
+
|
|
25
|
+
### Adicionado
|
|
26
|
+
- **`generate_report.py`** — Seção "Próximos Passos" agora inclui sugestões de traces de correlação automáticas quando fazem sentido:
|
|
27
|
+
- `cpu` com Compose: sugere `frames` para confirmar se as recomposições causam drops reais
|
|
28
|
+
- `cpu` com problemas: sugere `memory` para verificar heap churn nos mesmos hot paths
|
|
29
|
+
- `frames` com jank: sugere `cpu` para identificar a callstack durante o deadline miss
|
|
30
|
+
- `memory` com problemas: sugere `cpu` (hotspots de alocação) e `frames` (GC causando jank)
|
|
31
|
+
- `battery` com problemas: sugere `cpu` e `all`
|
|
32
|
+
- Trace tipo `all`: nenhuma sugestão (já captura tudo)
|
|
33
|
+
|
|
34
|
+
## [1.0.3] - 2026-07-09
|
|
35
|
+
|
|
36
|
+
### Corrigido
|
|
37
|
+
- **`parse_perfetto_pb.py`** — Dados de frames vazios em devices físicos. O fallback para Android < 12 usava correspondência exata do nome do slice (`'Choreographer#doFrame'`), mas em muitos devices físicos o nome vem com sufixo de frame number (`'Choreographer#doFrame 12345'`). Corrigido usando `LIKE 'Choreographer#doFrame%'` e `LIKE '%DrawFrame%'`.
|
|
38
|
+
|
|
39
|
+
## [1.0.2] - 2026-07-09
|
|
40
|
+
|
|
41
|
+
### Corrigido
|
|
42
|
+
- **`generate_report.py`** — `TypeError: 'NoneType' object is not subscriptable` ao gerar relatório de traces do tipo `battery`. Ocorria quando `thread_name` estava presente no dicionário com valor `None` (amostras de CPU sem thread associada). Corrigido em 4 ocorrências com `(value or "?")[:N]` no lugar de `value[:N]`.
|
|
43
|
+
- **`memory.textproto`** — App travava durante coleta de memória por causa do `block_client: true` no heapprofd, que bloqueava as threads do app a cada chamada `malloc()`. Alterado para `block_client: false`.
|
|
44
|
+
- **`memory.textproto`** — Reduzido `sampling_interval_bytes` de `4096` para `8192` para diminuir o overhead de profiling.
|
|
45
|
+
- **`all.textproto`** — Mesmas correções de `block_client` e `sampling_interval_bytes` aplicadas ao tipo `all`.
|
|
46
|
+
- **`all.textproto`** — Adicionado `android.java_hprof` que estava ausente: o tipo `all` não capturava objetos Java/Kotlin retidos no heap ART.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## [1.0.0] - 2026-07-09
|
|
51
|
+
|
|
52
|
+
### Adicionado
|
|
53
|
+
- Coleta automática de traces Perfetto via `adb` com suporte aos tipos `memory`, `cpu`, `frames`, `battery` e `all`.
|
|
54
|
+
- Abertura automática do app via launcher caso não esteja em execução no momento da coleta.
|
|
55
|
+
- Parsing de callstacks de CPU com CTE recursiva percorrendo a cadeia completa de `stack_profile_callsite` até profundidade 60.
|
|
56
|
+
- Identificação de hotspots do código do app filtrando frames pelo prefixo do package (com remoção de sufixos de build variant: `debug`, `release`, `staging`, etc.).
|
|
57
|
+
- Correlação de amostras de CPU com janelas de frames janked (`actual_frame_timeline_slice WHERE on_time_finish = 0`).
|
|
58
|
+
- Relatório markdown estruturado com Resumo Executivo, Memória, CPU, Frames, Bateria e Recomendações priorizadas por severidade.
|
|
59
|
+
- Instalação automática para 6 harness agents: Claude Code, GitHub Copilot, Cursor, Antigravity, Codex e Devin.
|
|
60
|
+
- CLI com comandos `install` e `uninstall` via `npx perfetto-analyzer`.
|
|
61
|
+
- Instalação automática via `postinstall` ao usar `npm install -g perfetto-analyzer`.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
buffers: {
|
|
2
|
+
size_kb: 524288
|
|
3
|
+
fill_policy: DISCARD
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
data_sources: {
|
|
7
|
+
config {
|
|
8
|
+
name: "android.java_hprof.oom"
|
|
9
|
+
java_hprof_config {
|
|
10
|
+
process_cmdline: "__PACKAGE__"
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
# Dispara automaticamente ao detectar java.lang.OutOfMemoryError
|
|
16
|
+
# no processo monitorado. Para o trace 500ms após a detecção
|
|
17
|
+
# para garantir que o heap dump seja capturado.
|
|
18
|
+
trigger_config {
|
|
19
|
+
trigger_mode: STOP_TRACING
|
|
20
|
+
triggers {
|
|
21
|
+
name: "com.android.telemetry.art-outofmemory"
|
|
22
|
+
stop_delay_ms: 500
|
|
23
|
+
}
|
|
24
|
+
trigger_timeout_ms: 3600000
|
|
25
|
+
}
|