diff options
Diffstat (limited to 'libnativeloader/public_libraries.cpp')
| -rw-r--r-- | libnativeloader/public_libraries.cpp | 93 |
1 files changed, 64 insertions, 29 deletions
diff --git a/libnativeloader/public_libraries.cpp b/libnativeloader/public_libraries.cpp index 433a9095ef..896c5c7106 100644 --- a/libnativeloader/public_libraries.cpp +++ b/libnativeloader/public_libraries.cpp @@ -46,7 +46,6 @@ using android::base::Result; using internal::ConfigEntry; using internal::ParseConfig; using internal::ParseApexLibrariesConfig; -using std::literals::string_literals::operator""s; namespace { @@ -117,7 +116,7 @@ void ReadExtensionLibraries(const char* dirname, std::vector<std::string>* sonam if (android::base::ConsumePrefix(&fn, kExtendedPublicLibrariesFilePrefix) && android::base::ConsumeSuffix(&fn, kExtendedPublicLibrariesFileSuffix)) { const std::string company_name(fn); - const std::string config_file_path = dirname + "/"s + filename; + const std::string config_file_path = std::string(dirname) + std::string("/") + filename; LOG_ALWAYS_FATAL_IF( company_name.empty(), "Error extracting company name from public native library list file path \"%s\"", @@ -129,8 +128,11 @@ void ReadExtensionLibraries(const char* dirname, std::vector<std::string>* sonam android::base::EndsWith(entry.soname, "." + company_name + ".so")) { return true; } else { - return Errorf("Library name \"{}\" does not end with the company name {}.", - entry.soname, company_name); + return Errorf( + "Library name \"{}\" does not start with \"lib\" and/or " + "does not end with the company name \"{}\".", + entry.soname, + company_name); } }); if (ret.ok()) { @@ -161,28 +163,36 @@ static std::string InitDefaultPublicLibraries(bool for_preload) { } // If this is for preloading libs, don't remove the libs from APEXes. - if (for_preload) { - return android::base::Join(*sonames, ':'); + if (!for_preload) { + // Remove the public libs provided by apexes because these libs are available + // from apex namespaces. + for (const auto& p : apex_public_libraries()) { + auto public_libs = base::Split(p.second, ":"); + sonames->erase(std::remove_if(sonames->begin(), + sonames->end(), + [&public_libs](const std::string& v) { + return std::find(public_libs.begin(), public_libs.end(), v) != + public_libs.end(); + }), + sonames->end()); + } } - // Remove the public libs provided by apexes because these libs are available - // from apex namespaces. - for (const auto& p : apex_public_libraries()) { - auto public_libs = base::Split(p.second, ":"); - sonames->erase(std::remove_if(sonames->begin(), sonames->end(), [&public_libs](const std::string& v) { - return std::find(public_libs.begin(), public_libs.end(), v) != public_libs.end(); - }), sonames->end()); - } - return android::base::Join(*sonames, ':'); + std::string libs = android::base::Join(*sonames, ':'); + ALOGD("InitDefaultPublicLibraries for_preload=%d: %s", for_preload, libs.c_str()); + return libs; } static std::string InitVendorPublicLibraries() { // This file is optional, quietly ignore if the file does not exist. auto sonames = ReadConfig(kVendorPublicLibrariesFile, always_true); if (!sonames.ok()) { + ALOGI("InitVendorPublicLibraries skipped: %s", sonames.error().message().c_str()); return ""; } - return android::base::Join(*sonames, ':'); + std::string libs = android::base::Join(*sonames, ':'); + ALOGD("InitVendorPublicLibraries: %s", libs.c_str()); + return libs; } // If ro.product.vndk.version is defined, /product/etc/public.libraries-<companyname>.txt contains @@ -193,7 +203,9 @@ static std::string InitProductPublicLibraries() { if (is_product_vndk_version_defined()) { ReadExtensionLibraries("/product/etc", &sonames); } - return android::base::Join(sonames, ':'); + std::string libs = android::base::Join(sonames, ':'); + ALOGD("InitProductPublicLibraries: %s", libs.c_str()); + return libs; } // read /system/etc/public.libraries-<companyname>.txt, @@ -208,13 +220,12 @@ static std::string InitExtendedPublicLibraries() { if (!is_product_vndk_version_defined()) { ReadExtensionLibraries("/product/etc", &sonames); } - return android::base::Join(sonames, ':'); + std::string libs = android::base::Join(sonames, ':'); + ALOGD("InitExtendedPublicLibraries: %s", libs.c_str()); + return libs; } static std::string InitLlndkLibrariesVendor() { - if (get_vndk_version(/*is_product_vndk=*/false).empty()) { - return ""; - } std::string config_file = kLlndkLibrariesFile; InsertVndkVersionStr(&config_file, false); auto sonames = ReadConfig(config_file, always_true); @@ -222,11 +233,14 @@ static std::string InitLlndkLibrariesVendor() { LOG_ALWAYS_FATAL("%s: %s", config_file.c_str(), sonames.error().message().c_str()); return ""; } - return android::base::Join(*sonames, ':'); + std::string libs = android::base::Join(*sonames, ':'); + ALOGD("InitLlndkLibrariesVendor: %s", libs.c_str()); + return libs; } static std::string InitLlndkLibrariesProduct() { if (!is_product_vndk_version_defined()) { + ALOGD("InitLlndkLibrariesProduct: No product VNDK version defined"); return ""; } std::string config_file = kLlndkLibrariesFile; @@ -236,13 +250,12 @@ static std::string InitLlndkLibrariesProduct() { LOG_ALWAYS_FATAL("%s: %s", config_file.c_str(), sonames.error().message().c_str()); return ""; } - return android::base::Join(*sonames, ':'); + std::string libs = android::base::Join(*sonames, ':'); + ALOGD("InitLlndkLibrariesProduct: %s", libs.c_str()); + return libs; } static std::string InitVndkspLibrariesVendor() { - if (get_vndk_version(/*is_product_vndk=*/false).empty()) { - return ""; - } std::string config_file = kVndkLibrariesFile; InsertVndkVersionStr(&config_file, false); auto sonames = ReadConfig(config_file, always_true); @@ -250,11 +263,14 @@ static std::string InitVndkspLibrariesVendor() { LOG_ALWAYS_FATAL("%s", sonames.error().message().c_str()); return ""; } - return android::base::Join(*sonames, ':'); + std::string libs = android::base::Join(*sonames, ':'); + ALOGD("InitVndkspLibrariesVendor: %s", libs.c_str()); + return libs; } static std::string InitVndkspLibrariesProduct() { if (!is_product_vndk_version_defined()) { + ALOGD("InitVndkspLibrariesProduct: No product VNDK version defined"); return ""; } std::string config_file = kVndkLibrariesFile; @@ -264,20 +280,33 @@ static std::string InitVndkspLibrariesProduct() { LOG_ALWAYS_FATAL("%s", sonames.error().message().c_str()); return ""; } - return android::base::Join(*sonames, ':'); + std::string libs = android::base::Join(*sonames, ':'); + ALOGD("InitVndkspLibrariesProduct: %s", libs.c_str()); + return libs; } static std::map<std::string, std::string> InitApexLibraries(const std::string& tag) { std::string file_content; if (!base::ReadFileToString(kApexLibrariesConfigFile, &file_content)) { // config is optional + ALOGI("InitApexLibraries skipped: %s", strerror(errno)); return {}; } - auto config = ParseApexLibrariesConfig(file_content, tag); + Result<std::map<std::string, std::string>> config = ParseApexLibrariesConfig(file_content, tag); if (!config.ok()) { LOG_ALWAYS_FATAL("%s: %s", kApexLibrariesConfigFile, config.error().message().c_str()); return {}; } + ALOGD("InitApexLibraries:\n %s", + [&config]() { + std::vector<std::string> lib_list; + lib_list.reserve(config->size()); + for (std::pair<std::string, std::string> elem : *config) { + lib_list.emplace_back(elem.first + ": " + elem.second); + } + return android::base::Join(lib_list, "\n "); + }() + .c_str()); return *config; } @@ -429,6 +458,12 @@ Result<std::vector<std::string>> ParseConfig( if (entry.bitness == ONLY_64) continue; #endif + // TODO(b/206676167): Remove this check when renderscript is officially removed. +#if defined(__riscv) + // skip renderscript lib on riscv target + if (entry.soname == "libRS.so") continue; +#endif + Result<bool> ret = filter_fn(entry); if (!ret.ok()) { return ret.error(); |