diff --git a/apex/apex.go b/apex/apex.go index bad382aa8..880028f87 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -1927,6 +1927,10 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { filesInfo = append(filesInfo, af) return true // track transitive dependencies } + } else if rust.IsRlibDepTag(depTag) { + // Rlib is statically linked, but it might have shared lib + // dependencies. Track them. + return true } else if java.IsbootImageContentDepTag(depTag) { // Add the contents of the boot image to the apex. switch child.(type) { diff --git a/apex/apex_test.go b/apex/apex_test.go index bdff41e6d..c85ea962f 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -392,6 +392,15 @@ func TestBasicApex(t *testing.T) { srcs: ["foo.rs"], crate_name: "foo", apex_available: ["myapex"], + shared_libs: ["libfoo.shared_from_rust"], + } + + cc_library_shared { + name: "libfoo.shared_from_rust", + srcs: ["mylib.cpp"], + system_shared_libs: [], + stl: "none", + apex_available: ["myapex"], } rust_library_dylib { @@ -539,6 +548,7 @@ func TestBasicApex(t *testing.T) { ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000") ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000") ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000") + ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000") // Ensure that both direct and indirect deps are copied into apex ensureContains(t, copyCmds, "image.apex/lib64/mylib.so") @@ -548,6 +558,7 @@ func TestBasicApex(t *testing.T) { ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so") ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so") ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so") + ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so") // .. but not for java libs ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar") ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar") diff --git a/rust/rust.go b/rust/rust.go index 566ad3787..34e197a07 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -798,6 +798,11 @@ func IsDylibDepTag(depTag blueprint.DependencyTag) bool { return ok && tag == dylibDepTag } +func IsRlibDepTag(depTag blueprint.DependencyTag) bool { + tag, ok := depTag.(dependencyTag) + return ok && tag == rlibDepTag +} + type autoDep struct { variation string depTag dependencyTag