userspace reboot: unmount apexes and switch to bootstrap namespace
This will bring device to the state closer to the one during normal boot
Bug: 135984674
Test: adb install system/apex/shim/com.android.apex.cts.shim.v1.apex
Test: adb reboot userspace
Test: verified install succeeded
Change-Id: I6ef73bde2ca817c8a62bf19b8f1895dd0d6d2829
diff --git a/init/reboot.cpp b/init/reboot.cpp
index a76a9ba..4a16969 100644
--- a/init/reboot.cpp
+++ b/init/reboot.cpp
@@ -57,6 +57,7 @@
#include "action_manager.h"
#include "builtin_arguments.h"
#include "init.h"
+#include "mount_namespace.h"
#include "property_service.h"
#include "reboot_utils.h"
#include "service.h"
@@ -713,6 +714,18 @@
SendStartSendingMessagesMessage();
}
+static Result<void> UnmountAllApexes() {
+ const char* args[] = {"/system/bin/apexd", "--unmount-all"};
+ int status;
+ if (logwrap_fork_execvp(arraysize(args), args, &status, false, LOG_KLOG, true, nullptr) != 0) {
+ return ErrnoError() << "Failed to call '/system/bin/apexd --unmount-all'";
+ }
+ if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
+ return {};
+ }
+ return Error() << "'/system/bin/apexd --unmount-all' failed : " << status;
+}
+
static Result<void> DoUserspaceReboot() {
LOG(INFO) << "Userspace reboot initiated";
auto guard = android::base::make_scope_guard([] {
@@ -754,7 +767,12 @@
// TODO(b/135984674): store information about offending services for debugging.
return Error() << r << " debugging services are still running";
}
- // TODO(b/135984674): deactivate APEX modules and switch back to bootstrap namespace.
+ if (auto result = UnmountAllApexes(); !result) {
+ return result;
+ }
+ if (!SwitchToBootstrapMountNamespaceIfNeeded()) {
+ return Error() << "Failed to switch to bootstrap namespace";
+ }
// Re-enable services
for (const auto& s : were_enabled) {
LOG(INFO) << "Re-enabling service '" << s->name() << "'";