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