blob: 782c1e3063961e719631b2a8ea991270c5748277 [file] [log] [blame] [view]
This directory contains scripts used to assess memory usage on Android, and in
particular the memory cost of Chromium's executable code. This is related to the
`tools/cygprofile` directory.
# How to use
## Prerequisites
Most (if not all) of these tools require ADB to run as root on the
device. Android builds allowing this mode would need this command to execute:
```bash
$ adb root
```
Which must be run beforehand. In some cases, SELinux must be put in permissive
mode, with the following command:
```bash
$ adb shell setenforce 0
```
## Display Proportional Set Size (PSS) for all processes: `code_pages_pss.py`
Shows the Proportional Set Size of code pages for all processes of a given
Chrome instance. Example for a local Chrome build:
```bash
$ tools/android/native_lib_memory/code_pages_pss.py \
--app-package com.google.android.apps.chrome \
--chrome-package com.google.android.apps.chrome
INFO:root:Processes:
com.google.android.apps.chrome_zygote
com.google.android.apps.chrome
com.google.android.apps.chrome:sandboxed_process0:org.chromium.content.app.SandboxedProcessService0:0
com.google.android.apps.chrome:privileged_process0
Total PSS from code pages = 30306kB
```
## Visualize code ordering: `extract_symbols.py`
This is used to visualize the impact of code ordering on a running Chrome instance.
### Prerequisites
An official Chrome build, in order for ThinLTO to be enabled. In args.gn, you need:
```
is_debug = false
is_component_build = false
is_official_build = true
symbol_level = 1
```
And to build a Chrome target, not Chromium, in order to get code ordering,
e.g. `chrome_apk`. Then, you can either use it purely to visualize code layout,
or to couple it with residency.
### No residency
Run:
```bash
$ tools/android/native_lib_memory/extract_symbols.py \
--native-library libmonochrome.so \
--build-directory out/Release \
--output-directory /tmp/output \
--start-server
```
Will start an HTTP server on port 8000 by default, and the results are at
<http://127.0.0.1:8000/visualize.html>.
### With residency data
To get residency data as well, you need to:
1. Add `--log-native-library-residency` to Chrome's command line
2. Start Chrome, opening any site
3. Trace the device remotely, and trigger a memory dump with tracing
4. Pull the data from the local device
To add the command line flag, and ensure that the right directory exists on the device:
```bash
$ adb shell "echo '_ --log-native-library-residency' > /data/local/tmp/chrome-command-line"
$ adb shell mkdir /data/local/tmp/chrome
```
To trace the device remotely, open <chrome://inspect/?tracing#devices>. Select
the `memory-infra` category, and wait for a dump to complete. This requires a
device running at least a 4.4 kernel.
To pull the file from the device and convert it to JSON:
```bash
$ tools/android/native_lib_memory/extract_resident_pages.py \
--device-serial <DEVICE_SERIAL> \
--on-device-file-path /data/local/tmp/chrome/native-library-resident-pages.txt \
--output-directory .
```
Finally, the command to process the data is amended to:
```bash
$ tools/android/native_lib_memory/extract_symbols.py \
--native-library libmonochrome.so \
--build-directory out/Release \
--output-directory /tmp/output \
--residency residency.json \
--start-server
```