From ff694a8c88c632559c72653edf99f21c3d761dee Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Wed, 13 Dec 2023 15:54:49 -0800 Subject: [PATCH] Convert Provider to generic providers API Convert all of the callers of Provider/HasProvider to use the type-safe android.ModuleProvider API. Bug: 316410648 Test: builds Change-Id: I73479de1625fa2865b6c73444cd477e50d56dc5a --- android/deapexer.go | 2 +- android/module.go | 2 +- apex/apex.go | 4 ++-- cc/cc.go | 14 ++++++++------ cc/sabi.go | 4 ++-- cc/sanitize.go | 4 ++-- java/aar.go | 6 ++++-- java/app.go | 9 ++++----- java/app_import.go | 2 +- java/base.go | 4 ++-- java/bootclasspath_fragment.go | 2 +- java/dexpreopt.go | 4 ++-- java/java.go | 11 ++++++----- java/sdk_library.go | 9 +++++---- rust/rust.go | 9 +++++---- rust/sanitize.go | 2 +- 16 files changed, 47 insertions(+), 41 deletions(-) diff --git a/android/deapexer.go b/android/deapexer.go index a674b424e..e5dd27785 100644 --- a/android/deapexer.go +++ b/android/deapexer.go @@ -167,7 +167,7 @@ func FindDeapexerProviderForModule(ctx ModuleContext) *DeapexerInfo { if di != nil { return di } - ai := ctx.Provider(ApexInfoProvider).(ApexInfo) + ai, _ := ModuleProvider(ctx, ApexInfoProvider) ctx.ModuleErrorf("No prebuilt APEX provides a deapexer module for APEX variant %s", ai.ApexVariationName) return nil } diff --git a/android/module.go b/android/module.go index f57115799..7e88797d6 100644 --- a/android/module.go +++ b/android/module.go @@ -1648,7 +1648,7 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) if !ctx.PrimaryArch() { suffix = append(suffix, ctx.Arch().ArchType.String()) } - if apexInfo := ctx.Provider(ApexInfoProvider).(ApexInfo); !apexInfo.IsForPlatform() { + if apexInfo, _ := ModuleProvider(ctx, ApexInfoProvider); !apexInfo.IsForPlatform() { suffix = append(suffix, apexInfo.ApexVariationName) } diff --git a/apex/apex.go b/apex/apex.go index 9dac5ce7e..3c96ce010 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -2150,7 +2150,7 @@ func (a *apexBundle) depVisitor(vctx *visitorContext, ctx android.ModuleContext, af := apexFileForNativeLibrary(ctx, ch, vctx.handleSpecialLibs) af.transitiveDep = true - abInfo := ctx.Provider(ApexBundleInfoProvider).(ApexBundleInfo) + abInfo, _ := android.ModuleProvider(ctx, ApexBundleInfoProvider) if !abInfo.Contents.DirectlyInApex(depName) && (ch.IsStubs() || ch.HasStubsVariants()) { // If the dependency is a stubs lib, don't include it in this APEX, // but make sure that the lib is installed on the device. @@ -2589,7 +2589,7 @@ func (a *apexBundle) checkStaticLinkingToStubLibraries(ctx android.ModuleContext return } - abInfo := ctx.Provider(ApexBundleInfoProvider).(ApexBundleInfo) + abInfo, _ := android.ModuleProvider(ctx, ApexBundleInfoProvider) a.WalkPayloadDeps(ctx, func(ctx android.ModuleContext, from blueprint.Module, to android.ApexModule, externalDep bool) bool { if ccm, ok := to.(*cc.Module); ok { diff --git a/cc/cc.go b/cc/cc.go index fca56026a..c61773a35 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -1744,11 +1744,13 @@ func (ctx *moduleContextImpl) getVndkExtendsModuleName() string { } func (ctx *moduleContextImpl) isForPlatform() bool { - return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform() + apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider) + return apexInfo.IsForPlatform() } func (ctx *moduleContextImpl) apexVariationName() string { - return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName + apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider) + return apexInfo.ApexVariationName } func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel { @@ -1991,7 +1993,7 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { } c.Properties.SubName = GetSubnameProperty(actx, c) - apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider) if !apexInfo.IsForPlatform() { c.hideApexVariantFromMake = true } @@ -2982,7 +2984,7 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...) } - apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo) skipModuleList := map[string]bool{} @@ -3402,7 +3404,7 @@ func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool { bootstrap = linkable.Bootstrap() } - apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) useStubs := false @@ -3436,7 +3438,7 @@ func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool { // Another exception: if this module is a test for an APEX, then // it is linked with the non-stub variant of a module in the APEX // as if this is part of the APEX. - testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo) + testFor, _ := android.ModuleProvider(ctx, android.ApexTestForInfoProvider) for _, apexContents := range testFor.ApexContents { if apexContents.DirectlyInApex(depName) { useStubs = false diff --git a/cc/sabi.go b/cc/sabi.go index 4cd776a25..13106859f 100644 --- a/cc/sabi.go +++ b/cc/sabi.go @@ -194,8 +194,8 @@ func shouldCreateSourceAbiDumpForLibrary(ctx android.BaseModuleContext) bool { return false } - isPlatformVariant := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform() - if isPlatformVariant { + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) + if apexInfo.IsForPlatform() { // Bionic libraries that are installed to the bootstrap directory are not ABI checked. // Only the runtime APEX variants, which are the implementation libraries of bionic NDK stubs, // are checked. diff --git a/cc/sanitize.go b/cc/sanitize.go index 31c050018..52b5be9e6 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -1627,7 +1627,7 @@ func sanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) { addStaticDeps := func(dep string, hideSymbols bool) { // If we're using snapshots, redirect to snapshot whenever possible - snapshot := mctx.Provider(SnapshotInfoProvider).(SnapshotInfo) + snapshot, _ := android.ModuleProvider(mctx, SnapshotInfoProvider) if lib, ok := snapshot.StaticLibs[dep]; ok { dep = lib } @@ -1714,7 +1714,7 @@ func sanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) { addStaticDeps(runtimeSharedLibrary, true) } else if !c.static() && !c.Header() { // If we're using snapshots, redirect to snapshot whenever possible - snapshot := mctx.Provider(SnapshotInfoProvider).(SnapshotInfo) + snapshot, _ := android.ModuleProvider(mctx, SnapshotInfoProvider) if lib, ok := snapshot.SharedLibs[runtimeSharedLibrary]; ok { runtimeSharedLibrary = lib } diff --git a/java/aar.go b/java/aar.go index f7c8367d0..1a9da235d 100644 --- a/java/aar.go +++ b/java/aar.go @@ -805,7 +805,8 @@ func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) }, ) - a.hideApexVariantFromMake = !ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform() + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) + a.hideApexVariantFromMake = !apexInfo.IsForPlatform() a.stem = proptools.StringDefault(a.overridableDeviceProperties.Stem, ctx.ModuleName()) @@ -1106,7 +1107,8 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { a.sdkVersion = a.SdkVersion(ctx) a.minSdkVersion = a.MinSdkVersion(ctx) - a.hideApexVariantFromMake = !ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform() + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) + a.hideApexVariantFromMake = !apexInfo.IsForPlatform() aarName := ctx.ModuleName() + ".aar" a.aarPath = android.PathForModuleSrc(ctx, a.properties.Aars[0]) diff --git a/java/app.go b/java/app.go index ef43a85c4..622276076 100755 --- a/java/app.go +++ b/java/app.go @@ -411,7 +411,7 @@ func (a *AndroidApp) useEmbeddedNativeLibs(ctx android.ModuleContext) bool { ctx.PropertyErrorf("min_sdk_version", "invalid value %q: %s", a.MinSdkVersion(ctx), err) } - apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) return (minSdkVersion.FinalOrFutureInt() >= 23 && Bool(a.appProperties.Use_embedded_native_libs)) || !apexInfo.IsForPlatform() } @@ -436,7 +436,7 @@ func (a *AndroidApp) shouldUncompressDex(ctx android.ModuleContext) bool { } func (a *AndroidApp) shouldEmbedJnis(ctx android.BaseModuleContext) bool { - apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) return ctx.Config().UnbundledBuild() || Bool(a.appProperties.Use_embedded_native_libs) || !apexInfo.IsForPlatform() || a.appProperties.AlwaysPackageNativeLibs } @@ -745,7 +745,8 @@ func (a *AndroidApp) createPrivappAllowlist(ctx android.ModuleContext) android.P func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { var apkDeps android.Paths - if !ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform() { + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) + if !apexInfo.IsForPlatform() { a.hideApexVariantFromMake = true } @@ -890,8 +891,6 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { a.privAppAllowlist = android.OptionalPathForPath(allowlist) } - apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) - // Install the app package. shouldInstallAppPackage := (Bool(a.Module.properties.Installable) || ctx.Host()) && apexInfo.IsForPlatform() && !a.appProperties.PreventInstall if shouldInstallAppPackage { diff --git a/java/app_import.go b/java/app_import.go index c5d09fdf1..ff0f5fe2f 100644 --- a/java/app_import.go +++ b/java/app_import.go @@ -257,7 +257,7 @@ func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext ctx.ModuleErrorf("prebuilt_framework-res found. This used to have special handling in soong, but was removed due to prebuilt_framework-res no longer existing. This check is to ensure it doesn't come back without readding the special handling.") } - apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) if !apexInfo.IsForPlatform() { a.hideApexVariantFromMake = true } diff --git a/java/base.go b/java/base.go index 8838b0163..108b854ab 100644 --- a/java/base.go +++ b/java/base.go @@ -685,7 +685,7 @@ func (j *Module) shouldInstrumentInApex(ctx android.BaseModuleContext) bool { // Force enable the instrumentation for java code that is built for APEXes ... // except for the jacocoagent itself (because instrumenting jacocoagent using jacocoagent // doesn't make sense) or framework libraries (e.g. libraries found in the InstrumentFrameworkModules list) unless EMMA_INSTRUMENT_FRAMEWORK is true. - apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) isJacocoAgent := ctx.ModuleName() == "jacocoagent" if j.DirectlyInAnyApex() && !isJacocoAgent && !apexInfo.IsForPlatform() { if !inList(ctx.ModuleName(), config.InstrumentFrameworkModules) { @@ -1572,7 +1572,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath // Enable dex compilation for the APEX variants, unless it is disabled explicitly compileDex := j.dexProperties.Compile_dex - apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) if j.DirectlyInAnyApex() && !apexInfo.IsForPlatform() { if compileDex == nil { compileDex = proptools.BoolPtr(true) diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go index f0b468e60..46cebc3a2 100644 --- a/java/bootclasspath_fragment.go +++ b/java/bootclasspath_fragment.go @@ -512,7 +512,7 @@ func (b *BootclasspathFragmentModule) getProfileProviderApex(ctx android.BaseMod } // Bootclasspath fragment modules that are for the platform do not produce boot related files. - apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) for _, apex := range apexInfo.InApexVariants { if isProfileProviderApex(ctx, apex) { return apex diff --git a/java/dexpreopt.go b/java/dexpreopt.go index fe8c5fbac..0f69dc3a4 100644 --- a/java/dexpreopt.go +++ b/java/dexpreopt.go @@ -166,12 +166,12 @@ func init() { } func isApexVariant(ctx android.BaseModuleContext) bool { - apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) return !apexInfo.IsForPlatform() } func forPrebuiltApex(ctx android.BaseModuleContext) bool { - apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) return apexInfo.ForPrebuiltApex } diff --git a/java/java.go b/java/java.go index b3e281fd8..b472a221f 100644 --- a/java/java.go +++ b/java/java.go @@ -647,7 +647,7 @@ func (j *Library) PermittedPackagesForUpdatableBootJars() []string { func shouldUncompressDex(ctx android.ModuleContext, dexpreopter *dexpreopter) bool { // Store uncompressed (and aligned) any dex files from jars in APEXes. - if apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo); !apexInfo.IsForPlatform() { + if apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider); !apexInfo.IsForPlatform() { return true } @@ -695,7 +695,7 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) { writeCombinedProguardFlagsFile(ctx, combinedExportedProguardFlagFile, exportedProguardFlagsFiles) j.combinedExportedProguardFlagsFile = combinedExportedProguardFlagFile - apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) if !apexInfo.IsForPlatform() { j.hideApexVariantFromMake = true } @@ -2188,7 +2188,8 @@ func (j *Import) commonBuildActions(ctx android.ModuleContext) { j.sdkVersion = j.SdkVersion(ctx) j.minSdkVersion = j.MinSdkVersion(ctx) - if !ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform() { + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) + if !apexInfo.IsForPlatform() { j.hideApexVariantFromMake = true } @@ -2247,7 +2248,7 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { if ctx.Device() { // If this is a variant created for a prebuilt_apex then use the dex implementation jar // obtained from the associated deapexer module. - ai := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + ai, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) if ai.ForPrebuiltApex { // Get the path of the dex implementation jar from the `deapexer` module. di := android.FindDeapexerProviderForModule(ctx) @@ -2570,7 +2571,7 @@ func (j *DexImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { ctx.PropertyErrorf("jars", "exactly one jar must be provided") } - apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) if !apexInfo.IsForPlatform() { j.hideApexVariantFromMake = true } diff --git a/java/sdk_library.go b/java/sdk_library.go index 149eab683..ffadd3936 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -2036,7 +2036,7 @@ func PrebuiltJars(ctx android.BaseModuleContext, baseName string, s android.SdkS // If either this or the other module are on the platform then this will return // false. func withinSameApexesAs(ctx android.BaseModuleContext, other android.Module) bool { - apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) otherApexInfo := ctx.OtherModuleProvider(other, android.ApexInfoProvider).(android.ApexInfo) return len(otherApexInfo.InApexVariants) > 0 && reflect.DeepEqual(apexInfo.InApexVariants, otherApexInfo.InApexVariants) } @@ -2693,7 +2693,7 @@ func (module *SdkLibraryImport) GenerateAndroidBuildActions(ctx android.ModuleCo if ctx.Device() { // If this is a variant created for a prebuilt_apex then use the dex implementation jar // obtained from the associated deapexer module. - ai := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + ai, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) if ai.ForPrebuiltApex { // Get the path of the dex implementation jar from the `deapexer` module. di := android.FindDeapexerProviderForModule(ctx) @@ -2960,7 +2960,7 @@ func (module *sdkLibraryXml) ShouldSupportSdkVersion(ctx android.BaseModuleConte // File path to the runtime implementation library func (module *sdkLibraryXml) implPath(ctx android.ModuleContext) string { implName := proptools.String(module.properties.Lib_name) - if apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo); !apexInfo.IsForPlatform() { + if apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider); !apexInfo.IsForPlatform() { // TODO(b/146468504): ApexVariationName() is only a soong module name, not apex name. // In most cases, this works fine. But when apex_name is set or override_apex is used // this can be wrong. @@ -3067,7 +3067,8 @@ func (module *sdkLibraryXml) permissionsContents(ctx android.ModuleContext) stri } func (module *sdkLibraryXml) GenerateAndroidBuildActions(ctx android.ModuleContext) { - module.hideApexVariantFromMake = !ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform() + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) + module.hideApexVariantFromMake = !apexInfo.IsForPlatform() libName := proptools.String(module.properties.Lib_name) module.selfValidate(ctx) diff --git a/rust/rust.go b/rust/rust.go index 9a33952af..d88a03d97 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -747,7 +747,8 @@ func (mod *Module) installable(apexInfo android.ApexInfo) bool { } func (ctx moduleContext) apexVariationName() string { - return ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) + return apexInfo.ApexVariationName } var _ cc.LinkableInterface = (*Module)(nil) @@ -897,7 +898,7 @@ func (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { ModuleContext: actx, } - apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider) if !apexInfo.IsForPlatform() { mod.hideApexVariantFromMake = true } @@ -978,7 +979,7 @@ func (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { } } - apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider) if !proptools.BoolDefault(mod.Installable(), mod.EverInstallable()) && !mod.ProcMacro() { // If the module has been specifically configure to not be installed then // hide from make as otherwise it will break when running inside make as the @@ -1148,7 +1149,7 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { // For the dependency from platform to apex, use the latest stubs mod.apexSdkVersion = android.FutureApiLevel - apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) + apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) if !apexInfo.IsForPlatform() { mod.apexSdkVersion = apexInfo.MinSdkVersion } diff --git a/rust/sanitize.go b/rust/sanitize.go index 0b1043597..9dda43fd6 100644 --- a/rust/sanitize.go +++ b/rust/sanitize.go @@ -270,7 +270,7 @@ func rustSanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) { } // If we're using snapshots, redirect to snapshot whenever possible // TODO(b/178470649): clean manual snapshot redirections - snapshot := mctx.Provider(cc.SnapshotInfoProvider).(cc.SnapshotInfo) + snapshot, _ := android.ModuleProvider(mctx, cc.SnapshotInfoProvider) if lib, ok := snapshot.StaticLibs[noteDep]; ok { noteDep = lib }