From ab50b0795ac0ef5b4b6062b9d91fafbc9dda8645 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Wed, 12 May 2021 17:13:56 +0900 Subject: [PATCH 1/2] Rename InApexes -> InApexVariants .. in preparation for the upcoming change. This change doesn't alter any behavior. InApexes is a misleading name. People expects that it has the list of soong module names of the APEXes that a module is part of. So, for example, `core-oj` is a part of both `com.android.art` and `com.google.android.art`. However, in reality, that's not true. The field has `com.android.art` only. This is because the two APEXes (android and Google) have the same apex name which is `com.android.art`. That apex name is used in various places like the `apex_available` and allows us to keep using the same name regardless of whether the APEX is overridden or not. However, this is causing problems in some cases where the exact list of soong module names is required. The upcoming change will add a new field to handle the case and the new field actually will get the name 'InApexes'. So, the existing field is renamed to a less misleading name `InApexVariants`. Bug: 180325915 Test: m nothing Change-Id: I0c73361b452eddb812acd5ebef5dcedaab382436 --- android/apex.go | 62 +++++++++++++++++++--------------- apex/apex.go | 4 +-- apex/prebuilt.go | 2 +- cc/cc.go | 2 +- java/boot_jars.go | 2 +- java/hiddenapi_singleton.go | 4 +-- java/platform_bootclasspath.go | 2 +- java/sdk_library.go | 2 +- java/testing.go | 3 +- 9 files changed, 45 insertions(+), 38 deletions(-) diff --git a/android/apex.go b/android/apex.go index b01b700b8..336dafc73 100644 --- a/android/apex.go +++ b/android/apex.go @@ -36,11 +36,16 @@ var ( // Accessible via `ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)` type ApexInfo struct { // Name of the apex variation that this module (i.e. the apex variant of the module) is - // mutated into, or "" for a platform (i.e. non-APEX) variant. Note that a module can be - // included in multiple APEXes, in which case, the module is mutated into one or more - // variants, each of which is for an APEX. The variants then can later be deduped if they - // don't need to be compiled differently. This is an optimization done in - // mergeApexVariations. + // mutated into, or "" for a platform (i.e. non-APEX) variant. Note that this name and the + // Soong module name of the APEX can be different. That happens when there is + // `override_apex` that overrides `apex`. In that case, both Soong modules have the same + // apex variation name which usually is `com.android.foo`. This name is also the `name` + // in the path `/apex/` where this apex is activated on at runtime. + // + // Also note that a module can be included in multiple APEXes, in which case, the module is + // mutated into one or more variants, each of which is for an APEX. The variants then can + // later be deduped if they don't need to be compiled differently. This is an optimization + // done in mergeApexVariations. ApexVariationName string // ApiLevel that this module has to support at minimum. @@ -52,11 +57,11 @@ type ApexInfo struct { // The list of SDK modules that the containing apexBundle depends on. RequiredSdks SdkRefs - // List of apexBundles that this apex variant of the module is associated with. Initially, - // the size of this list is one because one apex variant is associated with one apexBundle. - // When multiple apex variants are merged in mergeApexVariations, ApexInfo struct of the - // merged variant holds the list of apexBundles that are merged together. - InApexes []string + // List of Apex variant names that this module is associated with. This initially is the + // same as the `ApexVariationName` field. Then when multiple apex variants are merged in + // mergeApexVariations, ApexInfo struct of the merged variant holds the list of apexBundles + // that are merged together. + InApexVariants []string // Pointers to the ApexContents struct each of which is for apexBundle modules that this // module is part of. The ApexContents gives information about which modules the apexBundle @@ -93,23 +98,24 @@ func (i ApexInfo) IsForPlatform() bool { return i.ApexVariationName == "" } -// InApex tells whether this apex variant of the module is part of the given apexBundle or not. -func (i ApexInfo) InApex(apex string) bool { - for _, a := range i.InApexes { - if a == apex { +// InApexVariant tells whether this apex variant of the module is part of the given apexVariant or +// not. +func (i ApexInfo) InApexVariant(apexVariant string) bool { + for _, a := range i.InApexVariants { + if a == apexVariant { return true } } return false } -// InApexByBaseName tells whether this apex variant of the module is part of the given APEX or not, -// where the APEX is specified by its canonical base name, i.e. typically beginning with +// InApexByBaseName tells whether this apex variant of the module is part of the given apexVariant +// or not, where the APEX is specified by its canonical base name, i.e. typically beginning with // "com.android.". In particular this function doesn't differentiate between source and prebuilt // APEXes, where the latter may have "prebuilt_" prefixes. -func (i ApexInfo) InApexByBaseName(apex string) bool { - for _, a := range i.InApexes { - if RemoveOptionalPrebuiltPrefix(a) == apex { +func (i ApexInfo) InApexVariantByBaseName(apexVariant string) bool { + for _, a := range i.InApexVariants { + if RemoveOptionalPrebuiltPrefix(a) == apexVariant { return true } } @@ -496,21 +502,21 @@ func mergeApexVariations(ctx PathContext, apexInfos []ApexInfo) (merged []ApexIn // Merge the ApexInfo together. If a compatible ApexInfo exists then merge the information from // this one into it, otherwise create a new merged ApexInfo from this one and save it away so // other ApexInfo instances can be merged into it. - apexName := apexInfo.ApexVariationName + variantName := apexInfo.ApexVariationName mergedName := apexInfo.mergedName(ctx) if index, exists := seen[mergedName]; exists { // Variants having the same mergedName are deduped - merged[index].InApexes = append(merged[index].InApexes, apexName) + merged[index].InApexVariants = append(merged[index].InApexVariants, variantName) merged[index].ApexContents = append(merged[index].ApexContents, apexInfo.ApexContents...) merged[index].Updatable = merged[index].Updatable || apexInfo.Updatable } else { seen[mergedName] = len(merged) apexInfo.ApexVariationName = mergedName - apexInfo.InApexes = CopyOf(apexInfo.InApexes) + apexInfo.InApexVariants = CopyOf(apexInfo.InApexVariants) apexInfo.ApexContents = append([]*ApexContents(nil), apexInfo.ApexContents...) merged = append(merged, apexInfo) } - aliases = append(aliases, [2]string{apexName, mergedName}) + aliases = append(aliases, [2]string{variantName, mergedName}) } return merged, aliases } @@ -583,15 +589,15 @@ func CreateApexVariations(mctx BottomUpMutatorContext, module ApexModule) []Modu // in the same APEX have unique APEX variations so that the module can link against the right // variant. func UpdateUniqueApexVariationsForDeps(mctx BottomUpMutatorContext, am ApexModule) { - // anyInSameApex returns true if the two ApexInfo lists contain any values in an InApexes - // list in common. It is used instead of DepIsInSameApex because it needs to determine if - // the dep is in the same APEX due to being directly included, not only if it is included - // _because_ it is a dependency. + // anyInSameApex returns true if the two ApexInfo lists contain any values in an + // InApexVariants list in common. It is used instead of DepIsInSameApex because it needs to + // determine if the dep is in the same APEX due to being directly included, not only if it + // is included _because_ it is a dependency. anyInSameApex := func(a, b []ApexInfo) bool { collectApexes := func(infos []ApexInfo) []string { var ret []string for _, info := range infos { - ret = append(ret, info.InApexes...) + ret = append(ret, info.InApexVariants...) } return ret } diff --git a/apex/apex.go b/apex/apex.go index 7b2e19d03..eefdc7fcb 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -911,7 +911,7 @@ func (a *apexBundle) ApexInfoMutator(mctx android.TopDownMutatorContext) { MinSdkVersion: minSdkVersion, RequiredSdks: a.RequiredSdks(), Updatable: a.Updatable(), - InApexes: []string{mctx.ModuleName()}, + InApexVariants: []string{mctx.ModuleName()}, ApexContents: []*android.ApexContents{apexContents}, } mctx.WalkDeps(func(child, parent android.Module) bool { @@ -1604,7 +1604,7 @@ func (a *apexBundle) WalkPayloadDeps(ctx android.ModuleContext, do android.Paylo } ai := ctx.OtherModuleProvider(child, android.ApexInfoProvider).(android.ApexInfo) - externalDep := !android.InList(ctx.ModuleName(), ai.InApexes) + externalDep := !android.InList(ctx.ModuleName(), ai.InApexVariants) // Visit actually return do(ctx, parent, am, externalDep) diff --git a/apex/prebuilt.go b/apex/prebuilt.go index 9d632a9b1..cef15c4c3 100644 --- a/apex/prebuilt.go +++ b/apex/prebuilt.go @@ -230,7 +230,7 @@ func (p *prebuiltCommon) apexInfoMutator(mctx android.TopDownMutatorContext) { // Create an ApexInfo for the prebuilt_apex. apexInfo := android.ApexInfo{ ApexVariationName: android.RemoveOptionalPrebuiltPrefix(mctx.ModuleName()), - InApexes: []string{mctx.ModuleName()}, + InApexVariants: []string{mctx.ModuleName()}, ApexContents: []*android.ApexContents{apexContents}, ForPrebuiltApex: true, } diff --git a/cc/cc.go b/cc/cc.go index a0ad0d688..8a34dadd5 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -2833,7 +2833,7 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { // Add the dependency to the APEX(es) providing the library so that // m can trigger building the APEXes as well. depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo) - for _, an := range depApexInfo.InApexes { + for _, an := range depApexInfo.InApexVariants { c.Properties.ApexesProvidingSharedLibs = append( c.Properties.ApexesProvidingSharedLibs, an) } diff --git a/java/boot_jars.go b/java/boot_jars.go index 1fb3deb0a..1f2dab58f 100644 --- a/java/boot_jars.go +++ b/java/boot_jars.go @@ -89,7 +89,7 @@ func (b *bootJarsSingleton) GenerateBuildActions(ctx android.SingletonContext) { name := android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName(module)) if apex, ok := moduleToApex[name]; ok { apexInfo := ctx.ModuleProvider(module, android.ApexInfoProvider).(android.ApexInfo) - if (apex == "platform" && apexInfo.IsForPlatform()) || apexInfo.InApexByBaseName(apex) { + if (apex == "platform" && apexInfo.IsForPlatform()) || apexInfo.InApexVariantByBaseName(apex) { // The module name/apex variant should be unique in the system but double check // just in case something has gone wrong. if existing, ok := nameToApexVariant[name]; ok { diff --git a/java/hiddenapi_singleton.go b/java/hiddenapi_singleton.go index 848aa59bc..bdf055abc 100644 --- a/java/hiddenapi_singleton.go +++ b/java/hiddenapi_singleton.go @@ -167,11 +167,11 @@ func isModuleInConfiguredList(ctx android.BaseModuleContext, module android.Modu // Now match the apex part of the boot image configuration. requiredApex := configuredBootJars.Apex(index) if requiredApex == "platform" || requiredApex == "system_ext" { - if len(apexInfo.InApexes) != 0 { + if len(apexInfo.InApexVariants) != 0 { // A platform variant is required but this is for an apex so ignore it. return false } - } else if !apexInfo.InApexByBaseName(requiredApex) { + } else if !apexInfo.InApexVariantByBaseName(requiredApex) { // An apex variant for a specific apex is required but this is the wrong apex. return false } diff --git a/java/platform_bootclasspath.go b/java/platform_bootclasspath.go index c8fafede6..3a8d6e3b0 100644 --- a/java/platform_bootclasspath.go +++ b/java/platform_bootclasspath.go @@ -225,7 +225,7 @@ func (b *platformBootclasspathModule) checkNonUpdatableModules(ctx android.Modul fromUpdatableApex := apexInfo.Updatable if fromUpdatableApex { // error: this jar is part of an updatable apex - ctx.ModuleErrorf("module %q from updatable apexes %q is not allowed in the framework boot image", ctx.OtherModuleName(m), apexInfo.InApexes) + ctx.ModuleErrorf("module %q from updatable apexes %q is not allowed in the framework boot image", ctx.OtherModuleName(m), apexInfo.InApexVariants) } else { // ok: this jar is part of the platform or a non-updatable apex } diff --git a/java/sdk_library.go b/java/sdk_library.go index 99eacf4e7..b5b6232d6 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -1546,7 +1546,7 @@ func PrebuiltJars(ctx android.BaseModuleContext, baseName string, s android.SdkS func withinSameApexesAs(ctx android.BaseModuleContext, other android.Module) bool { apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) otherApexInfo := ctx.OtherModuleProvider(other, android.ApexInfoProvider).(android.ApexInfo) - return len(otherApexInfo.InApexes) > 0 && reflect.DeepEqual(apexInfo.InApexes, otherApexInfo.InApexes) + return len(otherApexInfo.InApexVariants) > 0 && reflect.DeepEqual(apexInfo.InApexVariants, otherApexInfo.InApexVariants) } func (module *SdkLibrary) sdkJars(ctx android.BaseModuleContext, sdkVersion android.SdkSpec, headerJars bool) android.Paths { diff --git a/java/testing.go b/java/testing.go index 387d59573..cc0feea69 100644 --- a/java/testing.go +++ b/java/testing.go @@ -24,6 +24,7 @@ import ( "android/soong/android" "android/soong/cc" "android/soong/dexpreopt" + "github.com/google/blueprint" ) @@ -371,7 +372,7 @@ func apexNamePairFromModule(ctx *android.TestContext, module android.Module) str if apexInfo.IsForPlatform() { apex = "platform" } else { - apex = apexInfo.InApexes[0] + apex = apexInfo.InApexVariants[0] } return fmt.Sprintf("%s:%s", apex, name) From 78349b56a06c9578a2da427bc5c4986020c0cc57 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Wed, 12 May 2021 17:13:56 +0900 Subject: [PATCH 2/2] Record the actual APEXes that a module is part of. Consider this case: apex { name: "com.android.foo", native_libs: ["foo"], } override_apex { name: "com.mycompany.android.foo", base: "com.android.foo", } cc_library { name: "foo", } There are two APEXes defined: "com.android.foo" and "com.mycompany.android.foo" which is a copy of "com.android.foo" with some properties overridden (e.g. signing keys). The module "foo" is mutated into two variants by the apex mutator: the platform variant and the apex variant. The former has the variation name "" and the later has "apex" which usually is "apex10000". Internally, the apex variant has an alias "com.android.foo". ApexInfo.InApexVariants() returns only "com.android.foo" when called for the module "foo". We can see that the information that "foo" is also part of "com.mycompany.android.foo" is completely lost. This is causing problem when we compare the apex membership by their "soong module name", not the "apex name". In the example above, the two modules have different soone module names, but have the same apex name: "com.android.foo". To fix that, this CL introduces a new field `InApexes` to the `ApexInfo` struct. It has the actual name of the APEXes that the module is part of. With the example above, `InApexes` is ["com.android.foo", "com.mycompany.android.foo"]. Bug: 180325915 Test: m nothing Test: m nothing on non-AOSP targets with ag/13740887 applied. Change-Id: I4e7a7ac5495d2e622ba92a4358ed967e066c6c2e --- android/apex.go | 34 +++++++++++++++++++++++++++++++++- android/apex_test.go | 42 +++++++++++++++++++++--------------------- apex/apex.go | 8 ++++++-- apex/prebuilt.go | 1 + java/boot_jars.go | 2 +- 5 files changed, 62 insertions(+), 25 deletions(-) diff --git a/android/apex.go b/android/apex.go index 336dafc73..4b744364a 100644 --- a/android/apex.go +++ b/android/apex.go @@ -63,6 +63,14 @@ type ApexInfo struct { // that are merged together. InApexVariants []string + // List of APEX Soong module names that this module is part of. Note that the list includes + // different variations of the same APEX. For example, if module `foo` is included in the + // apex `com.android.foo`, and also if there is an override_apex module + // `com.mycompany.android.foo` overriding `com.android.foo`, then this list contains both + // `com.android.foo` and `com.mycompany.android.foo`. If the APEX Soong module is a + // prebuilt, the name here doesn't have the `prebuilt_` prefix. + InApexModules []string + // Pointers to the ApexContents struct each of which is for apexBundle modules that this // module is part of. The ApexContents gives information about which modules the apexBundle // has and whether a module became part of the apexBundle via a direct dependency or not. @@ -122,6 +130,15 @@ func (i ApexInfo) InApexVariantByBaseName(apexVariant string) bool { return false } +func (i ApexInfo) InApexModule(apexModuleName string) bool { + for _, a := range i.InApexModules { + if a == apexModuleName { + return true + } + } + return false +} + // ApexTestForInfo stores the contents of APEXes for which this module is a test - although this // module is not part of the APEX - and thus has access to APEX internals. type ApexTestForInfo struct { @@ -351,8 +368,21 @@ func (m *ApexModuleBase) ApexAvailable() []string { func (m *ApexModuleBase) BuildForApex(apex ApexInfo) { m.apexInfosLock.Lock() defer m.apexInfosLock.Unlock() - for _, v := range m.apexInfos { + for i, v := range m.apexInfos { if v.ApexVariationName == apex.ApexVariationName { + if len(apex.InApexModules) != 1 { + panic(fmt.Errorf("Newly created apexInfo must be for a single APEX")) + } + // Even when the ApexVariantNames are the same, the given ApexInfo might + // actually be for different APEX. This can happen when an APEX is + // overridden via override_apex. For example, there can be two apexes + // `com.android.foo` (from the `apex` module type) and + // `com.mycompany.android.foo` (from the `override_apex` module type), both + // of which has the same ApexVariantName `com.android.foo`. Add the apex + // name to the list so that it's not lost. + if !InList(apex.InApexModules[0], v.InApexModules) { + m.apexInfos[i].InApexModules = append(m.apexInfos[i].InApexModules, apex.InApexModules[0]) + } return } } @@ -507,12 +537,14 @@ func mergeApexVariations(ctx PathContext, apexInfos []ApexInfo) (merged []ApexIn if index, exists := seen[mergedName]; exists { // Variants having the same mergedName are deduped merged[index].InApexVariants = append(merged[index].InApexVariants, variantName) + merged[index].InApexModules = append(merged[index].InApexModules, apexInfo.InApexModules...) merged[index].ApexContents = append(merged[index].ApexContents, apexInfo.ApexContents...) merged[index].Updatable = merged[index].Updatable || apexInfo.Updatable } else { seen[mergedName] = len(merged) apexInfo.ApexVariationName = mergedName apexInfo.InApexVariants = CopyOf(apexInfo.InApexVariants) + apexInfo.InApexModules = CopyOf(apexInfo.InApexModules) apexInfo.ApexContents = append([]*ApexContents(nil), apexInfo.ApexContents...) merged = append(merged, apexInfo) } diff --git a/android/apex_test.go b/android/apex_test.go index 109b1c8b2..e1123692d 100644 --- a/android/apex_test.go +++ b/android/apex_test.go @@ -33,10 +33,10 @@ func Test_mergeApexVariations(t *testing.T) { { name: "single", in: []ApexInfo{ - {"foo", FutureApiLevel, false, nil, []string{"foo"}, nil, NotForPrebuiltApex}, + {"foo", FutureApiLevel, false, nil, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, }, wantMerged: []ApexInfo{ - {"apex10000", FutureApiLevel, false, nil, []string{"foo"}, nil, NotForPrebuiltApex}, + {"apex10000", FutureApiLevel, false, nil, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, }, wantAliases: [][2]string{ {"foo", "apex10000"}, @@ -45,11 +45,11 @@ func Test_mergeApexVariations(t *testing.T) { { name: "merge", in: []ApexInfo{ - {"foo", FutureApiLevel, false, SdkRefs{{"baz", "1"}}, []string{"foo"}, nil, NotForPrebuiltApex}, - {"bar", FutureApiLevel, false, SdkRefs{{"baz", "1"}}, []string{"bar"}, nil, NotForPrebuiltApex}, + {"foo", FutureApiLevel, false, SdkRefs{{"baz", "1"}}, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, + {"bar", FutureApiLevel, false, SdkRefs{{"baz", "1"}}, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex}, }, wantMerged: []ApexInfo{ - {"apex10000_baz_1", FutureApiLevel, false, SdkRefs{{"baz", "1"}}, []string{"bar", "foo"}, nil, false}}, + {"apex10000_baz_1", FutureApiLevel, false, SdkRefs{{"baz", "1"}}, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, false}}, wantAliases: [][2]string{ {"bar", "apex10000_baz_1"}, {"foo", "apex10000_baz_1"}, @@ -58,12 +58,12 @@ func Test_mergeApexVariations(t *testing.T) { { name: "don't merge version", in: []ApexInfo{ - {"foo", FutureApiLevel, false, nil, []string{"foo"}, nil, NotForPrebuiltApex}, - {"bar", uncheckedFinalApiLevel(30), false, nil, []string{"bar"}, nil, NotForPrebuiltApex}, + {"foo", FutureApiLevel, false, nil, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, + {"bar", uncheckedFinalApiLevel(30), false, nil, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex}, }, wantMerged: []ApexInfo{ - {"apex30", uncheckedFinalApiLevel(30), false, nil, []string{"bar"}, nil, NotForPrebuiltApex}, - {"apex10000", FutureApiLevel, false, nil, []string{"foo"}, nil, NotForPrebuiltApex}, + {"apex30", uncheckedFinalApiLevel(30), false, nil, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex}, + {"apex10000", FutureApiLevel, false, nil, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, }, wantAliases: [][2]string{ {"bar", "apex30"}, @@ -73,11 +73,11 @@ func Test_mergeApexVariations(t *testing.T) { { name: "merge updatable", in: []ApexInfo{ - {"foo", FutureApiLevel, false, nil, []string{"foo"}, nil, NotForPrebuiltApex}, - {"bar", FutureApiLevel, true, nil, []string{"bar"}, nil, NotForPrebuiltApex}, + {"foo", FutureApiLevel, false, nil, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, + {"bar", FutureApiLevel, true, nil, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex}, }, wantMerged: []ApexInfo{ - {"apex10000", FutureApiLevel, true, nil, []string{"bar", "foo"}, nil, NotForPrebuiltApex}, + {"apex10000", FutureApiLevel, true, nil, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, NotForPrebuiltApex}, }, wantAliases: [][2]string{ {"bar", "apex10000"}, @@ -87,12 +87,12 @@ func Test_mergeApexVariations(t *testing.T) { { name: "don't merge sdks", in: []ApexInfo{ - {"foo", FutureApiLevel, false, SdkRefs{{"baz", "1"}}, []string{"foo"}, nil, NotForPrebuiltApex}, - {"bar", FutureApiLevel, false, SdkRefs{{"baz", "2"}}, []string{"bar"}, nil, NotForPrebuiltApex}, + {"foo", FutureApiLevel, false, SdkRefs{{"baz", "1"}}, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, + {"bar", FutureApiLevel, false, SdkRefs{{"baz", "2"}}, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex}, }, wantMerged: []ApexInfo{ - {"apex10000_baz_2", FutureApiLevel, false, SdkRefs{{"baz", "2"}}, []string{"bar"}, nil, NotForPrebuiltApex}, - {"apex10000_baz_1", FutureApiLevel, false, SdkRefs{{"baz", "1"}}, []string{"foo"}, nil, NotForPrebuiltApex}, + {"apex10000_baz_2", FutureApiLevel, false, SdkRefs{{"baz", "2"}}, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex}, + {"apex10000_baz_1", FutureApiLevel, false, SdkRefs{{"baz", "1"}}, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, }, wantAliases: [][2]string{ {"bar", "apex10000_baz_2"}, @@ -102,15 +102,15 @@ func Test_mergeApexVariations(t *testing.T) { { name: "don't merge when for prebuilt_apex", in: []ApexInfo{ - {"foo", FutureApiLevel, false, nil, []string{"foo"}, nil, NotForPrebuiltApex}, - {"bar", FutureApiLevel, true, nil, []string{"bar"}, nil, NotForPrebuiltApex}, + {"foo", FutureApiLevel, false, nil, []string{"foo"}, []string{"foo"}, nil, NotForPrebuiltApex}, + {"bar", FutureApiLevel, true, nil, []string{"bar"}, []string{"bar"}, nil, NotForPrebuiltApex}, // This one should not be merged in with the others because it is for // a prebuilt_apex. - {"baz", FutureApiLevel, true, nil, []string{"baz"}, nil, ForPrebuiltApex}, + {"baz", FutureApiLevel, true, nil, []string{"baz"}, []string{"baz"}, nil, ForPrebuiltApex}, }, wantMerged: []ApexInfo{ - {"apex10000", FutureApiLevel, true, nil, []string{"bar", "foo"}, nil, NotForPrebuiltApex}, - {"baz", FutureApiLevel, true, nil, []string{"baz"}, nil, ForPrebuiltApex}, + {"apex10000", FutureApiLevel, true, nil, []string{"bar", "foo"}, []string{"bar", "foo"}, nil, NotForPrebuiltApex}, + {"baz", FutureApiLevel, true, nil, []string{"baz"}, []string{"baz"}, nil, ForPrebuiltApex}, }, wantAliases: [][2]string{ {"bar", "apex10000"}, diff --git a/apex/apex.go b/apex/apex.go index eefdc7fcb..790f2e8bd 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -906,12 +906,16 @@ func (a *apexBundle) ApexInfoMutator(mctx android.TopDownMutatorContext) { // This is the main part of this mutator. Mark the collected dependencies that they need to // be built for this apexBundle. + + // Note that there are many different names. + // ApexVariationName: this is the name of the apex variation apexInfo := android.ApexInfo{ - ApexVariationName: mctx.ModuleName(), + ApexVariationName: mctx.ModuleName(), // could be com.android.foo MinSdkVersion: minSdkVersion, RequiredSdks: a.RequiredSdks(), Updatable: a.Updatable(), - InApexVariants: []string{mctx.ModuleName()}, + InApexVariants: []string{mctx.ModuleName()}, // could be com.android.foo + InApexModules: []string{a.Name()}, // could be com.mycompany.android.foo ApexContents: []*android.ApexContents{apexContents}, } mctx.WalkDeps(func(child, parent android.Module) bool { diff --git a/apex/prebuilt.go b/apex/prebuilt.go index cef15c4c3..6125ef50f 100644 --- a/apex/prebuilt.go +++ b/apex/prebuilt.go @@ -231,6 +231,7 @@ func (p *prebuiltCommon) apexInfoMutator(mctx android.TopDownMutatorContext) { apexInfo := android.ApexInfo{ ApexVariationName: android.RemoveOptionalPrebuiltPrefix(mctx.ModuleName()), InApexVariants: []string{mctx.ModuleName()}, + InApexModules: []string{mctx.ModuleName()}, ApexContents: []*android.ApexContents{apexContents}, ForPrebuiltApex: true, } diff --git a/java/boot_jars.go b/java/boot_jars.go index 1f2dab58f..7abda8031 100644 --- a/java/boot_jars.go +++ b/java/boot_jars.go @@ -89,7 +89,7 @@ func (b *bootJarsSingleton) GenerateBuildActions(ctx android.SingletonContext) { name := android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName(module)) if apex, ok := moduleToApex[name]; ok { apexInfo := ctx.ModuleProvider(module, android.ApexInfoProvider).(android.ApexInfo) - if (apex == "platform" && apexInfo.IsForPlatform()) || apexInfo.InApexVariantByBaseName(apex) { + if (apex == "platform" && apexInfo.IsForPlatform()) || apexInfo.InApexModule(apex) { // The module name/apex variant should be unique in the system but double check // just in case something has gone wrong. if existing, ok := nameToApexVariant[name]; ok {