diff --git a/android/apex.go b/android/apex.go index 3a191cf60..9d65c0822 100644 --- a/android/apex.go +++ b/android/apex.go @@ -158,6 +158,14 @@ func DirectlyInAnyApex(config Config, moduleName string) bool { return false } +// Tests if moduleName is included in any APEX. +func InAnyApex(config Config, moduleName string) bool { + bundleNamesMapMutex.Lock() + defer bundleNamesMapMutex.Unlock() + bundleNames, ok := apexBundleNamesMap(config)[moduleName] + return ok && len(bundleNames) > 0 +} + func InitApexModule(m ApexModule) { base := m.apexModuleBase() base.canHaveApexVariants = true diff --git a/cc/androidmk.go b/cc/androidmk.go index f5e04bb02..1f5a8adfc 100644 --- a/cc/androidmk.go +++ b/cc/androidmk.go @@ -76,6 +76,9 @@ func (c *Module) AndroidMk() android.AndroidMkData { if len(c.Properties.AndroidMkWholeStaticLibs) > 0 { fmt.Fprintln(w, "LOCAL_WHOLE_STATIC_LIBRARIES := "+strings.Join(c.Properties.AndroidMkWholeStaticLibs, " ")) } + if len(c.Properties.ApexesProvidingSharedLibs) > 0 { + fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES := "+strings.Join(c.Properties.ApexesProvidingSharedLibs, " ")) + } fmt.Fprintln(w, "LOCAL_SOONG_LINK_TYPE :=", c.getMakeLinkType()) if c.useVndk() { fmt.Fprintln(w, "LOCAL_USE_VNDK := true") diff --git a/cc/cc.go b/cc/cc.go index b8cbf26a0..f3aa7e880 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -183,12 +183,13 @@ type BaseProperties struct { // Minimum sdk version supported when compiling against the ndk Sdk_version *string - AndroidMkSharedLibs []string `blueprint:"mutated"` - AndroidMkStaticLibs []string `blueprint:"mutated"` - AndroidMkRuntimeLibs []string `blueprint:"mutated"` - AndroidMkWholeStaticLibs []string `blueprint:"mutated"` - HideFromMake bool `blueprint:"mutated"` - PreventInstall bool `blueprint:"mutated"` + AndroidMkSharedLibs []string `blueprint:"mutated"` + AndroidMkStaticLibs []string `blueprint:"mutated"` + AndroidMkRuntimeLibs []string `blueprint:"mutated"` + AndroidMkWholeStaticLibs []string `blueprint:"mutated"` + HideFromMake bool `blueprint:"mutated"` + PreventInstall bool `blueprint:"mutated"` + ApexesProvidingSharedLibs []string `blueprint:"mutated"` UseVndk bool `blueprint:"mutated"` @@ -1579,6 +1580,22 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { // Export the shared libs to Make. switch depTag { case sharedDepTag, sharedExportDepTag, lateSharedDepTag: + // Dependency to the stubs lib which is already included in an APEX + // is not added to the androidmk dependency + if dependentLibrary, ok := ccDep.linker.(*libraryDecorator); ok { + depNameWithTarget := depName + "-" + ccDep.Target().String() + if dependentLibrary.buildStubs() && android.InAnyApex(ctx.Config(), depNameWithTarget) { + // Also add the dependency to the APEX(es) providing the library so that + // m can trigger building the APEXes as well. + apexNames := android.GetApexBundlesForModule(ctx, depNameWithTarget) + for an := range apexNames { + c.Properties.ApexesProvidingSharedLibs = append( + c.Properties.ApexesProvidingSharedLibs, an) + } + break + } + } + // Note: the order of libs in this list is not important because // they merely serve as Make dependencies and do not affect this lib itself. c.Properties.AndroidMkSharedLibs = append(