summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Justin Yun <justinyun@google.com> 2021-08-10 14:05:49 +0900
committer Treehugger Robot <treehugger-gerrit@google.com> 2021-08-17 00:49:38 +0000
commita21b58476a530d47532af28c0f909fb9a3aedcbf (patch)
tree6ec0af4828245affb1556ce8e5249e56d3f5ded9
parentfb3ad7201bf2d9154862e347e960df376ac04c3c (diff)
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
-rw-r--r--libnativeloader/library_namespaces.cpp26
-rw-r--r--libnativeloader/native_loader_test.cpp7
-rw-r--r--libnativeloader/native_loader_test.h1
-rw-r--r--libnativeloader/public_libraries.cpp19
-rw-r--r--libnativeloader/public_libraries.h1
5 files changed, 53 insertions, 1 deletions
diff --git a/libnativeloader/library_namespaces.cpp b/libnativeloader/library_namespaces.cpp
index 8b87338fba..585e98a587 100644
--- a/libnativeloader/library_namespaces.cpp
+++ b/libnativeloader/library_namespaces.cpp
@@ -47,7 +47,12 @@ constexpr const char* kApexPath = "/apex/";
// to use to load vendor libraries to separate namespace with controlled interface between
// vendor and system namespaces.
constexpr const char* kVendorNamespaceName = "sphal";
+// Similar to sphal namespace, product namespace provides some product libraries.
+constexpr const char* kProductNamespaceName = "product";
+
+// vndk namespace for unbundled vendor apps
constexpr const char* kVndkNamespaceName = "vndk";
+// vndk_product namespace for unbundled product apps
constexpr const char* kVndkProductNamespaceName = "vndk_product";
// classloader-namespace is a linker namespace that is created for the loaded
@@ -374,6 +379,27 @@ Result<NativeLoaderNamespace*> LibraryNamespaces::Create(JNIEnv* env, uint32_t t
}
}
+ auto product_libs = filter_public_libraries(target_sdk_version, uses_libraries,
+ product_public_libraries());
+ if (!product_libs.empty()) {
+ auto target_ns = system_ns;
+ if (is_product_vndk_version_defined()) {
+ // If ro.product.vndk.version is defined, product namespace provides the product libraries.
+ target_ns = NativeLoaderNamespace::GetExportedNamespace(kProductNamespaceName, is_bridged);
+ }
+ if (target_ns.ok()) {
+ linked = app_ns->Link(&target_ns.value(), product_libs);
+ if (!linked.ok()) {
+ return linked.error();
+ }
+ } else {
+ // The linkerconfig must have a problem on defining the product namespace in the system
+ // section. Skip linking product namespace. This will not affect most of the apps. Only the
+ // apps that requires the product public libraries will fail.
+ ALOGW("Namespace for product libs not found: %s", target_ns.error().message().c_str());
+ }
+ }
+
auto& emplaced = namespaces_.emplace_back(
std::make_pair(env->NewWeakGlobalRef(class_loader), *app_ns));
if (is_main_classloader) {
diff --git a/libnativeloader/native_loader_test.cpp b/libnativeloader/native_loader_test.cpp
index c1dd4aaf1d..878b9f8f1f 100644
--- a/libnativeloader/native_loader_test.cpp
+++ b/libnativeloader/native_loader_test.cpp
@@ -190,6 +190,7 @@ class NativeLoaderTest_Create : public NativeLoaderTest {
bool expected_link_with_i18n_ns = true;
bool expected_link_with_conscrypt_ns = false;
bool expected_link_with_sphal_ns = !vendor_public_libraries().empty();
+ bool expected_link_with_product_ns = !product_public_libraries().empty();
bool expected_link_with_vndk_ns = false;
bool expected_link_with_vndk_product_ns = false;
bool expected_link_with_default_ns = false;
@@ -199,6 +200,7 @@ class NativeLoaderTest_Create : public NativeLoaderTest {
std::string expected_shared_libs_to_i18n_ns = apex_public_libraries().at("com_android_i18n");
std::string expected_shared_libs_to_conscrypt_ns = apex_jni_libraries("com_android_conscrypt");
std::string expected_shared_libs_to_sphal_ns = vendor_public_libraries();
+ std::string expected_shared_libs_to_product_ns = product_public_libraries();
std::string expected_shared_libs_to_vndk_ns = vndksp_libraries_vendor();
std::string expected_shared_libs_to_vndk_product_ns = vndksp_libraries_product();
std::string expected_shared_libs_to_default_ns = default_public_libraries();
@@ -237,6 +239,11 @@ class NativeLoaderTest_Create : public NativeLoaderTest {
StrEq(expected_shared_libs_to_sphal_ns)))
.WillOnce(Return(true));
}
+ if (expected_link_with_product_ns) {
+ EXPECT_CALL(*mock, mock_link_namespaces(Eq(IsBridged()), _, NsEq("product"),
+ StrEq(expected_shared_libs_to_product_ns)))
+ .WillOnce(Return(true));
+ }
if (expected_link_with_vndk_ns) {
EXPECT_CALL(*mock, mock_link_namespaces(Eq(IsBridged()), _, NsEq("vndk"),
StrEq(expected_shared_libs_to_vndk_ns)))
diff --git a/libnativeloader/native_loader_test.h b/libnativeloader/native_loader_test.h
index 09c56e56f5..5c51f00e82 100644
--- a/libnativeloader/native_loader_test.h
+++ b/libnativeloader/native_loader_test.h
@@ -87,6 +87,7 @@ static std::unordered_map<std::string, Platform::mock_namespace_handle> namespac
NAMESPACE_ENTRY("default"),
NAMESPACE_ENTRY("sphal"),
+ NAMESPACE_ENTRY("product"),
NAMESPACE_ENTRY("system"),
NAMESPACE_ENTRY("vndk"),
NAMESPACE_ENTRY("vndk_product"),
diff --git a/libnativeloader/public_libraries.cpp b/libnativeloader/public_libraries.cpp
index 9d7124fc26..55714167e6 100644
--- a/libnativeloader/public_libraries.cpp
+++ b/libnativeloader/public_libraries.cpp
@@ -55,6 +55,7 @@ constexpr const char* kExtendedPublicLibrariesFilePrefix = "public.libraries-";
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 @@ static std::string InitVendorPublicLibraries() {
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 @@ static std::string InitExtendedPublicLibraries() {
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 @@ const std::string& vendor_public_libraries() {
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;
diff --git a/libnativeloader/public_libraries.h b/libnativeloader/public_libraries.h
index 71c1b8fffb..6f5a13c9b3 100644
--- a/libnativeloader/public_libraries.h
+++ b/libnativeloader/public_libraries.h
@@ -33,6 +33,7 @@ using android::base::Result;
const std::string& preloadable_public_libraries();
const std::string& default_public_libraries();
const std::string& vendor_public_libraries();
+const std::string& product_public_libraries();
const std::string& extended_public_libraries();
const std::string& llndk_libraries_product();
const std::string& llndk_libraries_vendor();