Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 85d61767 authored by Jooyung Han's avatar Jooyung Han
Browse files

apex: support "vendor: true"

When an apex sets "vendor: true", it becomes a vendor apex.

Vendor apexes use vendor variants for native modules and are
installed in /vendor/apex.

Bug: 159211312
Test: m
Change-Id: I2585dd990ba857a2ab3ec6ab24e09d4652e867f2
parent 2ed99d00
Loading
Loading
Loading
Loading
+46 −15
Original line number Diff line number Diff line
@@ -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)
	}

	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 config.VndkVersion() != "" && proptools.Bool(a.properties.Use_vendor) {
		return cc.VendorVariationPrefix + config.PlatformVndkVersion()
	} else {
		return android.CoreVariation
	}
	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 {
+42 −1
Original line number Diff line number Diff line
@@ -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 {