Loading libcutils/fs_config.cpp +5 −2 Original line number Original line Diff line number Diff line Loading @@ -80,6 +80,7 @@ static const struct fs_path_config android_dirs[] = { { 00775, AID_ROOT, AID_ROOT, 0, "data/preloads" }, { 00775, AID_ROOT, AID_ROOT, 0, "data/preloads" }, { 00771, AID_SYSTEM, AID_SYSTEM, 0, "data" }, { 00771, AID_SYSTEM, AID_SYSTEM, 0, "data" }, { 00755, AID_ROOT, AID_SYSTEM, 0, "mnt" }, { 00755, AID_ROOT, AID_SYSTEM, 0, "mnt" }, { 00755, AID_ROOT, AID_SHELL, 0, "product/bin" }, { 00750, AID_ROOT, AID_SHELL, 0, "sbin" }, { 00750, AID_ROOT, AID_SHELL, 0, "sbin" }, { 00777, AID_ROOT, AID_ROOT, 0, "sdcard" }, { 00777, AID_ROOT, AID_ROOT, 0, "sdcard" }, { 00751, AID_ROOT, AID_SDCARD_R, 0, "storage" }, { 00751, AID_ROOT, AID_SDCARD_R, 0, "storage" }, Loading Loading @@ -195,6 +196,7 @@ static const struct fs_path_config android_files[] = { { 00755, AID_ROOT, AID_ROOT, 0, "bin/*" }, { 00755, AID_ROOT, AID_ROOT, 0, "bin/*" }, { 00640, AID_ROOT, AID_SHELL, 0, "fstab.*" }, { 00640, AID_ROOT, AID_SHELL, 0, "fstab.*" }, { 00750, AID_ROOT, AID_SHELL, 0, "init*" }, { 00750, AID_ROOT, AID_SHELL, 0, "init*" }, { 00755, AID_ROOT, AID_SHELL, 0, "product/bin/*" }, { 00750, AID_ROOT, AID_SHELL, 0, "sbin/*" }, { 00750, AID_ROOT, AID_SHELL, 0, "sbin/*" }, { 00755, AID_ROOT, AID_SHELL, 0, "system/bin/*" }, { 00755, AID_ROOT, AID_SHELL, 0, "system/bin/*" }, { 00755, AID_ROOT, AID_ROOT, 0, "system/lib/valgrind/*" }, { 00755, AID_ROOT, AID_ROOT, 0, "system/lib/valgrind/*" }, Loading Loading @@ -237,9 +239,10 @@ static int fs_config_open(int dir, int which, const char* target_out_path) { return fd; return fd; } } // if path is "vendor/<stuff>", "oem/<stuff>" or "odm/<stuff>" // if path is "odm/<stuff>", "oem/<stuff>", "product/<stuff>" or // "vendor/<stuff>" static bool is_partition(const char* path, size_t len) { static bool is_partition(const char* path, size_t len) { static const char* partitions[] = {"vendor/", "oem/", "odm/"}; static const char* partitions[] = {"odm/", "oem/", "product/", "vendor/"}; for (size_t i = 0; i < (sizeof(partitions) / sizeof(partitions[0])); ++i) { for (size_t i = 0; i < (sizeof(partitions) / sizeof(partitions[0])); ++i) { size_t plen = strlen(partitions[i]); size_t plen = strlen(partitions[i]); if (len <= plen) continue; if (len <= plen) continue; Loading libnativeloader/native_loader.cpp +53 −33 Original line number Original line Diff line number Diff line Loading @@ -46,6 +46,8 @@ "%s:%d: %s CHECK '" #predicate "' failed.",\ "%s:%d: %s CHECK '" #predicate "' failed.",\ __FILE__, __LINE__, __FUNCTION__) __FILE__, __LINE__, __FUNCTION__) using namespace std::string_literals; namespace android { namespace android { #if defined(__ANDROID__) #if defined(__ANDROID__) Loading Loading @@ -236,10 +238,15 @@ class LibraryNamespaces { // Different name is useful for debugging // Different name is useful for debugging namespace_name = kVendorClassloaderNamespaceName; namespace_name = kVendorClassloaderNamespaceName; ALOGD("classloader namespace configured for unbundled vendor apk. library_path=%s", library_path.c_str()); ALOGD("classloader namespace configured for unbundled vendor apk. library_path=%s", library_path.c_str()); } else if (!oem_public_libraries_.empty()) { } else { // oem_public_libraries are NOT available to vendor apks, otherwise it // oem and product public libraries are NOT available to vendor apks, otherwise it // would be system->vendor violation. // would be system->vendor violation. system_exposed_libraries = system_exposed_libraries + ":" + oem_public_libraries_.c_str(); if (!oem_public_libraries_.empty()) { system_exposed_libraries = system_exposed_libraries + ':' + oem_public_libraries_; } if (!product_public_libraries_.empty()) { system_exposed_libraries = system_exposed_libraries + ':' + product_public_libraries_; } } } NativeLoaderNamespace native_loader_ns; NativeLoaderNamespace native_loader_ns; Loading Loading @@ -351,6 +358,8 @@ class LibraryNamespaces { std::string vndksp_native_libraries_system_config = std::string vndksp_native_libraries_system_config = root_dir + kVndkspNativeLibrariesSystemConfigPathFromRoot; root_dir + kVndkspNativeLibrariesSystemConfigPathFromRoot; std::string product_public_native_libraries_dir = "/product/etc"; std::string error_msg; std::string error_msg; LOG_ALWAYS_FATAL_IF( LOG_ALWAYS_FATAL_IF( !ReadConfig(public_native_libraries_system_config, &sonames, always_true, &error_msg), !ReadConfig(public_native_libraries_system_config, &sonames, always_true, &error_msg), Loading @@ -373,7 +382,7 @@ class LibraryNamespaces { // // // TODO(dimitry): this is a bit misleading since we do not know // TODO(dimitry): this is a bit misleading since we do not know // if the vendor public library is going to be opened from /vendor/lib // if the vendor public library is going to be opened from /vendor/lib // we might as well end up loading them from /system/lib // we might as well end up loading them from /system/lib or /product/lib // For now we rely on CTS test to catch things like this but // For now we rely on CTS test to catch things like this but // it should probably be addressed in the future. // it should probably be addressed in the future. for (const auto& soname : sonames) { for (const auto& soname : sonames) { Loading @@ -387,13 +396,43 @@ class LibraryNamespaces { // system libs that are exposed to apps. The libs in the txt files must be // system libs that are exposed to apps. The libs in the txt files must be // named as lib<name>.<companyname>.so. // named as lib<name>.<companyname>.so. sonames.clear(); sonames.clear(); std::string dirname = base::Dirname(public_native_libraries_system_config); ReadExtensionLibraries(base::Dirname(public_native_libraries_system_config).c_str(), &sonames); std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(dirname.c_str()), closedir); oem_public_libraries_ = base::Join(sonames, ':'); // read /product/etc/public.libraries-<companyname>.txt which contain partner defined // product libs that are exposed to apps. sonames.clear(); ReadExtensionLibraries(product_public_native_libraries_dir.c_str(), &sonames); product_public_libraries_ = base::Join(sonames, ':'); // Insert VNDK version to llndk and vndksp config file names. insert_vndk_version_str(&llndk_native_libraries_system_config); insert_vndk_version_str(&vndksp_native_libraries_system_config); sonames.clear(); ReadConfig(llndk_native_libraries_system_config, &sonames, always_true); system_llndk_libraries_ = base::Join(sonames, ':'); sonames.clear(); ReadConfig(vndksp_native_libraries_system_config, &sonames, always_true); system_vndksp_libraries_ = base::Join(sonames, ':'); sonames.clear(); // This file is optional, quietly ignore if the file does not exist. ReadConfig(kPublicNativeLibrariesVendorConfig, &sonames, always_true, nullptr); vendor_public_libraries_ = base::Join(sonames, ':'); } void Reset() { namespaces_.clear(); } private: void ReadExtensionLibraries(const char* dirname, std::vector<std::string>* sonames) { std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(dirname), closedir); if (dir != nullptr) { if (dir != nullptr) { // Failing to opening the dir is not an error, which can happen in // Failing to opening the dir is not an error, which can happen in // webview_zygote. // webview_zygote. struct dirent* ent; while (struct dirent* ent = readdir(dir.get())) { while ((ent = readdir(dir.get())) != nullptr) { if (ent->d_type != DT_REG && ent->d_type != DT_LNK) { if (ent->d_type != DT_REG && ent->d_type != DT_LNK) { continue; continue; } } Loading @@ -403,14 +442,17 @@ class LibraryNamespaces { const size_t start = kPublicNativeLibrariesExtensionConfigPrefixLen; const size_t start = kPublicNativeLibrariesExtensionConfigPrefixLen; const size_t end = filename.size() - kPublicNativeLibrariesExtensionConfigSuffixLen; const size_t end = filename.size() - kPublicNativeLibrariesExtensionConfigSuffixLen; const std::string company_name = filename.substr(start, end - start); const std::string company_name = filename.substr(start, end - start); const std::string config_file_path = dirname + "/" + filename; const std::string config_file_path = dirname + "/"s + filename; LOG_ALWAYS_FATAL_IF( LOG_ALWAYS_FATAL_IF( company_name.empty(), company_name.empty(), "Error extracting company name from public native library list file path \"%s\"", "Error extracting company name from public native library list file path \"%s\"", config_file_path.c_str()); config_file_path.c_str()); std::string error_msg; LOG_ALWAYS_FATAL_IF( LOG_ALWAYS_FATAL_IF( !ReadConfig( !ReadConfig( config_file_path, &sonames, config_file_path, sonames, [&company_name](const std::string& soname, std::string* error_msg) { [&company_name](const std::string& soname, std::string* error_msg) { if (android::base::StartsWith(soname, "lib") && if (android::base::StartsWith(soname, "lib") && android::base::EndsWith(soname, "." + company_name + ".so")) { android::base::EndsWith(soname, "." + company_name + ".so")) { Loading @@ -427,32 +469,9 @@ class LibraryNamespaces { } } } } } } oem_public_libraries_ = base::Join(sonames, ':'); // Insert VNDK version to llndk and vndksp config file names. insert_vndk_version_str(&llndk_native_libraries_system_config); insert_vndk_version_str(&vndksp_native_libraries_system_config); sonames.clear(); ReadConfig(llndk_native_libraries_system_config, &sonames, always_true); system_llndk_libraries_ = base::Join(sonames, ':'); sonames.clear(); ReadConfig(vndksp_native_libraries_system_config, &sonames, always_true); system_vndksp_libraries_ = base::Join(sonames, ':'); sonames.clear(); // This file is optional, quietly ignore if the file does not exist. ReadConfig(kPublicNativeLibrariesVendorConfig, &sonames, always_true, nullptr); vendor_public_libraries_ = base::Join(sonames, ':'); } } void Reset() { namespaces_.clear(); } private: bool ReadConfig(const std::string& configFile, std::vector<std::string>* sonames, bool ReadConfig(const std::string& configFile, std::vector<std::string>* sonames, const std::function<bool(const std::string& /* soname */, const std::function<bool(const std::string& /* soname */, std::string* /* error_msg */)>& check_soname, std::string* /* error_msg */)>& check_soname, Loading Loading @@ -559,6 +578,7 @@ class LibraryNamespaces { std::string system_public_libraries_; std::string system_public_libraries_; std::string vendor_public_libraries_; std::string vendor_public_libraries_; std::string oem_public_libraries_; std::string oem_public_libraries_; std::string product_public_libraries_; std::string system_llndk_libraries_; std::string system_llndk_libraries_; std::string system_vndksp_libraries_; std::string system_vndksp_libraries_; Loading libnativeloader/test/Android.bp +20 −0 Original line number Original line Diff line number Diff line Loading @@ -49,3 +49,23 @@ cc_library { "libbase", "libbase", ], ], } } cc_library { name: "libfoo.product1", srcs: ["test.cpp"], cflags: ["-DLIBNAME=\"libfoo.product1.so\""], product_specific: true, shared_libs: [ "libbase", ], } cc_library { name: "libbar.product1", srcs: ["test.cpp"], cflags: ["-DLIBNAME=\"libbar.product1.so\""], product_specific: true, shared_libs: [ "libbase", ], } libnativeloader/test/Android.mk +7 −0 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,13 @@ LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT_ETC) LOCAL_MODULE_PATH := $(TARGET_OUT_ETC) include $(BUILD_PREBUILT) include $(BUILD_PREBUILT) include $(CLEAR_VARS) LOCAL_MODULE := public.libraries-product1.txt LOCAL_SRC_FILES:= $(LOCAL_MODULE) LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT_PRODUCT_ETC) include $(BUILD_PREBUILT) include $(CLEAR_VARS) include $(CLEAR_VARS) LOCAL_PACKAGE_NAME := oemlibrarytest-system LOCAL_PACKAGE_NAME := oemlibrarytest-system LOCAL_MODULE_TAGS := tests LOCAL_MODULE_TAGS := tests Loading libnativeloader/test/public.libraries-product1.txt 0 → 100644 +2 −0 Original line number Original line Diff line number Diff line libfoo.product1.so libbar.product1.so Loading
libcutils/fs_config.cpp +5 −2 Original line number Original line Diff line number Diff line Loading @@ -80,6 +80,7 @@ static const struct fs_path_config android_dirs[] = { { 00775, AID_ROOT, AID_ROOT, 0, "data/preloads" }, { 00775, AID_ROOT, AID_ROOT, 0, "data/preloads" }, { 00771, AID_SYSTEM, AID_SYSTEM, 0, "data" }, { 00771, AID_SYSTEM, AID_SYSTEM, 0, "data" }, { 00755, AID_ROOT, AID_SYSTEM, 0, "mnt" }, { 00755, AID_ROOT, AID_SYSTEM, 0, "mnt" }, { 00755, AID_ROOT, AID_SHELL, 0, "product/bin" }, { 00750, AID_ROOT, AID_SHELL, 0, "sbin" }, { 00750, AID_ROOT, AID_SHELL, 0, "sbin" }, { 00777, AID_ROOT, AID_ROOT, 0, "sdcard" }, { 00777, AID_ROOT, AID_ROOT, 0, "sdcard" }, { 00751, AID_ROOT, AID_SDCARD_R, 0, "storage" }, { 00751, AID_ROOT, AID_SDCARD_R, 0, "storage" }, Loading Loading @@ -195,6 +196,7 @@ static const struct fs_path_config android_files[] = { { 00755, AID_ROOT, AID_ROOT, 0, "bin/*" }, { 00755, AID_ROOT, AID_ROOT, 0, "bin/*" }, { 00640, AID_ROOT, AID_SHELL, 0, "fstab.*" }, { 00640, AID_ROOT, AID_SHELL, 0, "fstab.*" }, { 00750, AID_ROOT, AID_SHELL, 0, "init*" }, { 00750, AID_ROOT, AID_SHELL, 0, "init*" }, { 00755, AID_ROOT, AID_SHELL, 0, "product/bin/*" }, { 00750, AID_ROOT, AID_SHELL, 0, "sbin/*" }, { 00750, AID_ROOT, AID_SHELL, 0, "sbin/*" }, { 00755, AID_ROOT, AID_SHELL, 0, "system/bin/*" }, { 00755, AID_ROOT, AID_SHELL, 0, "system/bin/*" }, { 00755, AID_ROOT, AID_ROOT, 0, "system/lib/valgrind/*" }, { 00755, AID_ROOT, AID_ROOT, 0, "system/lib/valgrind/*" }, Loading Loading @@ -237,9 +239,10 @@ static int fs_config_open(int dir, int which, const char* target_out_path) { return fd; return fd; } } // if path is "vendor/<stuff>", "oem/<stuff>" or "odm/<stuff>" // if path is "odm/<stuff>", "oem/<stuff>", "product/<stuff>" or // "vendor/<stuff>" static bool is_partition(const char* path, size_t len) { static bool is_partition(const char* path, size_t len) { static const char* partitions[] = {"vendor/", "oem/", "odm/"}; static const char* partitions[] = {"odm/", "oem/", "product/", "vendor/"}; for (size_t i = 0; i < (sizeof(partitions) / sizeof(partitions[0])); ++i) { for (size_t i = 0; i < (sizeof(partitions) / sizeof(partitions[0])); ++i) { size_t plen = strlen(partitions[i]); size_t plen = strlen(partitions[i]); if (len <= plen) continue; if (len <= plen) continue; Loading
libnativeloader/native_loader.cpp +53 −33 Original line number Original line Diff line number Diff line Loading @@ -46,6 +46,8 @@ "%s:%d: %s CHECK '" #predicate "' failed.",\ "%s:%d: %s CHECK '" #predicate "' failed.",\ __FILE__, __LINE__, __FUNCTION__) __FILE__, __LINE__, __FUNCTION__) using namespace std::string_literals; namespace android { namespace android { #if defined(__ANDROID__) #if defined(__ANDROID__) Loading Loading @@ -236,10 +238,15 @@ class LibraryNamespaces { // Different name is useful for debugging // Different name is useful for debugging namespace_name = kVendorClassloaderNamespaceName; namespace_name = kVendorClassloaderNamespaceName; ALOGD("classloader namespace configured for unbundled vendor apk. library_path=%s", library_path.c_str()); ALOGD("classloader namespace configured for unbundled vendor apk. library_path=%s", library_path.c_str()); } else if (!oem_public_libraries_.empty()) { } else { // oem_public_libraries are NOT available to vendor apks, otherwise it // oem and product public libraries are NOT available to vendor apks, otherwise it // would be system->vendor violation. // would be system->vendor violation. system_exposed_libraries = system_exposed_libraries + ":" + oem_public_libraries_.c_str(); if (!oem_public_libraries_.empty()) { system_exposed_libraries = system_exposed_libraries + ':' + oem_public_libraries_; } if (!product_public_libraries_.empty()) { system_exposed_libraries = system_exposed_libraries + ':' + product_public_libraries_; } } } NativeLoaderNamespace native_loader_ns; NativeLoaderNamespace native_loader_ns; Loading Loading @@ -351,6 +358,8 @@ class LibraryNamespaces { std::string vndksp_native_libraries_system_config = std::string vndksp_native_libraries_system_config = root_dir + kVndkspNativeLibrariesSystemConfigPathFromRoot; root_dir + kVndkspNativeLibrariesSystemConfigPathFromRoot; std::string product_public_native_libraries_dir = "/product/etc"; std::string error_msg; std::string error_msg; LOG_ALWAYS_FATAL_IF( LOG_ALWAYS_FATAL_IF( !ReadConfig(public_native_libraries_system_config, &sonames, always_true, &error_msg), !ReadConfig(public_native_libraries_system_config, &sonames, always_true, &error_msg), Loading @@ -373,7 +382,7 @@ class LibraryNamespaces { // // // TODO(dimitry): this is a bit misleading since we do not know // TODO(dimitry): this is a bit misleading since we do not know // if the vendor public library is going to be opened from /vendor/lib // if the vendor public library is going to be opened from /vendor/lib // we might as well end up loading them from /system/lib // we might as well end up loading them from /system/lib or /product/lib // For now we rely on CTS test to catch things like this but // For now we rely on CTS test to catch things like this but // it should probably be addressed in the future. // it should probably be addressed in the future. for (const auto& soname : sonames) { for (const auto& soname : sonames) { Loading @@ -387,13 +396,43 @@ class LibraryNamespaces { // system libs that are exposed to apps. The libs in the txt files must be // system libs that are exposed to apps. The libs in the txt files must be // named as lib<name>.<companyname>.so. // named as lib<name>.<companyname>.so. sonames.clear(); sonames.clear(); std::string dirname = base::Dirname(public_native_libraries_system_config); ReadExtensionLibraries(base::Dirname(public_native_libraries_system_config).c_str(), &sonames); std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(dirname.c_str()), closedir); oem_public_libraries_ = base::Join(sonames, ':'); // read /product/etc/public.libraries-<companyname>.txt which contain partner defined // product libs that are exposed to apps. sonames.clear(); ReadExtensionLibraries(product_public_native_libraries_dir.c_str(), &sonames); product_public_libraries_ = base::Join(sonames, ':'); // Insert VNDK version to llndk and vndksp config file names. insert_vndk_version_str(&llndk_native_libraries_system_config); insert_vndk_version_str(&vndksp_native_libraries_system_config); sonames.clear(); ReadConfig(llndk_native_libraries_system_config, &sonames, always_true); system_llndk_libraries_ = base::Join(sonames, ':'); sonames.clear(); ReadConfig(vndksp_native_libraries_system_config, &sonames, always_true); system_vndksp_libraries_ = base::Join(sonames, ':'); sonames.clear(); // This file is optional, quietly ignore if the file does not exist. ReadConfig(kPublicNativeLibrariesVendorConfig, &sonames, always_true, nullptr); vendor_public_libraries_ = base::Join(sonames, ':'); } void Reset() { namespaces_.clear(); } private: void ReadExtensionLibraries(const char* dirname, std::vector<std::string>* sonames) { std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(dirname), closedir); if (dir != nullptr) { if (dir != nullptr) { // Failing to opening the dir is not an error, which can happen in // Failing to opening the dir is not an error, which can happen in // webview_zygote. // webview_zygote. struct dirent* ent; while (struct dirent* ent = readdir(dir.get())) { while ((ent = readdir(dir.get())) != nullptr) { if (ent->d_type != DT_REG && ent->d_type != DT_LNK) { if (ent->d_type != DT_REG && ent->d_type != DT_LNK) { continue; continue; } } Loading @@ -403,14 +442,17 @@ class LibraryNamespaces { const size_t start = kPublicNativeLibrariesExtensionConfigPrefixLen; const size_t start = kPublicNativeLibrariesExtensionConfigPrefixLen; const size_t end = filename.size() - kPublicNativeLibrariesExtensionConfigSuffixLen; const size_t end = filename.size() - kPublicNativeLibrariesExtensionConfigSuffixLen; const std::string company_name = filename.substr(start, end - start); const std::string company_name = filename.substr(start, end - start); const std::string config_file_path = dirname + "/" + filename; const std::string config_file_path = dirname + "/"s + filename; LOG_ALWAYS_FATAL_IF( LOG_ALWAYS_FATAL_IF( company_name.empty(), company_name.empty(), "Error extracting company name from public native library list file path \"%s\"", "Error extracting company name from public native library list file path \"%s\"", config_file_path.c_str()); config_file_path.c_str()); std::string error_msg; LOG_ALWAYS_FATAL_IF( LOG_ALWAYS_FATAL_IF( !ReadConfig( !ReadConfig( config_file_path, &sonames, config_file_path, sonames, [&company_name](const std::string& soname, std::string* error_msg) { [&company_name](const std::string& soname, std::string* error_msg) { if (android::base::StartsWith(soname, "lib") && if (android::base::StartsWith(soname, "lib") && android::base::EndsWith(soname, "." + company_name + ".so")) { android::base::EndsWith(soname, "." + company_name + ".so")) { Loading @@ -427,32 +469,9 @@ class LibraryNamespaces { } } } } } } oem_public_libraries_ = base::Join(sonames, ':'); // Insert VNDK version to llndk and vndksp config file names. insert_vndk_version_str(&llndk_native_libraries_system_config); insert_vndk_version_str(&vndksp_native_libraries_system_config); sonames.clear(); ReadConfig(llndk_native_libraries_system_config, &sonames, always_true); system_llndk_libraries_ = base::Join(sonames, ':'); sonames.clear(); ReadConfig(vndksp_native_libraries_system_config, &sonames, always_true); system_vndksp_libraries_ = base::Join(sonames, ':'); sonames.clear(); // This file is optional, quietly ignore if the file does not exist. ReadConfig(kPublicNativeLibrariesVendorConfig, &sonames, always_true, nullptr); vendor_public_libraries_ = base::Join(sonames, ':'); } } void Reset() { namespaces_.clear(); } private: bool ReadConfig(const std::string& configFile, std::vector<std::string>* sonames, bool ReadConfig(const std::string& configFile, std::vector<std::string>* sonames, const std::function<bool(const std::string& /* soname */, const std::function<bool(const std::string& /* soname */, std::string* /* error_msg */)>& check_soname, std::string* /* error_msg */)>& check_soname, Loading Loading @@ -559,6 +578,7 @@ class LibraryNamespaces { std::string system_public_libraries_; std::string system_public_libraries_; std::string vendor_public_libraries_; std::string vendor_public_libraries_; std::string oem_public_libraries_; std::string oem_public_libraries_; std::string product_public_libraries_; std::string system_llndk_libraries_; std::string system_llndk_libraries_; std::string system_vndksp_libraries_; std::string system_vndksp_libraries_; Loading
libnativeloader/test/Android.bp +20 −0 Original line number Original line Diff line number Diff line Loading @@ -49,3 +49,23 @@ cc_library { "libbase", "libbase", ], ], } } cc_library { name: "libfoo.product1", srcs: ["test.cpp"], cflags: ["-DLIBNAME=\"libfoo.product1.so\""], product_specific: true, shared_libs: [ "libbase", ], } cc_library { name: "libbar.product1", srcs: ["test.cpp"], cflags: ["-DLIBNAME=\"libbar.product1.so\""], product_specific: true, shared_libs: [ "libbase", ], }
libnativeloader/test/Android.mk +7 −0 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,13 @@ LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT_ETC) LOCAL_MODULE_PATH := $(TARGET_OUT_ETC) include $(BUILD_PREBUILT) include $(BUILD_PREBUILT) include $(CLEAR_VARS) LOCAL_MODULE := public.libraries-product1.txt LOCAL_SRC_FILES:= $(LOCAL_MODULE) LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT_PRODUCT_ETC) include $(BUILD_PREBUILT) include $(CLEAR_VARS) include $(CLEAR_VARS) LOCAL_PACKAGE_NAME := oemlibrarytest-system LOCAL_PACKAGE_NAME := oemlibrarytest-system LOCAL_MODULE_TAGS := tests LOCAL_MODULE_TAGS := tests Loading
libnativeloader/test/public.libraries-product1.txt 0 → 100644 +2 −0 Original line number Original line Diff line number Diff line libfoo.product1.so libbar.product1.so