From d045ebca4c0a86f7c41f8134fa40175e07dd3754 Mon Sep 17 00:00:00 2001 From: Jooyung Han Date: Tue, 6 Dec 2022 15:23:57 +0900 Subject: [PATCH] Vendor apex sets "vndkVersion" when it uses vndk libs Vendor apex with "use_vndk_as_stable:true" sets the dependency in "requireNativeLibs: ":vndk"". But this isn't enough because the APEX won't work if VNDK version mismatches. Now, when a vendor apex uses VNDK libs, "vndkVersion" is set as well in apex_manifest so that apexd can abort the installation/staging when device's VNDK version mimatches. Bug: 222620439 Test: VendorApexHostTestCases Test: built vendor apex how has "vndkVersion" field in its apex_manifest Change-Id: If03340c230efe854ab932cdf472c276f7646ad0c --- apex/apex.go | 23 ++++++++++++++++------- apex/builder.go | 6 ++++++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/apex/apex.go b/apex/apex.go index 8e1783ed5..25de1ee17 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -734,12 +734,14 @@ func (a *apexBundle) combineProperties(ctx android.BottomUpMutatorContext) { } } -// getImageVariation returns the image variant name for this apexBundle. In most cases, it's simply -// android.CoreVariation, but gets complicated for the vendor APEXes and the VNDK APEX. -func (a *apexBundle) getImageVariation(ctx android.BottomUpMutatorContext) string { - deviceConfig := ctx.DeviceConfig() +// getImageVariationPair returns a pair for the image variation name as its +// prefix and suffix. The prefix indicates whether it's core/vendor/product and the +// suffix indicates the vndk version when it's vendor or product. +// getImageVariation can simply join the result of this function to get the +// image variation name. +func (a *apexBundle) getImageVariationPair(deviceConfig android.DeviceConfig) (string, string) { if a.vndkApex { - return cc.VendorVariationPrefix + a.vndkVersion(deviceConfig) + return cc.VendorVariationPrefix, a.vndkVersion(deviceConfig) } var prefix string @@ -757,10 +759,17 @@ func (a *apexBundle) getImageVariation(ctx android.BottomUpMutatorContext) strin vndkVersion = deviceConfig.PlatformVndkVersion() } if vndkVersion != "" { - return prefix + vndkVersion + return prefix, vndkVersion } - return android.CoreVariation // The usual case + return android.CoreVariation, "" // The usual case +} + +// getImageVariation returns the image variant name for this apexBundle. In most cases, it's simply +// android.CoreVariation, but gets complicated for the vendor APEXes and the VNDK APEX. +func (a *apexBundle) getImageVariation(ctx android.BottomUpMutatorContext) string { + prefix, vndkVersion := a.getImageVariationPair(ctx.DeviceConfig()) + return prefix + vndkVersion } func (a *apexBundle) DepsMutator(ctx android.BottomUpMutatorContext) { diff --git a/apex/builder.go b/apex/builder.go index 4be34d22b..82a523c78 100644 --- a/apex/builder.go +++ b/apex/builder.go @@ -235,6 +235,12 @@ func (a *apexBundle) buildManifest(ctx android.ModuleContext, provideNativeLibs, optCommands = append(optCommands, "-a jniLibs "+strings.Join(jniLibs, " ")) } + if android.InList(":vndk", requireNativeLibs) { + if _, vndkVersion := a.getImageVariationPair(ctx.DeviceConfig()); vndkVersion != "" { + optCommands = append(optCommands, "-v vndkVersion "+vndkVersion) + } + } + manifestJsonFullOut := android.PathForModuleOut(ctx, "apex_manifest_full.json") defaultVersion := android.DefaultUpdatableModuleVersion if override := ctx.Config().Getenv("OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION"); override != "" {