| # Chrome Android Dependency Analysis Tool |
| |
| ## Overview |
| |
| As part of Chrome Modularization, this directory contains various tools for |
| analyzing the dependencies contained within the Chrome Android project. |
| |
| If you'd like to just view the graph, the simplest way is to use the script: |
| |
| ``` |
| tools/android/dependency_analysis/start_server.sh |
| ``` |
| |
| ## Usage |
| |
| Start by generating a JSON dependency file with a snapshot of the dependencies |
| for your JAR files using the **JSON dependency generator** command-line tool. |
| |
| This snapshot file can then be used as input for various other analysis tools |
| listed below. |
| |
| See the visualization [js/README.md](js/README.md) for details on how to start a |
| local server to view your local dependency graphs. |
| |
| ## Command-line tools |
| |
| The usage information for any of the following tools is also accessible via |
| `toolname -h` or `toolname --help`. |
| |
| #### JSON Dependency Generator |
| |
| Runs [jdeps](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdeps.html) |
| (dependency analysis tool) root build target depends on and writes the resulting |
| dependency graph into a JSON file. The default root build target is |
| chrome/android:chrome_public_bundle. |
| |
| ``` |
| usage: generate_json_dependency_graph.py [-h] -o OUTPUT [-C BUILD_OUTPUT_DIR] |
| [-p PREFIX] [-t TARGET] |
| [-d CHECKOUT_DIR] [-j JDEPS_PATH] |
| [-g GN_PATH] [--skip-rebuild] |
| [--show-ninja] [-v] |
| |
| Runs jdeps (dependency analysis tool) on all JARs and writes the resulting |
| dependency graph into a JSON file. |
| options: |
| -h, --help show this help message and exit |
| -C BUILD_OUTPUT_DIR, --build_output_dir BUILD_OUTPUT_DIR |
| Build output directory, will attempt to guess if not |
| provided. |
| -p PREFIX, --prefix PREFIX |
| If any package prefixes are passed, these will be used |
| to filter classes so that only classes with a package |
| matching one of the prefixes are kept in the graph. By |
| default no filtering is performed. |
| -t TARGET, --target TARGET |
| If a specific target is specified, only transitive |
| deps of that target are included in the graph. By |
| default all known javac jars are included. |
| -d CHECKOUT_DIR, --checkout-dir CHECKOUT_DIR |
| Path to the chromium checkout directory. By default |
| the checkout containing this script is used. |
| -j JDEPS_PATH, --jdeps-path JDEPS_PATH |
| Path to the jdeps executable. |
| -g GN_PATH, --gn-path GN_PATH |
| Path to the gn executable. |
| --skip-rebuild Skip rebuilding, useful on bots where compile is a |
| separate step right before running this script. |
| --show-ninja Used to show ninja output. |
| -v, --verbose Used to display detailed logging. |
| |
| required arguments: |
| -o OUTPUT, --output OUTPUT |
| Path to the file to write JSON output to. Will be |
| created if it does not yet exist and overwrite |
| existing content if it does. |
| ``` |
| |
| #### Class Dependency Audit |
| |
| Given a JSON dependency graph, output the class-level dependencies for a given |
| list of classes. |
| |
| An example is given at the end of this page. To see the options: |
| |
| ``` |
| tools/android/dependency_analysis/print_class_dependencies.py -h |
| ``` |
| |
| #### Package Dependency Audit |
| |
| Given a JSON dependency graph, output the package-level dependencies for a |
| given package and the class dependencies comprising those dependencies. |
| |
| An example is given at the end of this page. To see the options: |
| |
| ``` |
| tools/android/dependency_analysis/print_package_dependencies.py -h |
| ``` |
| |
| #### Package Cycle Counting |
| |
| Given a JSON dependency graph, counts package cycles up to a given size. |
| |
| To see the options: |
| |
| ``` |
| tools/android/dependency_analysis/count_cycles.py -h |
| ``` |
| |
| ## Example Usage |
| |
| This Linux example assumes Chromium is contained in a directory `~/cr` |
| and that Chromium has been built as per the instructions |
| [here](https://chromium.googlesource.com/chromium/src/+/main/docs/linux/build_instructions.md), |
| although the only things these assumptions affect are the file paths. |
| |
| ``` |
| $ tools/android/dependency_analysis/generate_json_dependency_graph.py -C out/Debug -o ~/graph.json |
| >>> Running jdeps and parsing output... |
| >>> Parsed class-level dependency graph, got 3239 nodes and 19272 edges. |
| >>> Created package-level dependency graph, got 500 nodes and 4954 edges. |
| >>> Dumping JSON representation to ~/graph.json. |
| |
| tools/android/dependency_analysis/print_class_dependencies.py -f ~/graph.json -c AppHooks |
| >>> Printing class dependencies for org.chromium.chrome.browser.AppHooks: |
| >>> 35 inbound dependency(ies) for org.chromium.chrome.browser.AppHooks: |
| >>> org.chromium.chrome.browser.AppHooksImpl |
| >>> org.chromium.chrome.browser.ChromeActivity |
| >>> ... |
| |
| tools/android/dependency_analysis/print_package_dependencies.py -f ~/graph.json -p chrome.browser |
| >>> Printing package dependencies for org.chromium.chrome.browser: |
| >>> 121 inbound dependency(ies) for org.chromium.chrome.browser: |
| >>> org.chromium.chrome.browser.about_settings -> org.chromium.chrome.browser |
| >>> 1 class edge(s) comprising the dependency: |
| >>> AboutChromeSettings -> ChromeVersionInfo |
| >>> ... |
| ``` |