Define product public libraries

When /product is unbundled from the /system, /product/etc/ may not
have 'public.libraries-<companyname>.txt' to extend public libraries.
Instead, /product/etc/public.library.txt can provide public libraries
from /product.

Bug: 186055799
Test: atest libnativeloader_test
Change-Id: I8994649826657f59ac1dac655205b9704a2c67c9
diff --git a/libnativeloader/public_libraries.cpp b/libnativeloader/public_libraries.cpp
index 9d7124f..5571416 100644
--- a/libnativeloader/public_libraries.cpp
+++ b/libnativeloader/public_libraries.cpp
@@ -55,6 +55,7 @@
 constexpr const char* kExtendedPublicLibrariesFileSuffix = ".txt";
 constexpr const char* kApexLibrariesConfigFile = "/linkerconfig/apex.libraries.config.txt";
 constexpr const char* kVendorPublicLibrariesFile = "/vendor/etc/public.libraries.txt";
+constexpr const char* kProductPublicLibrariesFile = "/product/etc/public.libraries.txt";
 constexpr const char* kLlndkLibrariesFile = "/apex/com.android.vndk.v{}/etc/llndk.libraries.{}.txt";
 constexpr const char* kVndkLibrariesFile = "/apex/com.android.vndk.v{}/etc/vndksp.libraries.{}.txt";
 
@@ -185,6 +186,15 @@
   return android::base::Join(*sonames, ':');
 }
 
+static std::string InitProductPublicLibraries() {
+  // This file is optional, quietly ignore if the file does not exist.
+  auto sonames = ReadConfig(kProductPublicLibrariesFile, always_true);
+  if (!sonames.ok()) {
+    return "";
+  }
+  return android::base::Join(*sonames, ':');
+}
+
 // read /system/etc/public.libraries-<companyname>.txt,
 // /system_ext/etc/public.libraries-<companyname>.txt and
 // /product/etc/public.libraries-<companyname>.txt which contain partner defined
@@ -194,7 +204,9 @@
   std::vector<std::string> sonames;
   ReadExtensionLibraries("/system/etc", &sonames);
   ReadExtensionLibraries("/system_ext/etc", &sonames);
-  ReadExtensionLibraries("/product/etc", &sonames);
+  if (!is_product_vndk_version_defined()) {
+    ReadExtensionLibraries("/product/etc", &sonames);
+  }
   return android::base::Join(sonames, ':');
 }
 
@@ -305,6 +317,11 @@
   return list;
 }
 
+const std::string& product_public_libraries() {
+  static std::string list = InitProductPublicLibraries();
+  return list;
+}
+
 const std::string& extended_public_libraries() {
   static std::string list = InitExtendedPublicLibraries();
   return list;