diff options
| -rw-r--r-- | cmds/installd/otapreopt.cpp | 46 | ||||
| -rw-r--r-- | cmds/installd/otapreopt_chroot.cpp | 8 |
2 files changed, 35 insertions, 19 deletions
diff --git a/cmds/installd/otapreopt.cpp b/cmds/installd/otapreopt.cpp index ef052bd928..cefcf6404c 100644 --- a/cmds/installd/otapreopt.cpp +++ b/cmds/installd/otapreopt.cpp @@ -175,8 +175,10 @@ class OTAPreoptService { private: bool ReadSystemProperties() { + // TODO This file does not have a stable format. It should be read by + // code shared by init and otapreopt. See b/181182967#comment80 static constexpr const char* kPropertyFiles[] = { - "/default.prop", "/system/build.prop" + "/system/build.prop" }; for (size_t i = 0; i < arraysize(kPropertyFiles); ++i) { @@ -193,28 +195,38 @@ private: // export NAME VALUE // For simplicity, don't respect string quotation. The values we are interested in can be // encoded without them. + // init.environ.rc and etc/classpath have the same format for + // environment variable exports and can be matched by the same regex. + // TODO Just like with the system-properties above we really should have + // common code between init and otapreopt to deal with reading these + // things. See b/181182967 + static constexpr const char* kEnvironmentVariableSources[] = { + "/init.environ.rc", "/etc/classpath" + }; + std::regex export_regex("\\s*export\\s+(\\S+)\\s+(\\S+)"); - bool parse_result = ParseFile("/init.environ.rc", [&](const std::string& line) { - std::smatch export_match; - if (!std::regex_match(line, export_match, export_regex)) { - return true; - } + for (const char* env_vars_file : kEnvironmentVariableSources) { + bool parse_result = ParseFile(env_vars_file, [&](const std::string& line) { + std::smatch export_match; + if (!std::regex_match(line, export_match, export_regex)) { + return true; + } - if (export_match.size() != 3) { - return true; - } + if (export_match.size() != 3) { + return true; + } - std::string name = export_match[1].str(); - std::string value = export_match[2].str(); + std::string name = export_match[1].str(); + std::string value = export_match[2].str(); - system_properties_.SetProperty(name, value); + system_properties_.SetProperty(name, value); - return true; - }); - if (!parse_result) { - return false; + return true; + }); + if (!parse_result) { + return false; + } } - if (system_properties_.GetProperty(kAndroidDataPathPropertyName) == nullptr) { return false; } diff --git a/cmds/installd/otapreopt_chroot.cpp b/cmds/installd/otapreopt_chroot.cpp index 72c03bf14b..fb07840730 100644 --- a/cmds/installd/otapreopt_chroot.cpp +++ b/cmds/installd/otapreopt_chroot.cpp @@ -28,6 +28,7 @@ #include <libdm/dm.h> #include <selinux/android.h> +#include <apex_file_repository.h> #include <apexd.h> #include "installd_constants.h" @@ -64,11 +65,14 @@ static std::vector<apex::ApexFile> ActivateApexPackages() { // system/apex/apexd/apexd.cpp. // // Only scan the APEX directory under /system, /system_ext and /vendor (within the chroot dir). - std::vector<const char*> apex_dirs{apex::kApexPackageSystemDir, apex::kApexPackageSystemExtDir, + std::vector<std::string> apex_dirs{apex::kApexPackageSystemDir, apex::kApexPackageSystemExtDir, apex::kApexPackageVendorDir}; + // Initialize ApexFileRepository used internally in ScanPackagesDirAndActivate. + // This is a quick fix to fix apex activation in otapreopt_chroot. + apex::ApexFileRepository::GetInstance().AddPreInstalledApex(apex_dirs); for (const auto& dir : apex_dirs) { // Cast call to void to suppress warn_unused_result. - static_cast<void>(apex::ScanPackagesDirAndActivate(dir)); + static_cast<void>(apex::ScanPackagesDirAndActivate(dir.c_str())); } return apex::GetActivePackages(); } |