heapprofd Custom Allocator API - Early Access
WARNING: heapprofd Custom Allocator API 目前处于 beta 阶段。 如遇到任何问题,请提交 bug。
NOTE: heapprofd Custom Allocator API 需要运行 Android 10 或更高版本的设备。
获取 SDK
在为你的应用程序进行插桩之前,你需要获取 heapprofd 库和头文件。
选项 1:预构建版本
你可以从 Google Drive 下载库的二进制文件。 加入我们的 Google Group 以获取访问权限。
选项 2:自己构建(在 Linux 上)
或者,你可以从 AOSP 自己构建二进制文件。
首先,检出 Perfetto:
$ git clone https://github.com/google/perfetto.git然后,切换到项目目录,下载并构建额外的依赖项,然后构建独立库:
$ cd perfetto
perfetto/ $ tools/install-build-deps --android
perfetto/ $ tools/setup_all_configs.py --android
perfetto/ $ ninja -C out/android_release_incl_heapprofd_arm64 \
libheapprofd_standalone_client.so你将在 out/android_release_incl_heapprofd_arm64/libheapprofd_standalone_client.so 中找到构建的库。
API 的头文件可以在 src/profiling/memory/include/perfetto/heap_profile.h 中找到。
此库是针对 SDK 版本 29 构建的,因此将在 Android 10 或更高版本上运行。
WARNING: 仅使用你用于构建库的 checkout 中的头文件, 因为 API 尚不稳定。
为了使未来的调试更容易,请记下你构建时的修订版本。
git rev-parse HEAD > perfetto-version.txt请在你提交的任何 bug 中包含此内容。
为应用程序插桩
假设你的应用程序有一个非常简单的自定义分配器,如下所示:
void* my_malloc(size_t size) {
void* ptr = [代码以某种方式分配 size 字节];
return ptr;
}
void my_free(void* ptr) {
[代码以某种方式释放 ptr]
}要找出程序中这两个函数在何处被调用,我们使用此 API 为分配器进行插桩:
static uint32_t g_heap_id = AHeapProfile_registerHeap(
AHeapInfo_create("invalid.example"));
void* my_malloc(size_t size) {
void* ptr = [代码以某种方式分配 size 字节];
AHeapProfile_reportAllocation(g_heap_id, static_cast<uintptr_t>(ptr), size);
return ptr;
}
void my_free(void* ptr) {
AHeapProfile_reportFree(g_heap_id, static_cast<uintptr_t>(ptr));
[代码以某种方式释放 ptr]
}不要忘记链接 heapprofd_standalone_client.so 并将其包含在你的应用程序中。
为应用程序分析
然后,使用 heap_profile
脚本来获取 profile 以生成配置的 textpb。要转换为二进制 proto,你还需要下载
perfetto_trace.proto
并安装最新版本的 protoc 编译器。
了解如何安装 protoc。
在 Linux 上,你可以使用以下管道启动 profile(将 $APP_NAME 替换为你的应用程序名称,
将 $HEAP 替换为你使用 AHeapProfile_registerHeap 注册的 heap 名称):
heap_profile -n $APP_NAME --heaps $HEAP --print-config | \
path/to/protoc --encode=perfetto.protos.TraceConfig perfetto_trace.proto | \
adb shell perfetto -c - -o /data/misc/perfetto-traces/profile在 Windows 上,你需要 python 3.6 或更高版本。
你可以从命令提示符使用以下管道启动 profile(将 %APP_NAME% 替换为你的应用程序名称,
将 %HEAP% 替换为你使用 AHeapProfile_registerHeap 注册的 heap 名称):
python /path/to/heap_profile -n %APP_NAME% --heaps %HEAP% --print-config | ^
path/to/protoc --encode=perfetto.protos.TraceConfig perfetto_trace.proto | ^
adb shell perfetto -c - -o /data/misc/perfetto-traces/profile在应用程序中操作以使其导致自定义分配,然后使用 adb shell killall perfetto 停止 profile。
完成后,使用 adb pull 从 /data/misc/perfetto-traces/profile 拉取 profile。
将 profile 上传到 Perfetto UI。