1*6777b538SAndroid Build Coastguard Worker# Introduction 2*6777b538SAndroid Build Coastguard Worker 3*6777b538SAndroid Build Coastguard WorkerThis document describes the `.build_config.json` files that are used by the 4*6777b538SAndroid Build Coastguard WorkerChromium build system for Android-specific targets like APK, resources, 5*6777b538SAndroid Build Coastguard Workerand more. 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker[TOC] 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker# I. Overview of .build_config.json files: 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard WorkerThe Android build requires performing computations about dependencies in 12*6777b538SAndroid Build Coastguard Workervarious targets, which are not possible with the GN build language. To address 13*6777b538SAndroid Build Coastguard Workerthis, `.build_config.json` files are written during the build to store the needed 14*6777b538SAndroid Build Coastguard Workerper-target information as JSON files. 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard WorkerThey are always written to `$target_gen_dir/${target_name}.build_config.json`. 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard WorkerMany scripts under [`build/android/gyp/`](build/android_gyp/), which are used 19*6777b538SAndroid Build Coastguard Workerduring the build, can also accept parameter arguments using 20*6777b538SAndroid Build Coastguard Worker`@FileArg references`, which look like: 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker --some-param=@FileArg(<filename>:<key1>:<key2>:..<keyN>) 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard WorkerThis placeholder will ensure that `<filename>` is read as a JSON file, then 25*6777b538SAndroid Build Coastguard Workerreturn the value at `[key1][key2]...[keyN]` for the `--some-param` option. 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard WorkerApart from that, the scripts do not need to know anything about the structure 28*6777b538SAndroid Build Coastguard Workerof `.build_config.json` files (but the GN rules that invoke them do and select 29*6777b538SAndroid Build Coastguard Workerwhich `@FileArg()` references to use). 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard WorkerFor a concrete example, consider the following GN fragment: 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker```gn 34*6777b538SAndroid Build Coastguard Worker# From //ui/android/BUILD.gn: 35*6777b538SAndroid Build Coastguard Workerandroid_resources("ui_java_resources") { 36*6777b538SAndroid Build Coastguard Worker custom_package = "org.chromium.ui" 37*6777b538SAndroid Build Coastguard Worker resource_dirs = [ "java/res" ] 38*6777b538SAndroid Build Coastguard Worker deps = [ 39*6777b538SAndroid Build Coastguard Worker ":ui_strings_grd", 40*6777b538SAndroid Build Coastguard Worker ] 41*6777b538SAndroid Build Coastguard Worker} 42*6777b538SAndroid Build Coastguard Worker``` 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard WorkerThis will end up generating the following JSON file under 45*6777b538SAndroid Build Coastguard Worker`$CHROMIUM_OUTPUT_DIR/gen/ui/android/ui_java_resources.build_config.json`: 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker```json 48*6777b538SAndroid Build Coastguard Worker{ 49*6777b538SAndroid Build Coastguard Worker "deps_info": { 50*6777b538SAndroid Build Coastguard Worker "deps_configs": [ 51*6777b538SAndroid Build Coastguard Worker "gen/ui/android/ui_strings_grd.build_config.json" 52*6777b538SAndroid Build Coastguard Worker ], 53*6777b538SAndroid Build Coastguard Worker "name": "ui_java_resources.build_config.json", 54*6777b538SAndroid Build Coastguard Worker "package_name": "org.chromium.ui", 55*6777b538SAndroid Build Coastguard Worker "path": "gen/ui/android/ui_java_resources.build_config.json", 56*6777b538SAndroid Build Coastguard Worker "r_text": "gen/ui/android/ui_java_resources_R.txt", 57*6777b538SAndroid Build Coastguard Worker "resources_dirs": [ 58*6777b538SAndroid Build Coastguard Worker "../../ui/android/java/res" 59*6777b538SAndroid Build Coastguard Worker ], 60*6777b538SAndroid Build Coastguard Worker "resources_zip": "resource_zips/ui/android/ui_java_resources.resources.zip", 61*6777b538SAndroid Build Coastguard Worker "srcjar": "gen/ui/android/ui_java_resources.srcjar", 62*6777b538SAndroid Build Coastguard Worker "type": "android_resources" 63*6777b538SAndroid Build Coastguard Worker }, 64*6777b538SAndroid Build Coastguard Worker "gradle": {}, 65*6777b538SAndroid Build Coastguard Worker "resources": { 66*6777b538SAndroid Build Coastguard Worker "dependency_zips": [ 67*6777b538SAndroid Build Coastguard Worker "resource_zips/ui/android/ui_strings_grd.resources.zip" 68*6777b538SAndroid Build Coastguard Worker ], 69*6777b538SAndroid Build Coastguard Worker "extra_package_names": [], 70*6777b538SAndroid Build Coastguard Worker } 71*6777b538SAndroid Build Coastguard Worker} 72*6777b538SAndroid Build Coastguard Worker``` 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard WorkerNOTE: All path values in `.build_config.json` files are relative to your 75*6777b538SAndroid Build Coastguard Worker`$CHROMIUM_OUTPUT_DIR`. 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker# II. Generation of .build_config.json files: 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard WorkerThey are generated by the GN [`write_build_config()`](gn_write_build_config) 80*6777b538SAndroid Build Coastguard Workerinternal template, which ends up invoking 81*6777b538SAndroid Build Coastguard Worker[`write_build_config.py`](write_build_config_py). For our example above, this 82*6777b538SAndroid Build Coastguard Workeris with the following parameters: 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker``` 85*6777b538SAndroid Build Coastguard Workerpython ../../build/android/gyp/write_build_config.py \ 86*6777b538SAndroid Build Coastguard Worker --type=android_resources \ 87*6777b538SAndroid Build Coastguard Worker --depfile gen/ui/android/ui_java_resources__build_config_crbug_908819.d \ 88*6777b538SAndroid Build Coastguard Worker --deps-configs=\[\"gen/ui/android/ui_strings_grd.build_config.json\"\] \ 89*6777b538SAndroid Build Coastguard Worker --build-config gen/ui/android/ui_java_resources.build_config.json \ 90*6777b538SAndroid Build Coastguard Worker --resources-zip resource_zips/ui/android/ui_java_resources.resources.zip \ 91*6777b538SAndroid Build Coastguard Worker --package-name org.chromium.ui \ 92*6777b538SAndroid Build Coastguard Worker --r-text gen/ui/android/ui_java_resources_R.txt \ 93*6777b538SAndroid Build Coastguard Worker --resource-dirs=\[\"../../ui/android/java/res\"\] \ 94*6777b538SAndroid Build Coastguard Worker --srcjar gen/ui/android/ui_java_resources.srcjar 95*6777b538SAndroid Build Coastguard Worker``` 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard WorkerNote that *most* of the content of the JSON file comes from command-line 98*6777b538SAndroid Build Coastguard Workerparameters, but not all of it. 99*6777b538SAndroid Build Coastguard Worker 100*6777b538SAndroid Build Coastguard WorkerIn particular, the `resources['dependency_zips']` entry was computed by 101*6777b538SAndroid Build Coastguard Workerinspecting the content of all dependencies (here, only 102*6777b538SAndroid Build Coastguard Worker`ui_string_grd.build_config.json`), and collecting their 103*6777b538SAndroid Build Coastguard Worker`deps_configs['resources_zip']` values. 104*6777b538SAndroid Build Coastguard Worker 105*6777b538SAndroid Build Coastguard WorkerBecause a target's `.build_config.json` file will always be generated after 106*6777b538SAndroid Build Coastguard Workerthat of all of its dependencies, 107*6777b538SAndroid Build Coastguard Worker[`write_build_config.py`](write_build_config_py) can traverse the 108*6777b538SAndroid Build Coastguard Workerwhole (transitive) set of direct *and* indirect dependencies for a given target 109*6777b538SAndroid Build Coastguard Workerand extract useful information out of it. 110*6777b538SAndroid Build Coastguard Worker 111*6777b538SAndroid Build Coastguard WorkerThis is the kind of processing that cannot be done at the GN language level, 112*6777b538SAndroid Build Coastguard Workerand is very powerful for Android builds. 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Worker 115*6777b538SAndroid Build Coastguard Worker# III. Usage of .build_config.json files: 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard WorkerIn addition to being parsed by `write_build_config.py`, when they are listed 118*6777b538SAndroid Build Coastguard Workerin the `--deps-configs` of a given target, the `.build_config.json` files are used 119*6777b538SAndroid Build Coastguard Workerby other scripts under [build/android/gyp/] to build stuff. 120*6777b538SAndroid Build Coastguard Worker 121*6777b538SAndroid Build Coastguard WorkerFor example, the GN `android_resources` template uses it to invoke the 122*6777b538SAndroid Build Coastguard Worker[`process_resources.py`] script with the following command, in order to 123*6777b538SAndroid Build Coastguard Workergenerate various related files (e.g. `ui_java_resources_R.txt`): 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker```sh 126*6777b538SAndroid Build Coastguard Workerpython ../../build/android/gyp/process_resources.py \ 127*6777b538SAndroid Build Coastguard Worker --depfile gen/ui/android/ui_java_resources_1.d \ 128*6777b538SAndroid Build Coastguard Worker --android-sdk-jar ../../third_party/android_sdk/public/platforms/android-29/android.jar \ 129*6777b538SAndroid Build Coastguard Worker --aapt-path ../../third_party/android_sdk/public/build-tools/29.0.2/aapt \ 130*6777b538SAndroid Build Coastguard Worker --dependencies-res-zips=@FileArg\(gen/ui/android/ui_java_resources.build_config.json:resources:dependency_zips\) \ 131*6777b538SAndroid Build Coastguard Worker --extra-res-packages=@FileArg\(gen/ui/android/ui_java_resources.build_config.json:resources:extra_package_names\) \ 132*6777b538SAndroid Build Coastguard Worker --resource-dirs=\[\"../../ui/android/java/res\"\] \ 133*6777b538SAndroid Build Coastguard Worker --debuggable \ 134*6777b538SAndroid Build Coastguard Worker --resource-zip-out resource_zips/ui/android/ui_java_resources.resources.zip \ 135*6777b538SAndroid Build Coastguard Worker --r-text-out gen/ui/android/ui_java_resources_R.txt \ 136*6777b538SAndroid Build Coastguard Worker --srcjar-out gen/ui/android/ui_java_resources.srcjar \ 137*6777b538SAndroid Build Coastguard Worker --non-constant-id \ 138*6777b538SAndroid Build Coastguard Worker --custom-package org.chromium.ui \ 139*6777b538SAndroid Build Coastguard Worker --shared-resources 140*6777b538SAndroid Build Coastguard Worker``` 141*6777b538SAndroid Build Coastguard Worker 142*6777b538SAndroid Build Coastguard WorkerNote the use of `@FileArg()` references here, to tell the script where to find 143*6777b538SAndroid Build Coastguard Workerthe information it needs. 144*6777b538SAndroid Build Coastguard Worker 145*6777b538SAndroid Build Coastguard Worker 146*6777b538SAndroid Build Coastguard Worker# IV. Format of .build_config.json files: 147*6777b538SAndroid Build Coastguard Worker 148*6777b538SAndroid Build Coastguard WorkerThanks to `@FileArg()` references, Python build scripts under 149*6777b538SAndroid Build Coastguard Worker[`build/android/gyp/`](build/android/gyp/) do not need to know anything 150*6777b538SAndroid Build Coastguard Workerabout the internal format of `.build_config.json` files. 151*6777b538SAndroid Build Coastguard Worker 152*6777b538SAndroid Build Coastguard WorkerThis format is decided between internal GN build rules and 153*6777b538SAndroid Build Coastguard Worker[`write_build_config.py`][write_build_config_py]. Since these changes rather 154*6777b538SAndroid Build Coastguard Workeroften, the format documentation is kept inside the Python script itself, but 155*6777b538SAndroid Build Coastguard Workercan be extracted as a Markdown file and visualized with the following commands: 156*6777b538SAndroid Build Coastguard Worker 157*6777b538SAndroid Build Coastguard Worker```sh 158*6777b538SAndroid Build Coastguard Worker# Extract .build_config.json format documentation 159*6777b538SAndroid Build Coastguard Workerbuild/android/gyp/write_build_config.py \ 160*6777b538SAndroid Build Coastguard Worker --generate-markdown-format-doc > /tmp/format.md 161*6777b538SAndroid Build Coastguard Worker 162*6777b538SAndroid Build Coastguard Worker# Launch a browser to visualize the format documentation. 163*6777b538SAndroid Build Coastguard Workerpython tools/md_browser/md_browser.py -d /tmp /tmp/format.md 164*6777b538SAndroid Build Coastguard Worker``` 165*6777b538SAndroid Build Coastguard Worker 166*6777b538SAndroid Build Coastguard Worker[build/android/gyp/]: https://chromium.googlesource.com/chromium/src/build/+/main/android/gyp/ 167*6777b538SAndroid Build Coastguard Worker[gn_write_build_config]: https://cs.chromium.org/chromium/src/build/config/android/internal_rules.gni?q=write_build_config&sq=package:chromium 168*6777b538SAndroid Build Coastguard Worker[write_build_config_py]: https://chromium.googlesource.com/chromium/src/build/+/main/android/gyp/write_build_config.py 169