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;