Reland: Get the dex2oat host tool path from module dependency on the

binary module.

This uses the Once cache for GlobalSoongConfig to propagate the dex2oat
path from a module dependency to the singletons (both the one that
writes out dexpreopt_soong.config and the one that creates the
dexpreopted boot images). Unless dexpreopting is disabled altogether
through DisablePreopt in dexpreopt.config, that means:

- We must ensure at least one module registers a dex2oat tool
  dependency and resolves a GlobalSoongConfig using it, or else the
  singletons fail. That means we litter dex2oat dependencies in java
  modules even when they won't get dexpreopted and hence don't really
  need them.

- We still assume there's at least one java_library or android_app in
  the build.

This relands https://r.android.com/1205730 without changes - the
necessary fixes are in the child CLs.

Bug: 145934348
Test: m
  (check that out/soong/dexpreopt_soong.config points to dex2oatd64)
Test: env USE_DEX2OAT_DEBUG=false m
  (check that out/soong/dexpreopt_soong.config points to dex2oat64)
Test: env OUT_DIR=out-tools prebuilts/build-tools/build-prebuilts.sh
  on the aosp-build-tools branch
Change-Id: I66661711b317d1e4ec434861982919bdde19b575
This commit is contained in:
Martin Stjernholm
2020-01-11 00:37:30 +00:00
parent 40f9f3c061
commit d90676fdde
6 changed files with 164 additions and 10 deletions

View File

@@ -76,6 +76,8 @@ func RegisterJavaBuildComponents(ctx android.RegistrationContext) {
ctx.RegisterModuleType("java_host_for_device", HostForDeviceFactory)
ctx.RegisterModuleType("dex_import", DexImportFactory)
ctx.FinalDepsMutators(dexpreopt.RegisterToolDepsMutator)
ctx.RegisterSingletonType("logtags", LogtagsSingleton)
ctx.RegisterSingletonType("kythe_java_extract", kytheExtractJavaFactory)
}
@@ -369,6 +371,7 @@ type Module struct {
android.DefaultableModuleBase
android.ApexModuleBase
android.SdkBase
dexpreopt.DexPreoptModule
properties CompilerProperties
protoProperties android.ProtoProperties
@@ -1574,6 +1577,16 @@ func (j *Module) compile(ctx android.ModuleContext, aaptSrcJar android.Path) {
}
} else {
outputFile = implementationAndResourcesJar
// dexpreopt.GetGlobalSoongConfig needs to be called at least once even if
// no module actually is dexpreopted, to ensure there's a cached
// GlobalSoongConfig for the dexpreopt singletons, which will run
// regardless.
// TODO(b/147613152): Remove when the singletons no longer rely on the
// cached GlobalSoongConfig.
if !dexpreopt.GetGlobalConfig(ctx).DisablePreopt {
_ = dexpreopt.GetGlobalSoongConfig(ctx)
}
}
ctx.CheckbuildFile(outputFile)
@@ -2340,6 +2353,7 @@ type Import struct {
android.ApexModuleBase
prebuilt android.Prebuilt
android.SdkBase
dexpreopt.DexPreoptModule
properties ImportProperties
@@ -2550,6 +2564,7 @@ type DexImport struct {
android.DefaultableModuleBase
android.ApexModuleBase
prebuilt android.Prebuilt
dexpreopt.DexPreoptModule
properties DexImportProperties