xref: /aosp_15_r20/external/cronet/build/android/docs/build_config.md (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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