EmuLabZip logo EmuLabZip

Como as ferramentas oficiais funcionam

Atualizado em · Editar esta página no GitHub

Antes de escrever o EmuLabZip, estudamos como o Xcode Instruments e os profilers do Android Studio coletam seus dados. O estudo foi estático: olhamos os pacotes de aplicativo distribuídos, as bibliotecas que eles usam, as classes e os pacotes dentro dos arquivos JAR e as strings dos binários que rodam no dispositivo. Nada foi alterado nem redistribuído. O objetivo era entender quais fontes de dados existem e, depois, escolher as que uma ferramenta de código aberto consegue usar por meio de interfaces públicas e documentadas.

Xcode Instruments#

ÁreaO que encontramos
Linguagens e UISwift e Objective-C, AppKit com SwiftUI, mais frameworks privados de gráficos e de árvore de chamadas
PluginsPacotes .xrplugin e pacotes de instrumentos .instrdst (Networking, HTTP Tracing, SwiftUI, Hangs, Hitches, System Trace…)
TransporteDTX, um protocolo RPC privado, sobre sockets, portas Mach ou memória compartilhada, com compressão
Agente no dispositivoO DTServiceHub expõe canais como sysmontap (estatísticas de processos e do sistema), coreprofilesessiontap (trace do kernel), objectalloc, vmtracking e activitytracetap (os_log e signposts)
Fontes de dadosTrace do kernel (ktrace, kperf), o sistema de log unificado e signposts, simbolização
RedeEstatísticas de conexão (netstats) e o rastreamento de HTTP do CFNetwork emitido pelo log unificado, não um proxy
Linha de comandoxctrace record e xctrace export

Xcode e o Simulator#

O simctl controla o CoreSimulator por meio de um serviço XPC. Ele consegue listar e iniciar dispositivos, executar comandos dentro de um simulador (simctl spawn … log stream), capturar a tela (simctl io screenshot, recordVideo), listar apps e seus containers, sobrescrever a barra de status, definir a localização, enviar notificações push e adicionar certificados raiz. Um app de simulador é um processo comum do macOS, então o host consegue ler diretamente o uso de CPU e de memória dele.

Android Studio#

ÁreaO que encontramos
PlataformaIntelliJ Platform no JetBrains Runtime, Kotlin e Java, Swing com Compose for Desktop para a UI mais nova do profiler
Acesso ao dispositivoddmlib e adblib (ADB), e a API gRPC do emulador, descoberta a partir dos arquivos avd/running/pid_*.ini
ProfilersUm pipeline de transporte: grpc-java e protobuf entre o Studio e um daemon no dispositivo
Daemon no dispositivotransport (antes perfd), enviado para /data/local/tmp/perfd/. Ele executa dumpsys meminfo --checkin, dumpsys SurfaceFlinger --latency, perfetto, simpleperf, am dumpheap e carrega um agente JVMTI em apps debuggable
TracesPerfetto (trace_processor como serviço gRPC), relatórios do simpleperf, traces de métodos do ART
MemóriaHeap dumps .hprof lidos com o Shark, alocações nativas pelo heapprofd no Perfetto
RedeAntes, reescrita de bytecode do OkHttp e do HttpURLConnection com ASM (profilers-transform.jar); hoje, o inspetor de rede do App Inspection, que se encaixa nas pilhas HTTP dentro de apps debuggable

O que o EmuLabZip usa#

Usamos apenas interfaces públicas e documentadas. O protocolo DTX da Apple e os agentes no dispositivo do Google são privados, mudam entre versões e não temos o direito de redistribuí-los.

DadosAndroidSimulador iOS
DispositivosProtocolo host do ADB (host:devices-l), falado diretamente em Rustxcrun simctl list devices -j
Fatos do dispositivogetprop, wm, dumpsys battery, /procJSON do simctl, lista de runtimes, defaults dentro do simulador
Appspm list packages, pssimctl listapps, launchctl list dentro do simulador
Logslogcat -v threadtimelog stream --style ndjson dentro do simulador
Screenshotsscreencap -psimctl io screenshot
CPU e memória (Fase 2)/proc/<pid>/stat, dumpsys meminfoEstatísticas de processo do host
Frames (Fase 2)dumpsys gfxinfo framestatsSignposts e xctrace (Fase 4)
Traces (Fase 4)Perfetto, simpleperfxctrace record e export
Rede (Fase 3)Proxy HTTP com uma CA de usuário, emulator -tcpdumpProxy do host, simctl keychain add-root-cert

Isso mantém o EmuLabZip pequeno, seguro para rodar em qualquer imagem de emulador e estável entre as atualizações do Xcode e do Android Studio. Também significa que nada é instalado no dispositivo: toda consulta é algo que você mesmo poderia digitar no adb shell ou no xcrun simctl.