diff --git a/init/mount_namespace.cpp b/init/mount_namespace.cpp index 12144c120..0745148bd 100644 --- a/init/mount_namespace.cpp +++ b/init/mount_namespace.cpp @@ -91,22 +91,22 @@ static bool ActivateFlattenedApexesIfPossible() { return false; } - // Special casing for the runtime APEX - constexpr const char kRuntimeApexMountPath[] = "/system/apex/com.android.runtime"; - static const std::vector kRuntimeApexDirNames = {"com.android.runtime.release", - "com.android.runtime.debug"}; + // Special casing for the ART APEX + constexpr const char kArtApexMountPath[] = "/system/apex/com.android.art"; + static const std::vector kArtApexDirNames = {"com.android.art.release", + "com.android.art.debug"}; bool success = false; - for (const auto& name : kRuntimeApexDirNames) { + for (const auto& name : kArtApexDirNames) { std::string path = std::string(kSystemApex) + "/" + name; if (access(path.c_str(), F_OK) == 0) { - if (mount(path.c_str(), kRuntimeApexMountPath, nullptr, MS_BIND, nullptr) == 0) { + if (mount(path.c_str(), kArtApexMountPath, nullptr, MS_BIND, nullptr) == 0) { success = true; break; } } } if (!success) { - PLOG(ERROR) << "Failed to bind mount the runtime APEX to " << kRuntimeApexMountPath; + PLOG(ERROR) << "Failed to bind mount the ART APEX to " << kArtApexMountPath; } return success; } diff --git a/init/service.cpp b/init/service.cpp index 9537843a1..7a209664e 100644 --- a/init/service.cpp +++ b/init/service.cpp @@ -116,9 +116,10 @@ static bool ExpandArgsAndExecv(const std::vector& args, bool sigsto return execv(c_strings[0], c_strings.data()) == 0; } -static bool IsRuntimeApexReady() { +static bool AreRuntimeApexesReady() { struct stat buf; - return stat("/apex/com.android.runtime/", &buf) == 0; + return stat("/apex/com.android.art/", &buf) == 0 && + stat("/apex/com.android.runtime/", &buf) == 0; } unsigned long Service::next_start_order_ = 1; @@ -406,11 +407,11 @@ Result Service::Start() { scon = *result; } - if (!IsRuntimeApexReady() && !pre_apexd_) { - // If this service is started before the runtime APEX gets available, - // mark it as pre-apexd one. Note that this marking is permanent. So - // for example, if the service is re-launched (e.g., due to crash), - // it is still recognized as pre-apexd... for consistency. + if (!AreRuntimeApexesReady() && !pre_apexd_) { + // If this service is started before the Runtime and ART APEXes get + // available, mark it as pre-apexd one. Note that this marking is + // permanent. So for example, if the service is re-launched (e.g., due + // to crash), it is still recognized as pre-apexd... for consistency. pre_apexd_ = true; } diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp index 6d3c057b9..60d462f87 100644 --- a/libnativeloader/native_loader.cpp +++ b/libnativeloader/native_loader.cpp @@ -63,6 +63,10 @@ android_namespace_t* FindExportedNamespace(const char* caller_location) { LOG_ALWAYS_FATAL_IF((dot_index == std::string::npos), "Error finding namespace of apex: no dot in apex name %s", caller_location); std::string name = location.substr(dot_index + 1, slash_index - dot_index - 1); + // TODO(b/139408016): Rename the runtime namespace to "art". + if (name == "art") { + name = "runtime"; + } android_namespace_t* boot_namespace = android_get_exported_namespace(name.c_str()); LOG_ALWAYS_FATAL_IF((boot_namespace == nullptr), "Error finding namespace of apex: no namespace called %s", name.c_str()); diff --git a/libnativeloader/public_libraries.cpp b/libnativeloader/public_libraries.cpp index 369436058..93df1d05a 100644 --- a/libnativeloader/public_libraries.cpp +++ b/libnativeloader/public_libraries.cpp @@ -49,12 +49,12 @@ constexpr const char* kVendorPublicLibrariesFile = "/vendor/etc/public.libraries constexpr const char* kLlndkLibrariesFile = "/system/etc/llndk.libraries.txt"; constexpr const char* kVndkLibrariesFile = "/system/etc/vndksp.libraries.txt"; -const std::vector kRuntimePublicLibraries = { +const std::vector kArtApexPublicLibraries = { "libicuuc.so", "libicui18n.so", }; -constexpr const char* kRuntimeApexLibPath = "/apex/com.android.runtime/" LIB; +constexpr const char* kArtApexLibPath = "/apex/com.android.art/" LIB; constexpr const char* kNeuralNetworksApexPublicLibrary = "libneuralnetworks.so"; @@ -182,8 +182,8 @@ static std::string InitDefaultPublicLibraries(bool for_preload) { // For example, libicuuc.so is exposed to classloader namespace from runtime namespace. // Unfortunately, it does not have stable C symbols, and default namespace should only use // stable symbols in libandroidicu.so. http://b/120786417 - for (const std::string& lib_name : kRuntimePublicLibraries) { - std::string path(kRuntimeApexLibPath); + for (const std::string& lib_name : kArtApexPublicLibraries) { + std::string path(kArtApexLibPath); path.append("/").append(lib_name); struct stat s; @@ -207,9 +207,9 @@ static std::string InitDefaultPublicLibraries(bool for_preload) { return android::base::Join(*sonames, ':'); } -static std::string InitRuntimePublicLibraries() { - CHECK(sizeof(kRuntimePublicLibraries) > 0); - std::string list = android::base::Join(kRuntimePublicLibraries, ":"); +static std::string InitArtPublicLibraries() { + CHECK(sizeof(kArtApexPublicLibraries) > 0); + std::string list = android::base::Join(kArtApexPublicLibraries, ":"); std::string additional_libs = additional_public_libraries(); if (!additional_libs.empty()) { @@ -277,7 +277,7 @@ const std::string& default_public_libraries() { } const std::string& runtime_public_libraries() { - static std::string list = InitRuntimePublicLibraries(); + static std::string list = InitArtPublicLibraries(); return list; } diff --git a/rootdir/Android.mk b/rootdir/Android.mk index 455905048..2fa110b0e 100644 --- a/rootdir/Android.mk +++ b/rootdir/Android.mk @@ -214,7 +214,7 @@ LOCAL_MODULE := ld.config.txt LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT_ETC) -# Start of runtime APEX compatibility. +# Start of i18n and ART APEX compatibility. # # Meta-comment: # The placing of this section is somewhat arbitrary. The LOCAL_POST_INSTALL_CMD @@ -226,7 +226,7 @@ LOCAL_MODULE_PATH := $(TARGET_OUT_ETC) # come to rely on them. # http://b/121248172 - create a link from /system/usr/icu to -# /apex/com.android.runtime/etc/icu so that apps can find the ICU .dat file. +# /apex/com.android.i18n/etc/icu so that apps can find the ICU .dat file. # A symlink can't overwrite a directory and the /system/usr/icu directory once # existed so the required structure must be created whatever we find. LOCAL_POST_INSTALL_CMD = mkdir -p $(TARGET_OUT)/usr && rm -rf $(TARGET_OUT)/usr/icu @@ -248,10 +248,10 @@ ART_BINARIES := \ LOCAL_POST_INSTALL_CMD += && mkdir -p $(TARGET_OUT)/bin $(foreach b,$(ART_BINARIES), \ $(eval LOCAL_POST_INSTALL_CMD += \ - && ln -sf /apex/com.android.runtime/bin/$(b) $(TARGET_OUT)/bin/$(b)) \ + && ln -sf /apex/com.android.art/bin/$(b) $(TARGET_OUT)/bin/$(b)) \ ) -# End of runtime APEX compatibilty. +# End of i18n and ART APEX compatibilty. ifeq ($(_enforce_vndk_at_runtime),true) diff --git a/rootdir/etc/ld.config.legacy.txt b/rootdir/etc/ld.config.legacy.txt index f0b1fd292..e598f053f 100644 --- a/rootdir/etc/ld.config.legacy.txt +++ b/rootdir/etc/ld.config.legacy.txt @@ -85,8 +85,11 @@ namespace.runtime.isolated = true # android_link_namespaces in libnativeloader. namespace.runtime.visible = true -namespace.runtime.search.paths = /apex/com.android.runtime/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.runtime/${LIB} +# TODO(b/139408016): Split the namespaces for the ART and Runtime APEXes +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.search.paths += /apex/com.android.runtime/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths += /apex/com.android.runtime/${LIB} namespace.runtime.links = default # Need allow_all_shared_libs because libart.so can dlopen oat files in # /system/framework and /data. diff --git a/rootdir/etc/ld.config.txt b/rootdir/etc/ld.config.txt index a603be2a0..c8c6387e2 100644 --- a/rootdir/etc/ld.config.txt +++ b/rootdir/etc/ld.config.txt @@ -166,8 +166,11 @@ namespace.runtime.isolated = true # android_link_namespaces in libnativeloader. namespace.runtime.visible = true -namespace.runtime.search.paths = /apex/com.android.runtime/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.runtime/${LIB} +# TODO(b/139408016): Split the namespaces for the ART and Runtime APEXes +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.search.paths += /apex/com.android.runtime/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths += /apex/com.android.runtime/${LIB} namespace.runtime.links = default # Need allow_all_shared_libs because libart.so can dlopen oat files in # /system/framework and /data. @@ -488,8 +491,11 @@ namespace.default.link.neuralnetworks.shared_libs = libneuralnetworks.so ############################################################################### namespace.runtime.isolated = true -namespace.runtime.search.paths = /apex/com.android.runtime/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.runtime/${LIB} +# TODO(b/139408016): Split the namespaces for the ART and Runtime APEXes +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.search.paths += /apex/com.android.runtime/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths += /apex/com.android.runtime/${LIB} namespace.runtime.links = system # TODO(b/130340935): Use a dynamically created linker namespace similar to # classloader-namespace for oat files, and tighten this up. @@ -695,8 +701,11 @@ namespace.runtime.isolated = true # android_link_namespaces in libnativeloader. namespace.runtime.visible = true -namespace.runtime.search.paths = /apex/com.android.runtime/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.runtime/${LIB} +# TODO(b/139408016): Split the namespaces for the ART and Runtime APEXes +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.search.paths += /apex/com.android.runtime/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths += /apex/com.android.runtime/${LIB} namespace.runtime.links = default # TODO(b/130340935): Use a dynamically created linker namespace similar to # classloader-namespace for oat files, and tighten this up. diff --git a/rootdir/etc/ld.config.vndk_lite.txt b/rootdir/etc/ld.config.vndk_lite.txt index 2e213ec5d..4beabd675 100644 --- a/rootdir/etc/ld.config.vndk_lite.txt +++ b/rootdir/etc/ld.config.vndk_lite.txt @@ -105,8 +105,11 @@ namespace.runtime.isolated = true # android_link_namespaces in libnativeloader. namespace.runtime.visible = true -namespace.runtime.search.paths = /apex/com.android.runtime/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.runtime/${LIB} +# TODO(b/139408016): Split the namespaces for the ART and Runtime APEXes +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.search.paths += /apex/com.android.runtime/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths += /apex/com.android.runtime/${LIB} namespace.runtime.links = default # Need allow_all_shared_libs because libart.so can dlopen oat files in # /system/framework and /data. @@ -419,8 +422,11 @@ namespace.default.link.neuralnetworks.shared_libs = libneuralnetworks.so ############################################################################### namespace.runtime.isolated = true -namespace.runtime.search.paths = /apex/com.android.runtime/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.runtime/${LIB} +# TODO(b/139408016): Split the namespaces for the ART and Runtime APEXes +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.search.paths += /apex/com.android.runtime/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths += /apex/com.android.runtime/${LIB} namespace.runtime.links = default # TODO(b/130340935): Use a dynamically created linker namespace similar to # classloader-namespace for oat files, and tighten this up. @@ -503,8 +509,11 @@ namespace.runtime.isolated = true # android_link_namespaces in libnativeloader. namespace.runtime.visible = true -namespace.runtime.search.paths = /apex/com.android.runtime/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.runtime/${LIB} +# TODO(b/139408016): Split the namespaces for the ART and Runtime APEXes +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.search.paths += /apex/com.android.runtime/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths += /apex/com.android.runtime/${LIB} namespace.runtime.links = default # TODO(b/130340935): Use a dynamically created linker namespace similar to # classloader-namespace for oat files, and tighten this up. diff --git a/rootdir/init.environ.rc.in b/rootdir/init.environ.rc.in index 93b7f43f0..17f65960d 100644 --- a/rootdir/init.environ.rc.in +++ b/rootdir/init.environ.rc.in @@ -5,7 +5,7 @@ on early-init export ANDROID_ASSETS /system/app export ANDROID_DATA /data export ANDROID_STORAGE /storage - export ANDROID_RUNTIME_ROOT /apex/com.android.runtime + export ANDROID_RUNTIME_ROOT /apex/com.android.art export ANDROID_I18N_ROOT /apex/com.android.i18n export ANDROID_TZDATA_ROOT /apex/com.android.tzdata export EXTERNAL_STORAGE /sdcard