Merge "Reland "Skip packaging cross container cc deps of apk-in-apex"" into main

This commit is contained in:
Spandan Das 2024-12-03 22:12:11 +00:00 committed by Gerrit Code Review
commit 5faf0f5c4e
5 changed files with 53 additions and 36 deletions

View file

@ -12149,34 +12149,32 @@ func TestApexVerifyNativeImplementationLibs(t *testing.T) {
},
dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
},
// TODO: embedded JNI in apps should be checked too, but Soong currently just packages the transitive
// JNI libraries even if they came from another apex.
//{
// name: "app jni library dependency in other apex",
// bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
// dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
//},
//{
// name: "transitive app jni library dependency in other apex",
// bpModifier: func(bp *bpmodify.Blueprint) {
// addToSharedLibs("libembeddedjni", "libbar")(bp)
// addToSharedLibs("libbar", "libotherapex#impl")(bp)
// },
// dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
//},
//{
// name: "app jni library dependency in platform",
// bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
// dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
//},
//{
// name: "transitive app jni library dependency in platform",
// bpModifier: func(bp *bpmodify.Blueprint) {
// addToSharedLibs("libembeddedjni", "libbar")(bp)
// addToSharedLibs("libbar", "libplatform#impl")(bp)
// },
// dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
//},
{
name: "app jni library dependency in other apex",
bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
},
{
name: "transitive app jni library dependency in other apex",
bpModifier: func(bp *bpmodify.Blueprint) {
addToSharedLibs("libembeddedjni", "libbar")(bp)
addToSharedLibs("libbar", "libotherapex#impl")(bp)
},
dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
},
{
name: "app jni library dependency in platform",
bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
},
{
name: "transitive app jni library dependency in platform",
bpModifier: func(bp *bpmodify.Blueprint) {
addToSharedLibs("libembeddedjni", "libbar")(bp)
addToSharedLibs("libbar", "libplatform#impl")(bp)
},
dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
},
{
name: "binary dependency in other apex",
bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),

View file

@ -3345,17 +3345,17 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
return depPaths
}
func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool {
func ShouldUseStubForApex(ctx android.ModuleContext, parent, dep android.Module) bool {
inVendorOrProduct := false
bootstrap := false
if linkable, ok := ctx.Module().(LinkableInterface); !ok {
panic(fmt.Errorf("Not a Linkable module: %q", ctx.ModuleName()))
if linkable, ok := parent.(LinkableInterface); !ok {
ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
} else {
inVendorOrProduct = linkable.InVendorOrProduct()
bootstrap = linkable.Bootstrap()
}
apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
useStubs := false
@ -3402,7 +3402,7 @@ func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibr
if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
// when to use (unspecified) stubs, use the latest one.
if ShouldUseStubForApex(ctx, dep) {
if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
stubs := sharedLibraryStubsInfo.SharedStubLibraries
toUse := stubs[len(stubs)-1]
sharedLibraryInfo = toUse.SharedLibraryInfo

View file

@ -135,6 +135,10 @@ type LinkableInterface interface {
// IsNdk returns true if the library is in the configs known NDK list.
IsNdk(config android.Config) bool
// HasStubsVariants true if this module is a stub or has a sibling variant
// that is a stub.
HasStubsVariants() bool
// IsStubs returns true if the this is a stubs library.
IsStubs() bool

View file

@ -1082,7 +1082,18 @@ func collectAppDeps(ctx android.ModuleContext, app appDepsInterface,
app.SdkVersion(ctx).Kind != android.SdkCorePlatform && !app.RequiresStableAPIs(ctx)
}
jniLib, prebuiltJniPackages := collectJniDeps(ctx, shouldCollectRecursiveNativeDeps,
checkNativeSdkVersion, func(dep cc.LinkableInterface) bool { return !dep.IsNdk(ctx.Config()) && !dep.IsStubs() })
checkNativeSdkVersion, func(parent, child android.Module) bool {
apkInApex := ctx.Module().(android.ApexModule).NotInPlatform()
childLinkable, _ := child.(cc.LinkableInterface)
parentLinkable, _ := parent.(cc.LinkableInterface)
useStubsOfDep := childLinkable.IsStubs()
if apkInApex && parentLinkable != nil {
// APK-in-APEX
// If the parent is a linkable interface, use stubs if the dependency edge crosses an apex boundary.
useStubsOfDep = useStubsOfDep || (childLinkable.HasStubsVariants() && cc.ShouldUseStubForApex(ctx, parent, child))
}
return !childLinkable.IsNdk(ctx.Config()) && !useStubsOfDep
})
var certificates []Certificate
@ -1117,7 +1128,7 @@ func collectAppDeps(ctx android.ModuleContext, app appDepsInterface,
func collectJniDeps(ctx android.ModuleContext,
shouldCollectRecursiveNativeDeps bool,
checkNativeSdkVersion bool,
filter func(cc.LinkableInterface) bool) ([]jniLib, android.Paths) {
filter func(parent, child android.Module) bool) ([]jniLib, android.Paths) {
var jniLibs []jniLib
var prebuiltJniPackages android.Paths
seenModulePaths := make(map[string]bool)
@ -1128,7 +1139,7 @@ func collectJniDeps(ctx android.ModuleContext,
if IsJniDepTag(tag) || cc.IsSharedDepTag(tag) {
if dep, ok := module.(cc.LinkableInterface); ok {
if filter != nil && !filter(dep) {
if filter != nil && !filter(parent, module) {
return false
}

View file

@ -722,6 +722,10 @@ func (mod *Module) IsNdk(config android.Config) bool {
return false
}
func (mod *Module) HasStubsVariants() bool {
return false
}
func (mod *Module) IsStubs() bool {
return false
}