From c004862309a2856021a364aa93d4c0ef18a9f755 Mon Sep 17 00:00:00 2001 From: Martin Stjernholm Date: Tue, 18 Aug 2020 17:37:41 +0100 Subject: [PATCH] Resolve prebuilt module explicitly for dex2oat tool dependencies. Test: m nothing Bug: 145934348 Change-Id: If27984be26976a3abe8cb5e21cf174d5e71beb8a --- dexpreopt/config.go | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/dexpreopt/config.go b/dexpreopt/config.go index 064d9d9c5..2d127bc07 100644 --- a/dexpreopt/config.go +++ b/dexpreopt/config.go @@ -403,7 +403,33 @@ func RegisterToolDeps(ctx android.BottomUpMutatorContext) { func dex2oatPathFromDep(ctx android.ModuleContext) android.Path { dex2oatBin := dex2oatModuleName(ctx.Config()) - dex2oatModule := ctx.GetDirectDepWithTag(dex2oatBin, dex2oatDepTag) + // Find the right dex2oat module, trying to follow PrebuiltDepTag from source + // to prebuilt if there is one. We wouldn't have to do this if the + // prebuilt_postdeps mutator that replaces source deps with prebuilt deps was + // run after RegisterToolDeps above, but changing that leads to ordering + // problems between mutators (RegisterToolDeps needs to run late to act on + // final variants, while prebuilt_postdeps needs to run before many of the + // PostDeps mutators, like the APEX mutators). Hence we need to dig out the + // prebuilt explicitly here instead. + var dex2oatModule android.Module + ctx.WalkDeps(func(child, parent android.Module) bool { + if parent == ctx.Module() && ctx.OtherModuleDependencyTag(child) == dex2oatDepTag { + // Found the source module, or prebuilt module that has replaced the source. + dex2oatModule = child + if p, ok := child.(android.PrebuiltInterface); ok && p.Prebuilt() != nil { + return false // If it's the prebuilt we're done. + } else { + return true // Recurse to check if the source has a prebuilt dependency. + } + } + if parent == dex2oatModule && ctx.OtherModuleDependencyTag(child) == android.PrebuiltDepTag { + if p, ok := child.(android.PrebuiltInterface); ok && p.Prebuilt() != nil && p.Prebuilt().UsePrebuilt() { + dex2oatModule = child // Found a prebuilt that should be used. + } + } + return false + }) + if dex2oatModule == nil { // If this happens there's probably a missing call to AddToolDeps in DepsMutator. panic(fmt.Sprintf("Failed to lookup %s dependency", dex2oatBin))