1*6dbdd20aSAndroid Build Coastguard Worker# heapprofd Custom Allocator API - Early Access 2*6dbdd20aSAndroid Build Coastguard Worker 3*6dbdd20aSAndroid Build Coastguard WorkerWARNING: The heapprofd Custom Allocator API is currently in **beta** stage. 4*6dbdd20aSAndroid Build Coastguard Worker Please file [bugs](https://github.com/google/perfetto/issues/new) 5*6dbdd20aSAndroid Build Coastguard Worker for any issues you encounter. 6*6dbdd20aSAndroid Build Coastguard Worker 7*6dbdd20aSAndroid Build Coastguard WorkerNOTE: The heapprofd Custom Allocator API requires a device running Android 8*6dbdd20aSAndroid Build Coastguard Worker 10 or newer. 9*6dbdd20aSAndroid Build Coastguard Worker 10*6dbdd20aSAndroid Build Coastguard Worker## Get SDK 11*6dbdd20aSAndroid Build Coastguard Worker 12*6dbdd20aSAndroid Build Coastguard WorkerBefore instrumenting your app, you need to get the heapprofd library and 13*6dbdd20aSAndroid Build Coastguard Workerheader. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Worker### Option 1: Prebuilts 16*6dbdd20aSAndroid Build Coastguard Worker 17*6dbdd20aSAndroid Build Coastguard WorkerYou can download the library as a binary from [Google Drive]( 18*6dbdd20aSAndroid Build Coastguard Workerhttps://drive.google.com/drive/folders/15RPlGgAHWRSk7KquBqlQ7fsCaXnNaa6r 19*6dbdd20aSAndroid Build Coastguard Worker). 20*6dbdd20aSAndroid Build Coastguard WorkerJoin our [Google Group](https://groups.google.com/forum/#!forum/perfetto-dev) 21*6dbdd20aSAndroid Build Coastguard Workerto get access. 22*6dbdd20aSAndroid Build Coastguard Worker 23*6dbdd20aSAndroid Build Coastguard Worker### Option 2: Build yourself (on Linux) 24*6dbdd20aSAndroid Build Coastguard Worker 25*6dbdd20aSAndroid Build Coastguard WorkerAlternatively, you can build the binaries yourself from AOSP. 26*6dbdd20aSAndroid Build Coastguard Worker 27*6dbdd20aSAndroid Build Coastguard WorkerFirst, [check out Perfetto](https://perfetto.dev/docs/contributing/build-instructions): 28*6dbdd20aSAndroid Build Coastguard Worker 29*6dbdd20aSAndroid Build Coastguard Worker``` 30*6dbdd20aSAndroid Build Coastguard Worker$ git clone https://android.googlesource.com/platform/external/perfetto/ 31*6dbdd20aSAndroid Build Coastguard Worker``` 32*6dbdd20aSAndroid Build Coastguard Worker 33*6dbdd20aSAndroid Build Coastguard WorkerThen, change to the project directory, download and build additional 34*6dbdd20aSAndroid Build Coastguard Workerdependencies, and then build the standalone library: 35*6dbdd20aSAndroid Build Coastguard Worker 36*6dbdd20aSAndroid Build Coastguard Worker``` 37*6dbdd20aSAndroid Build Coastguard Worker$ cd perfetto 38*6dbdd20aSAndroid Build Coastguard Workerperfetto/ $ tools/install-build-deps --android 39*6dbdd20aSAndroid Build Coastguard Workerperfetto/ $ tools/setup_all_configs.py --android 40*6dbdd20aSAndroid Build Coastguard Workerperfetto/ $ ninja -C out/android_release_incl_heapprofd_arm64 \ 41*6dbdd20aSAndroid Build Coastguard Workerlibheapprofd_standalone_client.so 42*6dbdd20aSAndroid Build Coastguard Worker``` 43*6dbdd20aSAndroid Build Coastguard Worker 44*6dbdd20aSAndroid Build Coastguard WorkerYou will find the built library in 45*6dbdd20aSAndroid Build Coastguard Worker`out/android_release_incl_heapprofd_arm64/libheapprofd_standalone_client.so`. 46*6dbdd20aSAndroid Build Coastguard WorkerThe header for the API can be found in 47*6dbdd20aSAndroid Build Coastguard Worker`src/profiling/memory/include/perfetto/heap_profile.h`. This library is built 48*6dbdd20aSAndroid Build Coastguard Workeragainst SDK version 29, so will work on Android 10 or newer. 49*6dbdd20aSAndroid Build Coastguard Worker 50*6dbdd20aSAndroid Build Coastguard WorkerWARNING: Only use the header from the checkout you used to build the library, 51*6dbdd20aSAndroid Build Coastguard Worker as the API is not stable yet. 52*6dbdd20aSAndroid Build Coastguard Worker 53*6dbdd20aSAndroid Build Coastguard WorkerTo make debugging in the future easier, make note of the revision at the time 54*6dbdd20aSAndroid Build Coastguard Workeryou built. 55*6dbdd20aSAndroid Build Coastguard Worker 56*6dbdd20aSAndroid Build Coastguard Worker``` 57*6dbdd20aSAndroid Build Coastguard Workergit rev-parse HEAD > perfetto-version.txt 58*6dbdd20aSAndroid Build Coastguard Worker``` 59*6dbdd20aSAndroid Build Coastguard WorkerPlease include this in any bugs you file. 60*6dbdd20aSAndroid Build Coastguard Worker 61*6dbdd20aSAndroid Build Coastguard Worker## Instrument App 62*6dbdd20aSAndroid Build Coastguard Worker 63*6dbdd20aSAndroid Build Coastguard WorkerLet's assume your application has a very simple custom allocator that looks 64*6dbdd20aSAndroid Build Coastguard Workerlike this: 65*6dbdd20aSAndroid Build Coastguard Worker 66*6dbdd20aSAndroid Build Coastguard Worker``` 67*6dbdd20aSAndroid Build Coastguard Workervoid* my_malloc(size_t size) { 68*6dbdd20aSAndroid Build Coastguard Worker void* ptr = [code to somehow allocate get size bytes]; 69*6dbdd20aSAndroid Build Coastguard Worker return ptr; 70*6dbdd20aSAndroid Build Coastguard Worker} 71*6dbdd20aSAndroid Build Coastguard Worker 72*6dbdd20aSAndroid Build Coastguard Workervoid my_free(void* ptr) { 73*6dbdd20aSAndroid Build Coastguard Worker [code to somehow free ptr] 74*6dbdd20aSAndroid Build Coastguard Worker} 75*6dbdd20aSAndroid Build Coastguard Worker``` 76*6dbdd20aSAndroid Build Coastguard Worker 77*6dbdd20aSAndroid Build Coastguard WorkerTo find out where in a program these two functions get called, we instrument 78*6dbdd20aSAndroid Build Coastguard Workerthe allocator using this API: 79*6dbdd20aSAndroid Build Coastguard Worker 80*6dbdd20aSAndroid Build Coastguard Worker``` 81*6dbdd20aSAndroid Build Coastguard Worker#include "path/to/heap_profile.h" 82*6dbdd20aSAndroid Build Coastguard Worker 83*6dbdd20aSAndroid Build Coastguard Workerstatic uint32_t g_heap_id = AHeapProfile_registerHeap( 84*6dbdd20aSAndroid Build Coastguard Worker AHeapInfo_create("invalid.example")); 85*6dbdd20aSAndroid Build Coastguard Workervoid* my_malloc(size_t size) { 86*6dbdd20aSAndroid Build Coastguard Worker void* ptr = [code to somehow allocate get size bytes]; 87*6dbdd20aSAndroid Build Coastguard Worker AHeapProfile_reportAllocation(g_heap_id, static_cast<uintptr_t>(ptr), size); 88*6dbdd20aSAndroid Build Coastguard Worker return ptr; 89*6dbdd20aSAndroid Build Coastguard Worker} 90*6dbdd20aSAndroid Build Coastguard Worker 91*6dbdd20aSAndroid Build Coastguard Workervoid my_free(void* ptr) { 92*6dbdd20aSAndroid Build Coastguard Worker AHeapProfile_reportFree(g_heap_id, static_cast<uintptr_t>(ptr)); 93*6dbdd20aSAndroid Build Coastguard Worker [code to somehow free ptr] 94*6dbdd20aSAndroid Build Coastguard Worker} 95*6dbdd20aSAndroid Build Coastguard Worker``` 96*6dbdd20aSAndroid Build Coastguard Worker 97*6dbdd20aSAndroid Build Coastguard WorkerDon't forget to link `heapprofd_standalone_client.so` and including it in 98*6dbdd20aSAndroid Build Coastguard Workeryour app. 99*6dbdd20aSAndroid Build Coastguard Worker 100*6dbdd20aSAndroid Build Coastguard Worker## Profile your App 101*6dbdd20aSAndroid Build Coastguard Worker 102*6dbdd20aSAndroid Build Coastguard WorkerThen, use the [heap_profile]( 103*6dbdd20aSAndroid Build Coastguard Workerhttps://raw.githubusercontent.com/google/perfetto/main/tools/heap_profile) 104*6dbdd20aSAndroid Build Coastguard Workerscript to get a profile to generate textpb of the config. 105*6dbdd20aSAndroid Build Coastguard WorkerTo convert to a binary proto, you additionally need to download 106*6dbdd20aSAndroid Build Coastguard Worker[`perfetto_trace.proto`]( 107*6dbdd20aSAndroid Build Coastguard Workerhttps://raw.githubusercontent.com/google/perfetto/main/protos/perfetto/trace/perfetto_trace.proto) 108*6dbdd20aSAndroid Build Coastguard Workerand have recent version of the protoc compiler installed. 109*6dbdd20aSAndroid Build Coastguard Worker[Learn how to install protoc](https://grpc.io/docs/protoc-installation). 110*6dbdd20aSAndroid Build Coastguard Worker 111*6dbdd20aSAndroid Build Coastguard WorkerOn Linux, you can start a profile using the following pipeline (substitue 112*6dbdd20aSAndroid Build Coastguard Worker`$APP_NAME` for the name of your app and `$HEAP` for the name of the heap 113*6dbdd20aSAndroid Build Coastguard Workeryou registered using `AHeapProfile_registerHeap`): 114*6dbdd20aSAndroid Build Coastguard Worker 115*6dbdd20aSAndroid Build Coastguard Worker``` 116*6dbdd20aSAndroid Build Coastguard Workerheap_profile -n $APP_NAME --heaps $HEAP --print-config | \ 117*6dbdd20aSAndroid Build Coastguard Worker path/to/protoc --encode=perfetto.protos.TraceConfig perfetto_trace.proto | \ 118*6dbdd20aSAndroid Build Coastguard Worker adb shell perfetto -c - -o /data/misc/perfetto-traces/profile 119*6dbdd20aSAndroid Build Coastguard Worker``` 120*6dbdd20aSAndroid Build Coastguard Worker 121*6dbdd20aSAndroid Build Coastguard WorkerOn Windows, you will need [python 3.6](https://www.python.org/downloads/) or 122*6dbdd20aSAndroid Build Coastguard Workerlater. You can start a profile using the following pipeline from a command 123*6dbdd20aSAndroid Build Coastguard Workerprompt (substitue`%APP_NAME%` for the name of your app and `%HEAP%` for 124*6dbdd20aSAndroid Build Coastguard Workerthe name of the heap you registered using `AHeapProfile_registerHeap`): 125*6dbdd20aSAndroid Build Coastguard Worker 126*6dbdd20aSAndroid Build Coastguard Worker``` 127*6dbdd20aSAndroid Build Coastguard Workerpython /path/to/heap_profile -n %APP_NAME% --heaps %HEAP% --print-config | ^ 128*6dbdd20aSAndroid Build Coastguard Worker path/to/protoc --encode=perfetto.protos.TraceConfig perfetto_trace.proto | ^ 129*6dbdd20aSAndroid Build Coastguard Worker adb shell perfetto -c - -o /data/misc/perfetto-traces/profile 130*6dbdd20aSAndroid Build Coastguard Worker``` 131*6dbdd20aSAndroid Build Coastguard Worker 132*6dbdd20aSAndroid Build Coastguard WorkerPlay around with the app to make it cause custom allocations, then stop the 133*6dbdd20aSAndroid Build Coastguard Workerprofile using `adb shell killall perfetto`. Once it is done, pull the profile 134*6dbdd20aSAndroid Build Coastguard Workerfrom `/data/misc/perfetto-traces/profile` using `adb pull`. 135*6dbdd20aSAndroid Build Coastguard Worker 136*6dbdd20aSAndroid Build Coastguard WorkerUpload the profile to the [Perfetto UI](https://ui.perfetto.dev). 137