Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 10c4136b authored by Spandan Das's avatar Spandan Das
Browse files

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

This relands https://r.android.com/3375509, but uses `NotInPlatform` of
the top-level app in `collectAppDeps`.

The original implementation was reverted because it skipped packaging
jni lib deps that crossed an api domain boundary. This is the intended
behavior for apk-in-apex, but runs into issues for android_test. The
linkerconfig for these has been setup to allow access to LLNDK (in
system) and LLNDK_MOVED_TO_APEX_LIBRARIES. Other libraries like
`libnativebridge` cannot be accessed by tests on device, so the tests
need their own copy.

Test: m ArtServiceTests
Test: verified that the contents of the apk are same before and after

Bug: 375473764
Change-Id: I3a3985e576959c3113fc1e11f43dbe669603ec22
parent 4e305cec
Loading
Loading
Loading
Loading
+26 −28
Original line number Diff line number Diff line
@@ -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"),
+5 −5
Original line number Diff line number Diff line
@@ -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
+4 −0
Original line number Diff line number Diff line
@@ -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

+14 −3
Original line number Diff line number Diff line
@@ -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
				}

+4 −0
Original line number Diff line number Diff line
@@ -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
}