Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(28)

Unified Diff: tools/binary_size/README.txt

Issue 119083006: Add tool to help analyze binary size (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase onto master for a clean commit of gyp change Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698