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