diff options
-rw-r--r-- | apex/apex_test.go | 54 | ||||
-rw-r--r-- | cc/cc.go | 10 | ||||
-rw-r--r-- | cc/linkable.go | 4 | ||||
-rw-r--r-- | java/app.go | 17 | ||||
-rw-r--r-- | rust/rust.go | 4 |
5 files changed, 53 insertions, 36 deletions
diff --git a/apex/apex_test.go b/apex/apex_test.go index 27c0340de..282cd1dd3 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -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"), @@ -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 diff --git a/cc/linkable.go b/cc/linkable.go index ef204eb91..1a9a9abbc 100644 --- a/cc/linkable.go +++ b/cc/linkable.go @@ -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 diff --git a/java/app.go b/java/app.go index 34a548e5a..4dea7dc1b 100644 --- a/java/app.go +++ b/java/app.go @@ -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 } diff --git a/rust/rust.go b/rust/rust.go index 48f946e1c..eeb228ceb 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -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 } |