Scripts reference

Table of Contents is used to record profiling data for Android applications and native executables.

# Record an Android application.
$ python -p com.example.simpleperf.simpleperfexamplewithnative

# Record an Android application with Java code compiled into native instructions.
$ python -p com.example.simpleperf.simpleperfexamplewithnative --compile_java_code

# Record the launch of an Activity of an Android application.
$ python -p com.example.simpleperf.simpleperfexamplewithnative -a .SleepActivity

# Record a native process.
$ python -np surfaceflinger

# Record a native process given its pid.
$ python --pid 11324

# Record a command.
$ python -cmd \
    "dex2oat --dex-file=/data/local/tmp/app-profiling.apk --oat-file=/data/local/tmp/a.oat"

# Record an Android application, and use -r to send custom options to the record command.
$ python -p com.example.simpleperf.simpleperfexamplewithnative \
    -r "-e cpu-clock -g --duration 30"

# Record both on CPU time and off CPU time.
$ python -p com.example.simpleperf.simpleperfexamplewithnative \
    -r "-e task-clock -g -f 1000 --duration 10 --trace-offcpu"

# Save profiling data in a custom file (like instead of
$ python -p com.example.simpleperf.simpleperfexamplewithnative -o

Profile from launch of an application

Sometimes we want to profile the launch-time of an application. To support this, we added --app in the record command. The --app option sets the package name of the Android application to profile. If the app is not already running, the record command will poll for the app process in a loop with an interval of 1ms. So to profile from launch of an application, we can first start the record command with --app, then start the app. Below is an example.

$ python record
    --app com.example.simpleperf.simpleperfexamplewithnative \
    -g --duration 1 -o /data/local/tmp/
# Start the app manually or using the `am` command.

To make it convenient to use, supports using the -a option to start an Activity after recording has started.

$ python -p com.example.simpleperf.simpleperfexamplewithnative -a .MainActivity is used to control recording in application code. It does preparation work before recording, and collects profiling data files after recording.

Here are the details. records profiling data while the USB cable isn‘t connected. Maybe is more suitable, which also don’t need USB cable when recording. Below is an example.

$ python start \
    -p com.example.simpleperf.simpleperfexamplewithnative
# After the command finishes successfully, unplug the USB cable, run the
# SimpleperfExampleWithNative app. After a few seconds, plug in the USB cable.
$ python stop
# It may take a while to stop recording. After that, the profiling data is collected in
# on host.

The binary_cache directory is a directory holding binaries needed by a profiling data file. The binaries are expected to be unstripped, having debug information and symbol tables. The binary_cache directory is used by report scripts to read symbols of binaries. It is also used by to generate annotated source code and disassembly.

By default, builds the binary_cache directory after recording. But we can also build binary_cache for existing profiling data files using It is useful when you record profiling data using simpleperf record directly, to do system wide profiling or record without the USB cable connected. can either pull binaries from an Android device, or find binaries in directories on the host (via -lib).

# Generate binary_cache for, by pulling binaries from the device.
$ python

# Generate binary_cache, by pulling binaries from the device and finding binaries in
# SimpleperfExampleWithNative.
$ python -lib path_of_SimpleperfExampleWithNative

This script pushes the simpleperf executable on the device, and run a simpleperf command on the device. It is more convenient than running adb commands manually. is a wrapper of the report command on the host. It accepts all options of the report command.

# Report call graph
$ python -g

# Report call graph in a GUI window implemented by Python Tk.
$ python -g --gui generates report.html based on the profiling data. Then the report.html can show the profiling result without depending on other files. So it can be shown in local browsers or passed to other machines. Depending on which command-line options are used, the content of the report.html can include: chart statistics, sample table, flamegraphs, annotated source code for each function, annotated disassembly for each function.

# Generate chart statistics, sample table and flamegraphs, based on
$ python

# Add source code.
$ python --add_source_code --source_dirs path_of_SimpleperfExampleWithNative

# Add disassembly.
$ python --add_disassembly

# Adding disassembly for all binaries can cost a lot of time. So we can choose to only add
# disassembly for selected binaries.
$ python --add_disassembly --binary_filter

# accepts more than one recording data file.
$ python -i

Below is an example of generating html profiling results for SimpleperfExampleWithNative.

$ python -p com.example.simpleperf.simpleperfexamplewithnative
$ python --add_source_code --source_dirs path_of_SimpleperfExampleWithNative \

After opening the generated report.html in a browser, there are several tabs:

The first tab is “Chart Statistics”. You can click the pie chart to show the time consumed by each process, thread, library and function.

The second tab is “Sample Table”. It shows the time taken by each function. By clicking one row in the table, we can jump to a new tab called “Function”.

The third tab is “Flamegraph”. It shows the graphs generated by inferno.

The fourth tab is “Function”. It only appears when users click a row in the “Sample Table” tab. It shows information of a function, including:

  1. A flamegraph showing functions called by that function.
  2. A flamegraph showing functions calling that function.
  3. Annotated source code of that function. It only appears when there are source code files for that function.
  4. Annotated disassembly of that function. It only appears when there are binaries containing that function.


inferno is a tool used to generate flamegraph in a html file.

# Generate flamegraph based on
# On Windows, use inferno.bat instead of ./
$ ./ -sc --record_file

# Record a native program and generate flamegraph.
$ ./ -np surfaceflinger


purgatorio is a visualization tool to show samples in time order.

It converts a profiling data file into pprof.proto, a format used by pprof.

# Convert in the current directory to pprof.proto format.
$ python
# Show report in pdf format.
$ pprof -pdf pprof.profile

# Show report in html format. To show disassembly, add --tools option like:
#  --tools=objdump:<ndk_path>/toolchains/llvm/prebuilt/linux-x86_64/aarch64-linux-android/bin
# To show annotated source or disassembly, select `top` in the view menu, click a function and
# select `source` or `disassemble` in the view menu.
$ pprof -http=:8080 pprof.profile

It converts a profiling data file into a format used by FlameGraph.

# Convert in the current directory to a format used by FlameGraph.
$ python --symfs binary_cache >out.perf
$ git clone
$ FlameGraph/ out.perf >out.folded
$ FlameGraph/ out.folded >a.svg is a Python library used to parse profiling data files generated by the record command. Internally, it uses to do the work. Generally, for each profiling data file, we create an instance of ReportLib, pass it the file path (via SetRecordFile). Then we can read all samples through GetNextSample(). For each sample, we can read its event info (via GetEventOfCurrentSample), symbol info (via GetSymbolOfCurrentSample) and call chain info (via GetCallChainOfCurrentSample). We can also get some global information, like record options (via GetRecordCmd), the arch of the device (via GetArch) and meta strings (via MetaInfo).

Examples of using are in,, and inferno/