| Index: tools/binary_size/README.txt | 
| diff --git a/tools/binary_size/README.txt b/tools/binary_size/README.txt | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..36e45a2e33202cccd84da1fcab1f9c463b377e7b | 
| --- /dev/null | 
| +++ b/tools/binary_size/README.txt | 
| @@ -0,0 +1,117 @@ | 
| +================================================================================ | 
| +              __________  .__ | 
| +              \______   \ |__|   ____   _____    _______   ___.__. | 
| +               |    |  _/ |  |  /    \  \__  \   \_  __ \ <   |  | | 
| +               |    |   \ |  | |   |  \  / __ \_  |  | \/  \___  | | 
| +               |______  / |__| |___|  / (____  /  |__|     / ____| | 
| +                      \/            \/       \/            \/ | 
| +    _________ .__                        ___________                   .__ | 
| +   /   _____/ |__| ________   ____       \__    ___/   ____     ____   |  | | 
| +   \_____  \  |  | \___   / _/ __ \        |    |     /  _ \   /  _ \  |  | | 
| +   /        \ |  |  /    /  \  ___/        |    |    (  <_> ) (  <_> ) |  |__ | 
| +  /_______  / |__| /_____ \  \___  >       |____|     \____/   \____/  |____/ | 
| +          \/             \/      \/ | 
| +================================================================================ | 
| + | 
| +-------------------------------------------------------------------------------- | 
| +Introduction | 
| +-------------------------------------------------------------------------------- | 
| +The ever-increasing size of binaries is a problem for everybody. Increased | 
| +binary size means longer download times and a bigger on-disk footprint after | 
| +installation. Mobile devices suffer the worst, as they frequently have | 
| +sub-optimal connectivity and limited storage capacity. Developers currently | 
| +have almost no visibility into how the space in the existing binaries is | 
| +divided nor how their contributions change the space within those binaries. | 
| +The first step to reducing the size of binaries is to make the size information | 
| +accessible to everyone so that developers can take action. | 
| + | 
| +The Binary Size Tool does the following: | 
| +  1. Runs "nm" on a specified binary to dump the symbol table | 
| +  2. Runs a parallel pool of "addr2line" processes to map the symbols from the | 
| +     symbol table back to source code (way faster than running "nm -l") | 
| +  3. Creates (and optionally saves) an intermediate file that accurately mimcs | 
| +     (binary compatible with) the "nm" output format, with all the source code | 
| +     mappings present | 
| +  4. Parses, sorts and analyzes the results | 
| +  5. Generates an HTML-based report in the specified output directory | 
| + | 
| + | 
| +-------------------------------------------------------------------------------- | 
| +How to Run | 
| +-------------------------------------------------------------------------------- | 
| +Running the tool is fairly simply. For the sake of this example we will | 
| +pretend that you are building the Content Shell APK for Android. | 
| + | 
| +  1. Build your product as you normally would, e.g.: | 
| +       ninja -C out/Release -j 100 content_shell_apk | 
| + | 
| +  2. Build the "binary_size_tool" target from ../../build/all_android.gyp, e.g.: | 
| +       ninja -C out/Release binary_size_tool | 
| + | 
| +  3. Run the tool specifying the library and the output report directory. | 
| +     This command will run the analysis on the Content Shell native library for | 
| +     Android using the nm/addr2line binaries from the Android NDK for ARM, | 
| +     producing an HTMl report in /tmp/report: | 
| +       tools/binary_size/run_binary_size_analysis.py \ | 
| +         --library out/Release/lib/libcontent_shell_content_view.so \ | 
| +         --destdir /tmp/report \ | 
| +         --arch android-arm | 
| + | 
| +Of course, there are additional options that you can see by running the tool | 
| +with "--help". | 
| + | 
| +This whole process takes about an hour on a modern (circa 2014) quad-core | 
| +machine. If you have LOTS of RAM, you can use the "--jobs" argument to | 
| +add more addr2line workers; doing so will *greatly* reduce the processing time | 
| +but will devour system memory. If you've got the horsepower, 10 workers can | 
| +thrash through the binary in about 5 minutes at a cost of around 60 GB of RAM. | 
| + | 
| +-------------------------------------------------------------------------------- | 
| +Analyzing the Output | 
| +-------------------------------------------------------------------------------- | 
| +When the tool finishes its work you'll find an HTML report in the output | 
| +directory that you specified with "--destdir". Open the index.html file in your | 
| +*cough* browser of choice *cough* and have a look around. The index.html page | 
| +is likely to evolve over time, but will always be your starting point for | 
| +investigation. From here you'll find links to various views of the data such | 
| +as treemap visualizations, overall statistics and "top n" lists of various | 
| +kinds. | 
| + | 
| +The report is completely standalone. No external resources are required, so the | 
| +report may be saved and viewed offline with no problems. | 
| + | 
| +-------------------------------------------------------------------------------- | 
| +Caveats | 
| +-------------------------------------------------------------------------------- | 
| +The tool is not perfect and has several shortcomings: | 
| + | 
| +  * Not all space in the binary is accounted for. The cause is still under | 
| +    investigation. | 
| +  * The tool is partly written in Java, temporarily tying it to Android | 
| +    purely and solely because it needs Java build logic which is only defined | 
| +    in the Android part of the build system. The Java portions need to be | 
| +    rewritten in Python so we can decouple from Android, or we need to find | 
| +    an alternative (readelf, linker maps, etc) to running nm/addr2line. | 
| +  * The Java code assumes that the library file is within a Chromium release | 
| +    directory. This limits it to Chromium-based binaries only. | 
| +  * The Java code has a hack to accurately identify the source of ICU data | 
| +    within the Chromium source tree due to missing symbols in the ICU ASM | 
| +    output. | 
| +  * The Python script assumes that arm-based and mips-based nm/addr2line | 
| +    binaries exist in ../../third_party. This is true only when dealing with | 
| +    Android and again limits the tool to Chromium-based binaries. | 
| +  * The Python script uses build system variables to construct the classpath | 
| +    for running the Java code. | 
| +  * The Javascript code in the HTML report Assumes code lives in Chromium for | 
| +    generated hyperlinks and will not hyperlink any file that starts with the | 
| +    substring "out". | 
| + | 
| +-------------------------------------------------------------------------------- | 
| +Feature Requests and Bug Reports | 
| +-------------------------------------------------------------------------------- | 
| +Please file bugs and feature requests here, making sure to use the label | 
| +"Binary-Size-Tool": | 
| +  https://code.google.com/p/chromium/issues/entry?labels=Binary-Size-Tool | 
| + | 
| +View all open issues here: | 
| +  https://code.google.com/p/chromium/issues/list?can=2&q=label:Binary-Size-Tool | 
|  |