Use {llndk,vndksp}.libraries.txt from VNDK APEX

/system/etc/{llndk,vndksp}.libraries.txt files will be deprecated.
These files can be read from VNDK APEX.

Bug: 145184886
Test: build / boot

Change-Id: If96fe7c75538e7fa94542e9b4d1d68a16cfa5f62
diff --git a/libnativeloader/Android.bp b/libnativeloader/Android.bp
index f6dab2d..a732276 100644
--- a/libnativeloader/Android.bp
+++ b/libnativeloader/Android.bp
@@ -47,10 +47,6 @@
             ],
         },
     },
-    required: [
-        "llndk.libraries.txt",
-        "vndksp.libraries.txt",
-    ],
     stubs: {
         symbol_file: "libnativeloader.map.txt",
         versions: ["1"],
diff --git a/libnativeloader/public_libraries.cpp b/libnativeloader/public_libraries.cpp
index 277d2c9..d244f37 100644
--- a/libnativeloader/public_libraries.cpp
+++ b/libnativeloader/public_libraries.cpp
@@ -50,8 +50,8 @@
 constexpr const char* kExtendedPublicLibrariesFilePrefix = "public.libraries-";
 constexpr const char* kExtendedPublicLibrariesFileSuffix = ".txt";
 constexpr const char* kVendorPublicLibrariesFile = "/vendor/etc/public.libraries.txt";
-constexpr const char* kLlndkLibrariesFile = "/system/etc/llndk.libraries.txt";
-constexpr const char* kVndkLibrariesFile = "/system/etc/vndksp.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";
 
 const std::vector<const std::string> kArtApexPublicLibraries = {
     "libicuuc.so",
@@ -78,11 +78,13 @@
 }
 
 std::string vndk_version_str(bool use_product_vndk) {
-  static std::string version = get_vndk_version(use_product_vndk);
-  if (version != "" && version != "current") {
-    return "." + version;
+  if (use_product_vndk) {
+    static std::string product_vndk_version = get_vndk_version(true);
+    return product_vndk_version;
+  } else {
+    static std::string vendor_vndk_version = get_vndk_version(false);
+    return vendor_vndk_version;
   }
-  return "";
 }
 
 // For debuggable platform builds use ANDROID_ADDITIONAL_PUBLIC_LIBRARIES environment
@@ -95,13 +97,15 @@
   return "";
 }
 
+// insert vndk version in every {} placeholder
 void InsertVndkVersionStr(std::string* file_name, bool use_product_vndk) {
   CHECK(file_name != nullptr);
-  size_t insert_pos = file_name->find_last_of(".");
-  if (insert_pos == std::string::npos) {
-    insert_pos = file_name->length();
+  auto version = vndk_version_str(use_product_vndk);
+  size_t pos = file_name->find("{}");
+  while (pos != std::string::npos) {
+    file_name->replace(pos, 2, version);
+    pos = file_name->find("{}", pos + version.size());
   }
-  file_name->insert(insert_pos, vndk_version_str(use_product_vndk));
 }
 
 const std::function<Result<bool>(const struct ConfigEntry&)> always_true =
@@ -258,7 +262,7 @@
   InsertVndkVersionStr(&config_file, false);
   auto sonames = ReadConfig(config_file, always_true);
   if (!sonames.ok()) {
-    LOG_ALWAYS_FATAL("%s", sonames.error().message().c_str());
+    LOG_ALWAYS_FATAL("%s: %s", config_file.c_str(), sonames.error().message().c_str());
     return "";
   }
   return android::base::Join(*sonames, ':');
@@ -269,7 +273,7 @@
   InsertVndkVersionStr(&config_file, true);
   auto sonames = ReadConfig(config_file, always_true);
   if (!sonames.ok()) {
-    LOG_ALWAYS_FATAL("%s", sonames.error().message().c_str());
+    LOG_ALWAYS_FATAL("%s: %s", config_file.c_str(), sonames.error().message().c_str());
     return "";
   }
   return android::base::Join(*sonames, ':');