ld.config for com.android.neuralnetworks APEX.

Makes updated libneuralnetworks.so in /apex/com.android.neuralnetworks/{LIB}
loadable from all relevant namespaces.

Test: Verified that right library is being loaded using lsof and
Test: verbose debug logs from bionic/ld.
Bug: 137320025
Change-Id: I38140bb9915a3f85f10456e15ed0f492dbdba802
diff --git a/libnativeloader/public_libraries.cpp b/libnativeloader/public_libraries.cpp
index c205eb1..10e23fd 100644
--- a/libnativeloader/public_libraries.cpp
+++ b/libnativeloader/public_libraries.cpp
@@ -51,6 +51,8 @@
 
 constexpr const char* kRuntimeApexLibPath = "/apex/com.android.runtime/" LIB;
 
+constexpr const char* kNeuralNetworksApexPublicLibrary = "libneuralnetworks.so";
+
 // TODO(b/130388701): do we need this?
 std::string root_dir() {
   static const char* android_root_env = getenv("ANDROID_ROOT");
@@ -219,6 +221,12 @@
       sonames.erase(it);
     }
   }
+
+  // Remove the public libs in the nnapi namespace.
+  auto it = std::find(sonames.begin(), sonames.end(), kNeuralNetworksApexPublicLibrary);
+  if (it != sonames.end()) {
+    sonames.erase(it);
+  }
   return android::base::Join(sonames, ':');
 }
 
@@ -267,6 +275,10 @@
   return android::base::Join(sonames, ':');
 }
 
+static std::string InitNeuralNetworksPublicLibraries() {
+  return kNeuralNetworksApexPublicLibrary;
+}
+
 }  // namespace
 
 const std::string& default_public_libraries() {
@@ -289,6 +301,11 @@
   return list;
 }
 
+const std::string& neuralnetworks_public_libraries() {
+  static std::string list = InitNeuralNetworksPublicLibraries();
+  return list;
+}
+
 const std::string& llndk_libraries() {
   static std::string list = InitLlndkLibraries();
   return list;