Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native library having stubs (i.e. stubs.versions property is set), the stubs variant is used unless the dependent lib is directly included in the same APEX with the depending module. Example: apex { name: "myapex", native_shared_libs: ["libX", "libY"], } cc_library { name: "libX", shared_libs: ["libY", "libZ"], } cc_library { name: "libY", stubs: { versions: ["1", "2"], }, } cc_library { name: "libZ", stubs: { versions: ["1", "2"], }, } In this case, libX is linking to the impl variant of libY (that provides private APIs) while libY is linking to the version 2 stubs of libZ. This is because libY is directly included in the same apex via native_shared_libs property, but libZ isn't. Bug: 112672359 Test: apex_test added Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
This commit is contained in:
22
apex/apex.go
22
apex/apex.go
@@ -128,13 +128,6 @@ func init() {
|
||||
})
|
||||
}
|
||||
|
||||
// maps a module name to set of apex bundle names that the module should be built for
|
||||
func apexBundleNamesFor(config android.Config) map[string]map[string]bool {
|
||||
return config.Once("apexBundleNames", func() interface{} {
|
||||
return make(map[string]map[string]bool)
|
||||
}).(map[string]map[string]bool)
|
||||
}
|
||||
|
||||
// Mark the direct and transitive dependencies of apex bundles so that they
|
||||
// can be built for the apex bundles.
|
||||
func apexDepsMutator(mctx android.TopDownMutatorContext) {
|
||||
@@ -143,12 +136,9 @@ func apexDepsMutator(mctx android.TopDownMutatorContext) {
|
||||
mctx.WalkDeps(func(child, parent android.Module) bool {
|
||||
if am, ok := child.(android.ApexModule); ok && am.CanHaveApexVariants() {
|
||||
moduleName := mctx.OtherModuleName(am) + "-" + am.Target().String()
|
||||
bundleNames, ok := apexBundleNamesFor(mctx.Config())[moduleName]
|
||||
if !ok {
|
||||
bundleNames = make(map[string]bool)
|
||||
apexBundleNamesFor(mctx.Config())[moduleName] = bundleNames
|
||||
}
|
||||
bundleNames[apexBundleName] = true
|
||||
// If the parent is apexBundle, this child is directly depended.
|
||||
_, directDep := parent.(*apexBundle)
|
||||
android.BuildModuleForApexBundle(mctx, moduleName, apexBundleName, directDep)
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
@@ -161,7 +151,8 @@ func apexDepsMutator(mctx android.TopDownMutatorContext) {
|
||||
func apexMutator(mctx android.BottomUpMutatorContext) {
|
||||
if am, ok := mctx.Module().(android.ApexModule); ok && am.CanHaveApexVariants() {
|
||||
moduleName := mctx.ModuleName() + "-" + am.Target().String()
|
||||
if bundleNames, ok := apexBundleNamesFor(mctx.Config())[moduleName]; ok {
|
||||
bundleNames := android.GetApexBundlesForModule(mctx, moduleName)
|
||||
if len(bundleNames) > 0 {
|
||||
variations := []string{"platform"}
|
||||
for bn := range bundleNames {
|
||||
variations = append(variations, bn)
|
||||
@@ -495,6 +486,9 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
// indirect dependencies
|
||||
if am, ok := child.(android.ApexModule); ok && am.CanHaveApexVariants() && am.IsInstallableToApex() {
|
||||
if cc, ok := child.(*cc.Module); ok {
|
||||
if cc.IsStubs() || cc.HasStubsVariants() {
|
||||
return false
|
||||
}
|
||||
depName := ctx.OtherModuleName(child)
|
||||
fileToCopy, dirInApex := getCopyManifestForNativeLibrary(cc)
|
||||
filesInfo = append(filesInfo, apexFile{fileToCopy, depName, cc.Arch().ArchType, dirInApex, nativeSharedLib})
|
||||
|
Reference in New Issue
Block a user