diff --git a/apex/apex.go b/apex/apex.go index 712afe415..60d0f6c01 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -2235,7 +2235,8 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { return true // track transitive dependencies } } else if java.IsJniDepTag(depTag) { - return true + // Because APK-in-APEX embeds jni_libs transitively, we don't need to track transitive deps + return false } else if java.IsXmlPermissionsFileDepTag(depTag) { if prebuilt, ok := child.(android.PrebuiltEtcModule); ok { filesInfo = append(filesInfo, apexFileForPrebuiltEtc(ctx, prebuilt, depName)) diff --git a/apex/apex_test.go b/apex/apex_test.go index e6944354b..b56909c57 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -2889,9 +2889,19 @@ func TestApexWithApps(t *testing.T) { cc_library_shared { name: "libjni", srcs: ["mylib.cpp"], + shared_libs: ["libfoo"], stl: "none", system_shared_libs: [], apex_available: [ "myapex" ], + sdk_version: "current", + } + + cc_library_shared { + name: "libfoo", + stl: "none", + system_shared_libs: [], + apex_available: [ "myapex" ], + sdk_version: "current", } `) @@ -2902,16 +2912,19 @@ func TestApexWithApps(t *testing.T) { ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk") ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk") - // JNI libraries are embedded inside APK - appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni lib") - libjniOutput := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module).OutputFile() - ensureListContains(t, appZipRule.Implicits.Strings(), libjniOutput.String()) - // ... uncompressed + appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs") + // JNI libraries are uncompressed if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") { - t.Errorf("jni lib is not uncompressed for AppFoo") + t.Errorf("jni libs are not uncompressed for AppFoo") + } + // JNI libraries including transitive deps are + for _, jni := range []string{"libjni", "libfoo"} { + jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module).OutputFile() + // ... embedded inside APK (jnilibs.zip) + ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String()) + // ... and not directly inside the APEX + ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so") } - // ... and not directly inside the APEX - ensureNotContains(t, copyCmds, "image.apex/lib64/libjni.so") } func TestApexWithAppImports(t *testing.T) {