diff --git a/apex/apex.go b/apex/apex.go index c330f8254..289696557 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -1329,6 +1329,7 @@ func (a *apexBundle) DepsMutator(ctx android.BottomUpMutatorContext) { targets := ctx.MultiTargets() config := ctx.DeviceConfig() + imageVariation := a.getImageVariation(ctx) a.combineProperties(ctx) @@ -1348,13 +1349,13 @@ func (a *apexBundle) DepsMutator(ctx android.BottomUpMutatorContext) { Jni_libs: a.properties.Jni_libs, Binaries: nil, }, - target, a.getImageVariation(config)) + target, imageVariation) // Add native modules targetting both ABIs addDependenciesForNativeModules(ctx, a.properties.Multilib.Both, target, - a.getImageVariation(config)) + imageVariation) isPrimaryAbi := i == 0 if isPrimaryAbi { @@ -1367,13 +1368,13 @@ func (a *apexBundle) DepsMutator(ctx android.BottomUpMutatorContext) { Jni_libs: nil, Binaries: a.properties.Binaries, }, - target, a.getImageVariation(config)) + target, imageVariation) // Add native modules targetting the first ABI addDependenciesForNativeModules(ctx, a.properties.Multilib.First, target, - a.getImageVariation(config)) + imageVariation) } switch target.Arch.ArchType.Multilib { @@ -1382,24 +1383,24 @@ func (a *apexBundle) DepsMutator(ctx android.BottomUpMutatorContext) { addDependenciesForNativeModules(ctx, a.properties.Multilib.Lib32, target, - a.getImageVariation(config)) + imageVariation) addDependenciesForNativeModules(ctx, a.properties.Multilib.Prefer32, target, - a.getImageVariation(config)) + imageVariation) case "lib64": // Add native modules targetting 64-bit ABI addDependenciesForNativeModules(ctx, a.properties.Multilib.Lib64, target, - a.getImageVariation(config)) + imageVariation) if !has32BitTarget { addDependenciesForNativeModules(ctx, a.properties.Multilib.Prefer32, target, - a.getImageVariation(config)) + imageVariation) } } } @@ -1501,15 +1502,33 @@ func (a *apexBundle) testOnlyShouldSkipPayloadSign() bool { return proptools.Bool(a.properties.Test_only_unsigned_payload) } -func (a *apexBundle) getImageVariation(config android.DeviceConfig) string { +func (a *apexBundle) getImageVariation(ctx android.BottomUpMutatorContext) string { + deviceConfig := ctx.DeviceConfig() if a.vndkApex { - return cc.VendorVariationPrefix + a.vndkVersion(config) + return cc.VendorVariationPrefix + a.vndkVersion(deviceConfig) } - if config.VndkVersion() != "" && proptools.Bool(a.properties.Use_vendor) { - return cc.VendorVariationPrefix + config.PlatformVndkVersion() - } else { - return android.CoreVariation + + var prefix string + var vndkVersion string + if deviceConfig.VndkVersion() != "" { + if proptools.Bool(a.properties.Use_vendor) { + prefix = cc.VendorVariationPrefix + vndkVersion = deviceConfig.PlatformVndkVersion() + } else if a.SocSpecific() || a.DeviceSpecific() { + prefix = cc.VendorVariationPrefix + vndkVersion = deviceConfig.VndkVersion() + } else if a.ProductSpecific() { + prefix = cc.ProductVariationPrefix + vndkVersion = deviceConfig.ProductVndkVersion() + } } + if vndkVersion == "current" { + vndkVersion = deviceConfig.PlatformVndkVersion() + } + if vndkVersion != "" { + return prefix + vndkVersion + } + return android.CoreVariation } func (a *apexBundle) EnableSanitizer(sanitizerName string) { @@ -1541,7 +1560,7 @@ func (a *apexBundle) AddSanitizerDependencies(ctx android.BottomUpMutatorContext for _, target := range ctx.MultiTargets() { if target.Arch.ArchType.Multilib == "lib64" { ctx.AddFarVariationDependencies(append(target.Variations(), []blueprint.Variation{ - {Mutator: "image", Variation: a.getImageVariation(ctx.DeviceConfig())}, + {Mutator: "image", Variation: a.getImageVariation(ctx)}, {Mutator: "link", Variation: "shared"}, {Mutator: "version", Variation: ""}, // "" is the non-stub variant }...), sharedLibTag, "libclang_rt.hwasan-aarch64-android") @@ -1785,6 +1804,12 @@ func (a *apexBundle) checkApexAvailability(ctx android.ModuleContext) { return } + // Because APEXes targeting other than system/system_ext partitions + // can't set apex_available, we skip checks for these APEXes + if ctx.SocSpecific() || ctx.DeviceSpecific() || ctx.ProductSpecific() { + return + } + // Coverage build adds additional dependencies for the coverage-only runtime libraries. // Requiring them and their transitive depencies with apex_available is not right // because they just add noise. @@ -2203,6 +2228,12 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { a.installable() && !proptools.Bool(a.properties.Use_vendor) + // APEXes targeting other than system/system_ext partitions use vendor/product variants. + // So we can't link them to /system/lib libs which are core variants. + if a.SocSpecific() || a.DeviceSpecific() || a.ProductSpecific() { + a.linkToSystemLib = false + } + // We don't need the optimization for updatable APEXes, as it might give false signal // to the system health when the APEXes are still bundled (b/149805758) if a.Updatable() && a.properties.ApexType == imageApex { diff --git a/apex/apex_test.go b/apex/apex_test.go index 3cd7d1b36..d5eb45761 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -2105,7 +2105,7 @@ func TestUseVendor(t *testing.T) { ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so") } -func TestUseVendorRestriction(t *testing.T) { +func TestUseVendorNotAllowedForSystemApexes(t *testing.T) { testApexError(t, `module "myapex" .*: use_vendor: not allowed`, ` apex { name: "myapex", @@ -2161,6 +2161,47 @@ func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) { `) } +func TestVendorApex(t *testing.T) { + ctx, config := testApex(t, ` + apex { + name: "myapex", + key: "myapex.key", + binaries: ["mybin"], + vendor: true, + } + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + cc_binary { + name: "mybin", + vendor: true, + shared_libs: ["libfoo"], + } + cc_library { + name: "libfoo", + proprietary: true, + } + `) + + ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{ + "bin/mybin", + "lib64/libfoo.so", + // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX + "lib64/libc++.so", + }) + + apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle) + data := android.AndroidMkDataForTest(t, config, "", apexBundle) + name := apexBundle.BaseModuleName() + prefix := "TARGET_" + var builder strings.Builder + data.Custom(&builder, name, prefix, "", data) + androidMk := builder.String() + ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`) +} + func TestAndroidMkWritesCommonProperties(t *testing.T) { ctx, config := testApex(t, ` apex {