Use a different VNDK namespace for product apps

As product partition may have a different VNDK version than that of
vendor partition, they may not share the same VNDK namespace for
their apps.
Define a new vndk_product namespace in the system section for product
apps that uses ro.product.vndk.version.

Bug: 149063221
Test: atest libnativeloader_test
Change-Id: I1bb76617104a49b0d11af13d2f116959a18390a3
diff --git a/libnativeloader/public_libraries.cpp b/libnativeloader/public_libraries.cpp
index 35ef488..277d2c9 100644
--- a/libnativeloader/public_libraries.cpp
+++ b/libnativeloader/public_libraries.cpp
@@ -275,9 +275,7 @@
   return android::base::Join(*sonames, ':');
 }
 
-static std::string InitVndkspLibraries() {
-  // VNDK-SP is used only for vendor hals which are not available for the
-  // product partition.
+static std::string InitVndkspLibrariesVendor() {
   std::string config_file = kVndkLibrariesFile;
   InsertVndkVersionStr(&config_file, false);
   auto sonames = ReadConfig(config_file, always_true);
@@ -288,6 +286,17 @@
   return android::base::Join(*sonames, ':');
 }
 
+static std::string InitVndkspLibrariesProduct() {
+  std::string config_file = kVndkLibrariesFile;
+  InsertVndkVersionStr(&config_file, true);
+  auto sonames = ReadConfig(config_file, always_true);
+  if (!sonames.ok()) {
+    LOG_ALWAYS_FATAL("%s", sonames.error().message().c_str());
+    return "";
+  }
+  return android::base::Join(*sonames, ':');
+}
+
 static std::string InitNeuralNetworksPublicLibraries() {
   return kNeuralNetworksApexPublicLibrary;
 }
@@ -352,8 +361,13 @@
   return list;
 }
 
-const std::string& vndksp_libraries() {
-  static std::string list = InitVndkspLibraries();
+const std::string& vndksp_libraries_product() {
+  static std::string list = InitVndkspLibrariesProduct();
+  return list;
+}
+
+const std::string& vndksp_libraries_vendor() {
+  static std::string list = InitVndkspLibrariesVendor();
   return list;
 }