xref: /aosp_15_r20/build/soong/dexpreopt/DEXPREOPT_IMPLEMENTATION.md (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker## Dexpreopt implementation
2*333d2b36SAndroid Build Coastguard Worker
3*333d2b36SAndroid Build Coastguard Worker### Introduction
4*333d2b36SAndroid Build Coastguard Worker
5*333d2b36SAndroid Build Coastguard WorkerAll dexpreopted Java code falls into three categories:
6*333d2b36SAndroid Build Coastguard Worker
7*333d2b36SAndroid Build Coastguard Worker- bootclasspath
8*333d2b36SAndroid Build Coastguard Worker- system server
9*333d2b36SAndroid Build Coastguard Worker- apps and libraries
10*333d2b36SAndroid Build Coastguard Worker
11*333d2b36SAndroid Build Coastguard WorkerDexpreopt implementation for bootclasspath libraries (boot images) is located in
12*333d2b36SAndroid Build Coastguard Worker[soong/java] (see e.g. [soong/java/dexpreopt_bootjars.go]), and install rules
13*333d2b36SAndroid Build Coastguard Workerare in [make/core/dex_preopt.mk].
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard WorkerDexpreopt implementation for system server, libraries and apps is located in
16*333d2b36SAndroid Build Coastguard Worker[soong/dexpreopt]. For the rest of this section we focus primarily on it (and
17*333d2b36SAndroid Build Coastguard Workernot boot images).
18*333d2b36SAndroid Build Coastguard Worker
19*333d2b36SAndroid Build Coastguard WorkerDexpeopt implementation is split across the Soong part and the Make part. The
20*333d2b36SAndroid Build Coastguard Workercore logic is in Soong, and Make only generates configs and scripts to pass
21*333d2b36SAndroid Build Coastguard Workerinformation to Soong.
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Worker### Global and module dexpreopt.config
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard WorkerThe build system generates a global JSON dexpreopt config that is populated from
26*333d2b36SAndroid Build Coastguard Workerproduct variables. This is static configuration that is passed to both Soong and
27*333d2b36SAndroid Build Coastguard WorkerMake. The `$OUT/soong/dexpreopt.config` file is generated in
28*333d2b36SAndroid Build Coastguard Worker[make/core/dex_preopt_config.mk]. Soong reads it in [soong/dexpreopt/config.go]
29*333d2b36SAndroid Build Coastguard Workerand makes a device-specific copy (this is needed to ensure incremental build
30*333d2b36SAndroid Build Coastguard Workercorrectness). The global config contains lists of bootclasspath jars, system
31*333d2b36SAndroid Build Coastguard Workerserver jars, dex2oat options, global switches that enable and disable parts of
32*333d2b36SAndroid Build Coastguard Workerdexpreopt and so on.
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard WorkerThe build system also generates a module config for each dexpreopted package. It
35*333d2b36SAndroid Build Coastguard Workercontains package-specific configuration that is derived from the global
36*333d2b36SAndroid Build Coastguard Workerconfiguration and Android.bp or Android.mk module for the package.
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard WorkerModule configs for Make packages are generated in
39*333d2b36SAndroid Build Coastguard Worker[make/core/dex_preopt_odex_install.mk]; they are materialized as per-package
40*333d2b36SAndroid Build Coastguard WorkerJSON dexpreopt.config files.
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard WorkerModule configs in Soong are not materialized as dexpreopt.config files and exist
43*333d2b36SAndroid Build Coastguard Workeras Go structures in memory, unless it is necessary to materialize them as a file
44*333d2b36SAndroid Build Coastguard Workerfor dependent Make packages or for post-dexpreopting. Module configs are defined
45*333d2b36SAndroid Build Coastguard Workerin [soong/dexpreopt/config.go].
46*333d2b36SAndroid Build Coastguard Worker
47*333d2b36SAndroid Build Coastguard Worker### Dexpreopt in Soong
48*333d2b36SAndroid Build Coastguard Worker
49*333d2b36SAndroid Build Coastguard WorkerThe Soong implementation of dexpreopt consists roughly of the following steps:
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Worker- Read global dexpreopt config passed from Make ([soong/dexpreopt/config.go]).
52*333d2b36SAndroid Build Coastguard Worker
53*333d2b36SAndroid Build Coastguard Worker- Construct a static boot image config ([soong/java/dexpreopt_config.go]).
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Worker- During dependency mutator pass, for each suitable module:
56*333d2b36SAndroid Build Coastguard Worker    - add uses-library dependencies (e.g. for apps: [soong/java/app.go:deps])
57*333d2b36SAndroid Build Coastguard Worker
58*333d2b36SAndroid Build Coastguard Worker- During rule generation pass, for each suitable module:
59*333d2b36SAndroid Build Coastguard Worker    - compute transitive uses-library dependency closure
60*333d2b36SAndroid Build Coastguard Worker      ([soong/java/java.go:addCLCFromDep])
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Worker    - construct CLC from the dependency closure
63*333d2b36SAndroid Build Coastguard Worker      ([soong/dexpreopt/class_loader_context.go])
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Worker    - construct module config with CLC, boot image locations, etc.
66*333d2b36SAndroid Build Coastguard Worker      ([soong/java/dexpreopt.go])
67*333d2b36SAndroid Build Coastguard Worker
68*333d2b36SAndroid Build Coastguard Worker    - generate build rules to verify build-time CLC against the manifest (e.g.
69*333d2b36SAndroid Build Coastguard Worker      for apps: [soong/java/app.go:verifyUsesLibraries])
70*333d2b36SAndroid Build Coastguard Worker
71*333d2b36SAndroid Build Coastguard Worker    - generate dexpreopt build rule ([soong/dexpreopt/dexpreopt.go])
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Worker- At the end of rule generation pass:
74*333d2b36SAndroid Build Coastguard Worker    - generate build rules for boot images ([soong/java/dexpreopt_bootjars.go],
75*333d2b36SAndroid Build Coastguard Worker      [soong/java/bootclasspath_fragment.go] and
76*333d2b36SAndroid Build Coastguard Worker      [soong/java/platform_bootclasspath.go])
77*333d2b36SAndroid Build Coastguard Worker
78*333d2b36SAndroid Build Coastguard Worker### Dexpreopt in Make - dexpreopt_gen
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard WorkerIn order to reuse the same dexpreopt implementation for both Soong and Make
81*333d2b36SAndroid Build Coastguard Workerpackages, part of Soong is compiled into a standalone binary dexpreopt_gen. It
82*333d2b36SAndroid Build Coastguard Workerruns during the Ninja stage of the build and generates shell scripts with
83*333d2b36SAndroid Build Coastguard Workerdexpreopt build rules for Make packages, and then executes them.
84*333d2b36SAndroid Build Coastguard Worker
85*333d2b36SAndroid Build Coastguard WorkerThis setup causes many inconveniences. To name a few:
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker- Errors in the build rules are only revealed at the late stage of the build.
88*333d2b36SAndroid Build Coastguard Worker
89*333d2b36SAndroid Build Coastguard Worker- These rules are not tested by the presubmit builds that run `m nothing` on
90*333d2b36SAndroid Build Coastguard Worker  many build targets/products.
91*333d2b36SAndroid Build Coastguard Worker
92*333d2b36SAndroid Build Coastguard Worker- It is impossible to find dexpreopt build rules in the generated Ninja files.
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard WorkerHowever all these issues are a lesser evil compared to having a duplicate
95*333d2b36SAndroid Build Coastguard Workerdexpreopt implementation in Make. Also note that it would be problematic to
96*333d2b36SAndroid Build Coastguard Workerreimplement the logic in Make anyway, because Android.mk modules are not
97*333d2b36SAndroid Build Coastguard Workerprocessed in the order of uses-library dependencies and propagating dependency
98*333d2b36SAndroid Build Coastguard Workerinformation from one module to another would require a similar workaround with
99*333d2b36SAndroid Build Coastguard Workera script.
100*333d2b36SAndroid Build Coastguard Worker
101*333d2b36SAndroid Build Coastguard WorkerDexpreopt for Make packages involves a few steps:
102*333d2b36SAndroid Build Coastguard Worker
103*333d2b36SAndroid Build Coastguard Worker- At Soong phase (during `m nothing`), see dexpreopt_gen:
104*333d2b36SAndroid Build Coastguard Worker    - generate build rules for dexpreopt_gen binary
105*333d2b36SAndroid Build Coastguard Worker
106*333d2b36SAndroid Build Coastguard Worker- At Make/Kati phase (during `m nothing`), see
107*333d2b36SAndroid Build Coastguard Worker  [make/core/dex_preopt_odex_install.mk]:
108*333d2b36SAndroid Build Coastguard Worker    - generate build rules for module dexpreopt.config
109*333d2b36SAndroid Build Coastguard Worker
110*333d2b36SAndroid Build Coastguard Worker    - generate build rules for merging dependency dexpreopt.config files (see
111*333d2b36SAndroid Build Coastguard Worker      [make/core/dex_preopt_config_merger.py])
112*333d2b36SAndroid Build Coastguard Worker
113*333d2b36SAndroid Build Coastguard Worker    - generate build rules for dexpreopt_gen invocation
114*333d2b36SAndroid Build Coastguard Worker
115*333d2b36SAndroid Build Coastguard Worker    - generate build rules for executing dexpreopt.sh scripts
116*333d2b36SAndroid Build Coastguard Worker
117*333d2b36SAndroid Build Coastguard Worker- At Ninja phase (during `m`):
118*333d2b36SAndroid Build Coastguard Worker    - generate dexpreopt.config files
119*333d2b36SAndroid Build Coastguard Worker
120*333d2b36SAndroid Build Coastguard Worker    - execute dexpreopt_gen rules (generate dexpreopt.sh scripts)
121*333d2b36SAndroid Build Coastguard Worker
122*333d2b36SAndroid Build Coastguard Worker    - execute dexpreopt.sh scripts (this runs the actual dexpreopt)
123*333d2b36SAndroid Build Coastguard Worker
124*333d2b36SAndroid Build Coastguard WorkerThe Make/Kati phase adds all the necessary dependencies that trigger
125*333d2b36SAndroid Build Coastguard Workerdexpreopt_gen and dexpreopt.sh rules. The real dexpreopt command (dex2oat
126*333d2b36SAndroid Build Coastguard Workerinvocation that will be executed to AOT-compile a package) is in the
127*333d2b36SAndroid Build Coastguard Workerdexpreopt.sh script, which is generated close to the end of the build.
128*333d2b36SAndroid Build Coastguard Worker
129*333d2b36SAndroid Build Coastguard Worker### Indirect build rules
130*333d2b36SAndroid Build Coastguard Worker
131*333d2b36SAndroid Build Coastguard WorkerThe process described above for Make packages involves "indirect build rules",
132*333d2b36SAndroid Build Coastguard Workeri.e. build rules that are generated not at the time when the build system is
133*333d2b36SAndroid Build Coastguard Workercreated (which is a small step at the very beginning of the build triggered with
134*333d2b36SAndroid Build Coastguard Worker`m nothing`), but at the time when the actual build is done (`m` phase).
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard WorkerSome build systems, such as Make, allow modifications of the build graph during
137*333d2b36SAndroid Build Coastguard Workerthe build. Other build systems, such as Soong, have a clear separation into the
138*333d2b36SAndroid Build Coastguard Workerfirst "generation phase" (this is when build rules are created) and the second
139*333d2b36SAndroid Build Coastguard Worker"build phase" (this is when the build rules are executed), and they do not allow
140*333d2b36SAndroid Build Coastguard Workermodifications of the dependency graph during the second phase. The Soong
141*333d2b36SAndroid Build Coastguard Workerapproach is better from performance standpoint, because with the Make approach
142*333d2b36SAndroid Build Coastguard Workerthere are no guarantees regarding the time of the build --- recursive build
143*333d2b36SAndroid Build Coastguard Workergraph modfications continue until fixpoint. However the Soong approach is also
144*333d2b36SAndroid Build Coastguard Workermore restictive, as it can only generate build rules from the information that
145*333d2b36SAndroid Build Coastguard Workeris passed to the build system via global configuration, Android.bp files or
146*333d2b36SAndroid Build Coastguard Workerencoded in the Go code. Any other information (such as the contents of the Java
147*333d2b36SAndroid Build Coastguard Workermanifest files) are not accessible and cannot be used to generate build rules.
148*333d2b36SAndroid Build Coastguard Worker
149*333d2b36SAndroid Build Coastguard WorkerHence the need for the "indirect build rules": during the generation phase only
150*333d2b36SAndroid Build Coastguard Workerstubs of the build rules are generated, and the real rules are generated by the
151*333d2b36SAndroid Build Coastguard Workerstub rules during the build phase (and executed immediately). Note that the
152*333d2b36SAndroid Build Coastguard Workerbuild system still has to add all the necessary dependencies during the
153*333d2b36SAndroid Build Coastguard Workergeneration phase, because it will not be possible to change build order during
154*333d2b36SAndroid Build Coastguard Workerthe build phase.
155*333d2b36SAndroid Build Coastguard Worker
156*333d2b36SAndroid Build Coastguard WorkerIndirect buils rules are used in a couple of places in dexpreopt:
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Worker- [soong/scripts/manifest_check.py]: first to extract targetSdkVersion from the
159*333d2b36SAndroid Build Coastguard Worker  manifest, and later to extract `<uses-library/>` tags from the manifest and
160*333d2b36SAndroid Build Coastguard Worker  compare them to the uses-library list known to the build system
161*333d2b36SAndroid Build Coastguard Worker
162*333d2b36SAndroid Build Coastguard Worker- [soong/scripts/construct_context.py]: to trim compatibility libraries in CLC
163*333d2b36SAndroid Build Coastguard Worker
164*333d2b36SAndroid Build Coastguard Worker- [make/core/dex_preopt_config_merger.py]: to merge information from
165*333d2b36SAndroid Build Coastguard Worker  dexpreopt.config files for uses-library dependencies into the dependent's
166*333d2b36SAndroid Build Coastguard Worker  dexpreopt.config file (mostly the CLC)
167*333d2b36SAndroid Build Coastguard Worker
168*333d2b36SAndroid Build Coastguard Worker- autogenerated dexpreopt.sh scripts: to call dexpreopt_gen
169*333d2b36SAndroid Build Coastguard Worker
170*333d2b36SAndroid Build Coastguard Worker### Consistency check - manifest_check.py
171*333d2b36SAndroid Build Coastguard Worker
172*333d2b36SAndroid Build Coastguard WorkerBecause the information from the manifests has to be duplicated in the
173*333d2b36SAndroid Build Coastguard WorkerAndroid.bp/Android.mk files, there is a danger that it may get out of sync. To
174*333d2b36SAndroid Build Coastguard Workerguard against that, the build system generates a rule that verifies
175*333d2b36SAndroid Build Coastguard Workeruses-libraries: checks the metadata in the build files against the contents of a
176*333d2b36SAndroid Build Coastguard Workermanifest. The manifest can be available as a source file, or as part of a
177*333d2b36SAndroid Build Coastguard Workerprebuilt APK.
178*333d2b36SAndroid Build Coastguard Worker
179*333d2b36SAndroid Build Coastguard WorkerThe check is implemented in [soong/scripts/manifest_check.py].
180*333d2b36SAndroid Build Coastguard Worker
181*333d2b36SAndroid Build Coastguard WorkerIt is possible to turn off the check globally for a product by setting
182*333d2b36SAndroid Build Coastguard Worker`PRODUCT_BROKEN_VERIFY_USES_LIBRARIES := true` in a product makefile, or for a
183*333d2b36SAndroid Build Coastguard Workerparticular build by setting `RELAX_USES_LIBRARY_CHECK=true`.
184*333d2b36SAndroid Build Coastguard Worker
185*333d2b36SAndroid Build Coastguard Worker### Compatibility libraries - construct_context.py
186*333d2b36SAndroid Build Coastguard Worker
187*333d2b36SAndroid Build Coastguard WorkerCompatibility libraries are libraries that didn’t exist prior to a certain SDK
188*333d2b36SAndroid Build Coastguard Workerversion (say, `N`), but classes in them were in the bootclasspath jars, etc.,
189*333d2b36SAndroid Build Coastguard Workerand in version `N` they have been separated into a standalone uses-library.
190*333d2b36SAndroid Build Coastguard WorkerCompatibility libraries should only be in the CLC of an app if its
191*333d2b36SAndroid Build Coastguard Worker`targetSdkVersion` in the manifest is less than `N`.
192*333d2b36SAndroid Build Coastguard Worker
193*333d2b36SAndroid Build Coastguard WorkerCurrently compatibility libraries only affect apps (but not other libraries).
194*333d2b36SAndroid Build Coastguard Worker
195*333d2b36SAndroid Build Coastguard WorkerThe build system cannot see `targetSdkVersion` of an app at the time it
196*333d2b36SAndroid Build Coastguard Workergenerates dexpreopt build rules, so it doesn't know whether to add compatibility
197*333d2b36SAndroid Build Coastguard Workerlibaries to CLC or not. As a workaround, the build system includes all
198*333d2b36SAndroid Build Coastguard Workercompatibility libraries regardless of the app version, and appends some extra
199*333d2b36SAndroid Build Coastguard Workerlogic to the dexpreopt rule that will extract `targetSdkVersion` from the
200*333d2b36SAndroid Build Coastguard Workermanifest and filter CLC based on that version during Ninja stage of the build,
201*333d2b36SAndroid Build Coastguard Workerimmediately before executing the dexpreopt command (see the
202*333d2b36SAndroid Build Coastguard Workersoong/scripts/construct_context.py script).
203*333d2b36SAndroid Build Coastguard Worker
204*333d2b36SAndroid Build Coastguard WorkerAs of the time of writing (January 2022), there are the following compatibility
205*333d2b36SAndroid Build Coastguard Workerlibraries:
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Worker- org.apache.http.legacy (SDK 28)
208*333d2b36SAndroid Build Coastguard Worker- android.hidl.base-V1.0-java (SDK 29)
209*333d2b36SAndroid Build Coastguard Worker- android.hidl.manager-V1.0-java (SDK 29)
210*333d2b36SAndroid Build Coastguard Worker- android.test.base (SDK 30)
211*333d2b36SAndroid Build Coastguard Worker- android.test.mock (SDK 30)
212*333d2b36SAndroid Build Coastguard Worker
213*333d2b36SAndroid Build Coastguard Worker### Manifest fixer
214*333d2b36SAndroid Build Coastguard Worker
215*333d2b36SAndroid Build Coastguard WorkerSometimes uses-library tags are missing from the source manifest of a
216*333d2b36SAndroid Build Coastguard Workerlibrary/app. This may happen for example if one of the transitive dependencies
217*333d2b36SAndroid Build Coastguard Workerof the library/app starts using another uses-library, and the library/app's
218*333d2b36SAndroid Build Coastguard Workermanifest isn't updated to include it.
219*333d2b36SAndroid Build Coastguard Worker
220*333d2b36SAndroid Build Coastguard WorkerSoong can compute some of the missing uses-library tags for a given library/app
221*333d2b36SAndroid Build Coastguard Workerautomatically as SDK libraries in the transitive dependency closure of the
222*333d2b36SAndroid Build Coastguard Workerlibrary/app. The closure is needed because a library/app may depend on a static
223*333d2b36SAndroid Build Coastguard Workerlibrary that may in turn depend on an SDK library (possibly transitively via
224*333d2b36SAndroid Build Coastguard Workeranother library).
225*333d2b36SAndroid Build Coastguard Worker
226*333d2b36SAndroid Build Coastguard WorkerNot all uses-library tags can be computed in this way, because some of the
227*333d2b36SAndroid Build Coastguard Workeruses-library dependencies are not SDK libraries, or they are not reachable via
228*333d2b36SAndroid Build Coastguard Workertransitive dependency closure. But when possible, allowing Soong to calculate
229*333d2b36SAndroid Build Coastguard Workerthe manifest entries is less prone to errors and simplifies maintenance. For
230*333d2b36SAndroid Build Coastguard Workerexample, consider a situation when many apps use some static library that adds a
231*333d2b36SAndroid Build Coastguard Workernew uses-library dependency -- all the apps will have to be updated. That is
232*333d2b36SAndroid Build Coastguard Workerdifficult to maintain.
233*333d2b36SAndroid Build Coastguard Worker
234*333d2b36SAndroid Build Coastguard WorkerThere is also a manifest merger, because sometimes the final manifest of an app
235*333d2b36SAndroid Build Coastguard Workeris merged from a few dependency manifests, so the final manifest installed on
236*333d2b36SAndroid Build Coastguard Workerdevices contains a superset of uses-library tags of the source manifest of the
237*333d2b36SAndroid Build Coastguard Workerapp.
238*333d2b36SAndroid Build Coastguard Worker
239*333d2b36SAndroid Build Coastguard Worker
240*333d2b36SAndroid Build Coastguard Worker[make/core/dex_preopt.mk]: https://cs.android.com/android/platform/superproject/+/main:build/make/core/dex_preopt.mk
241*333d2b36SAndroid Build Coastguard Worker[make/core/dex_preopt_config.mk]: https://cs.android.com/android/platform/superproject/+/main:build/make/core/dex_preopt_config.mk
242*333d2b36SAndroid Build Coastguard Worker[make/core/dex_preopt_config_merger.py]: https://cs.android.com/android/platform/superproject/+/main:build/make/core/dex_preopt_config_merger.py
243*333d2b36SAndroid Build Coastguard Worker[make/core/dex_preopt_odex_install.mk]: https://cs.android.com/android/platform/superproject/+/main:build/make/core/dex_preopt_odex_install.mk
244*333d2b36SAndroid Build Coastguard Worker[soong/dexpreopt]: https://cs.android.com/android/platform/superproject/+/main:build/soong/dexpreopt
245*333d2b36SAndroid Build Coastguard Worker[soong/dexpreopt/class_loader_context.go]: https://cs.android.com/android/platform/superproject/+/main:build/soong/dexpreopt/class_loader_context.go
246*333d2b36SAndroid Build Coastguard Worker[soong/dexpreopt/config.go]: https://cs.android.com/android/platform/superproject/+/main:build/soong/dexpreopt/config.go
247*333d2b36SAndroid Build Coastguard Worker[soong/dexpreopt/dexpreopt.go]: https://cs.android.com/android/platform/superproject/+/main:build/soong/dexpreopt/dexpreopt.go
248*333d2b36SAndroid Build Coastguard Worker[soong/java]: https://cs.android.com/android/platform/superproject/+/main:build/soong/java
249*333d2b36SAndroid Build Coastguard Worker[soong/java/app.go:deps]: https://cs.android.com/android/platform/superproject/+/main:build/soong/java/app.go?q=%22func%20\(u%20*usesLibrary\)%20deps%22
250*333d2b36SAndroid Build Coastguard Worker[soong/java/app.go:verifyUsesLibraries]: https://cs.android.com/android/platform/superproject/+/main:build/soong/java/app.go?q=%22func%20\(u%20*usesLibrary\)%20verifyUsesLibraries%22
251*333d2b36SAndroid Build Coastguard Worker[soong/java/bootclasspath_fragment.go]: https://cs.android.com/android/platform/superproject/+/main:build/soong/java/bootclasspath_fragment.go
252*333d2b36SAndroid Build Coastguard Worker[soong/java/dexpreopt.go]: https://cs.android.com/android/platform/superproject/+/main:build/soong/java/dexpreopt.go
253*333d2b36SAndroid Build Coastguard Worker[soong/java/dexpreopt_bootjars.go]: https://cs.android.com/android/platform/superproject/+/main:build/soong/java/dexpreopt_bootjars.go
254*333d2b36SAndroid Build Coastguard Worker[soong/java/dexpreopt_config.go]: https://cs.android.com/android/platform/superproject/+/main:build/soong/java/dexpreopt_config.go
255*333d2b36SAndroid Build Coastguard Worker[soong/java/java.go:addCLCFromDep]: https://cs.android.com/android/platform/superproject/+/main:build/soong/java/java.go?q=%22func%20addCLCfromDep%22
256*333d2b36SAndroid Build Coastguard Worker[soong/java/platform_bootclasspath.go]: https://cs.android.com/android/platform/superproject/+/main:build/soong/java/platform_bootclasspath.go
257*333d2b36SAndroid Build Coastguard Worker[soong/scripts/construct_context.py]: https://cs.android.com/android/platform/superproject/+/main:build/soong/scripts/construct_context.py
258*333d2b36SAndroid Build Coastguard Worker[soong/scripts/manifest_check.py]: https://cs.android.com/android/platform/superproject/+/main:build/soong/scripts/manifest_check.py
259