blob: 9feaea05126fabf427e7178e58c7d2dbb6fa3ade [file] [view]
# SuperSize
SuperSize is comprised of two parts:
1. A command-line tool for creating and inspecting `.size` and `.sizediff` files,
2. A web app for visualizing `.size` and `.sizediff` files.
For more details, see [//tools/binary_size/libsupersize/docs].
[//tools/binary_size/libsupersize/docs]: /tools/binary_size/libsupersize/docs
[TOC]
## Why SuperSize?
Chrome on Android needs to be as lean as possible. Having a tool that can show
why binary grows & shrinks helps keep it lean.
The [android-binary-size trybot] uses SuperSize to show an APK Breakdown on
every Chromium code review.
SuperSize is also used when creating [milestone size reports] (Googlers only).
[android-binary-size trybot]: /docs/speed/binary_size/android_binary_size_trybot.md
[milestone size reports]: https://goto.google.com/chromemilestonesizes
## Is SuperSize a Generic Tool?
No. It works only for binaries built using Chrome's custom build system. E.g.:
* It assumes `.ninja` build rules are available.
* It uses heuristic for locating `.so` given `.apk`.
* It requires the `size-info` build directory to analyze `.pak` and `.dex`
files.
## SuperSize Usage
### supersize archive
Collect size information into a `.size` file.
*** note
**Note:** Refer to
[diagnose_bloat.py](https://cs.chromium.org/search/?q=file:diagnose_bloat.py+gn_args)
for list of GN args to build a release binary (or just use the tool with --single).
***
Example Usage:
```bash
# Android:
autoninja -C out/Release chrome_public_apk
tools/binary_size/supersize archive chrome.size -f out/Release/apks/ChromePublic.apk -v
# Linux:
autoninja -C out/Release chrome
tools/binary_size/supersize archive chrome.size -f out/Release/chrome -v
```
### supersize console
Starts a Python interpreter where you can run custom queries, or run pre-made
queries from `canned_queries.py`.
Example Usage:
```bash
# Prints size information and exits (does not enter interactive mode).
tools/binary_size/supersize console chrome.size --query='Print(size_info)'
# Enters a Python REPL (it will print more guidance).
tools/binary_size/supersize console chrome.size
```
Example Session:
```python
>>> ShowExamples() # Get some inspiration.
...
>>> sorted = size_info.symbols.WhereInSection('t').Sorted()
>>> Print(sorted) # Have a look at the largest symbols.
...
>>> sym = sorted.WhereNameMatches('TrellisQuantizeBlock')[0]
>>> Disassemble(sym) # Time to learn assembly.
...
>>> help(canned_queries)
...
>>> Print(canned_queries.TemplatesByName(depth=-1))
...
>>> syms = size_info.symbols.WherePathMatches(r'skia').Sorted()
>>> Print(syms, verbose=True) # Show full symbol names with parameter types.
...
>>> # Dump all string literals from skia files to "strings.txt".
>>> Print((t[1] for t in ReadStringLiterals(syms)), to_file='strings.txt')
```
### supersize save_diff
Creates a `.sizediff` file given two `.size` files. A `.sizediff` file contains
two `.size` files, with all unchanged symbols removed.
Example Usage:
```bash
tools/binary_size/supersize save_diff before.size after.size out.sizediff
```
### supersize diff
A convenience command equivalent to:
`console before.size after.size --query='Print(Diff(size_info1, size_info2))'`
Example Usage:
```bash
tools/binary_size/supersize diff before.size after.size --all
```
## Sharing .size(diff) Files
There is a GCS bucket available for Googlers to share SuperSize files (requires
a one-time `gsutil.py config` to login).
To share publicly:
```sh
FILENAME=descriptive_name.sizediff
gsutil.py cp -a public-read "$FILENAME" gs://chrome-supersize/oneoffs/$USER/
echo "Share via: https://chrome-supersize.firebaseapp.com/viewer.html?load_url=https://storage.googleapis.com/chrome-supersize/oneoffs/$USER/$(basename $FILENAME)"
```
To share to Googlers only:
```sh
FILENAME=descriptive_name.sizediff
gsutil.py cp "$FILENAME" gs://chrome-supersize/private-oneoffs/$USER/
echo "Share via: https://chrome-supersize.firebaseapp.com/viewer.html?load_url=https://storage.googleapis.com/chrome-supersize/private-oneoffs/$USER/$(basename $FILENAME)"
```
To delete a file you uploaded by mistake:
```sh
gsutil.py rm gs://chrome-supersize/oneoffs/$USER/filename
```