loli_profiler
LoliProfiler captures native allocations in Android applications and displays call stacks, a treemap, memory timeline, screenshots, and smaps data. The desktop GUI and headless capture CLI use the same Qt-free C++ core.


Compare opens dockable Base, Comparer, and Diff views for two captures. Comparison guide.
Build
From the repository root:
python scripts/build.py
The interactive menu builds the GUI, CLI, Android hooks, and release zip. SDK/NDK downloads require your confirmation. See the build guide for prerequisites, non-interactive commands, and Windows/macOS/Linux details.
The GUI's Console tab shows capture and load timings. GUI and CLI use the same logging API; add --log-file profiler.log to save timestamped diagnostics and --log-level debug for more detail. See the quick start.
Documentation
- Quick start (Chinese)
- macOS build notes and Linux build notes
- Capture, dump, and compare CLI
- Python agent CLI for indexed
.dbheap exploration - Game engine integration (Chinese)
- Troubleshooting and architecture
What the tools do
| Tool | Use |
|---|---|
LoliProfilerImGui |
Launch or attach, inspect live/saved captures, and save .loli files. |
LoliProfilerCLI |
Capture headlessly; export .txt or SQLite .db; compare captures; symbolize offline. |
LoliProfilerCompare |
Compare two saved captures in independent, dockable Base/Comparer/Diff panels. |
agentcli Python package |
Query the SQLite call tree from scripts or agents. The loli command remains available. |
During capture, choose whether to keep every allocation record or retain only allocations still live at stop. In the Stacktrace panel, the All Allocations / Persistent selector changes the inspection view for saved records. Symbol names require a matching application library with suitable debug information.
Open-source components
The comparer builds on leoin2012's fork, whose Loli Compare module credits shuchangliu.
| Project | Role |
|---|---|
| Dear ImGui | Dockable desktop interface. |
| ImGui-SFML | ImGui rendering and event integration. |
| SFML | Window, graphics, and device socket transport. |
| nativefiledialog-extended | Native file and folder dialogs. |
| tiny-process-library | ADB, Python, and symbol-tool subprocesses. |
| RapidJSON | Application settings. |
| SQLite | Indexed .db snapshot export and agent queries. |
| LZ4 | Compressed capture packets. |
| xHook | Android native allocation hooks. |
| Nougat_dlfunctions | Android symbol lookup helper. |
The Android hook also draws on upstream stack-trace and sampling techniques documented in Chromium and Perfetto. The JDWP injection approach is described in this article. Legacy toolbar assets credit Smashicons and Freepik.
License
See LICENSE and the licenses in each vendored component.
