minadbd sends heartbeat to rescue service for getprop command.

We start minadbd and rescue services in two processes. In particular,
minadbd handles the requests from host, then communicates with rescue
service to do install/wipe works. When resuce service doesn't see any
request in a pre-defined timeout (currently 300s), rescue service will
exit to avoid endless waiting.

This CL changes minadbd to additionally send a no-op command to rescue
service as a heartbeat signal, so that host side can finish
time-consuming operations (e.g. downloading over network) while keeping
rescue service alive.

Bug: 136457446
Test: Enter resuce mode on blueline. Send `adb rescue getprop
      ro.build.fingerprint` and check that rescue service doesn't exit.
Test: Stop sending the getprop command. Check that rescue service exits
      after 300s.
Change-Id: Ib9d5ed710cfa94ecfe6cf393a71a0b67b2539531
Merged-In: Ib9d5ed710cfa94ecfe6cf393a71a0b67b2539531
(cherry picked from commit 2223e6a9f8)
This commit is contained in:
Tao Bao
2019-07-08 18:07:22 -07:00
parent 2b40105c43
commit 0bbb2ed53e
3 changed files with 12 additions and 1 deletions

View File

@@ -363,11 +363,13 @@ int ApplyFromAdb(Device* device, bool rescue_mode, Device::BuiltinAction* reboot
"\n\nNow send the package you want to apply\n"
"to the device with \"adb sideload <filename>\"...\n");
} else {
ui->Print("\n\nWaiting for rescue commands...\n");
command_map.emplace(MinadbdCommand::kWipeData, [&device]() {
bool result = WipeData(device, false);
return std::make_pair(result, true);
});
command_map.emplace(MinadbdCommand::kNoOp, []() { return std::make_pair(true, true); });
ui->Print("\n\nWaiting for rescue commands...\n");
}
CreateMinadbdServiceAndExecuteCommands(ui, command_map, rescue_mode);

View File

@@ -190,6 +190,14 @@ static void RescueGetpropHostService(unique_fd sfd, const std::string& prop) {
if (!android::base::WriteFully(sfd, result.data(), result.size())) {
exit(kMinadbdHostSocketIOError);
}
// Send heartbeat signal to keep the rescue service alive.
if (!WriteCommandToFd(MinadbdCommand::kNoOp, minadbd_socket)) {
exit(kMinadbdSocketIOError);
}
if (MinadbdCommandStatus status; !WaitForCommandStatus(minadbd_socket, &status)) {
exit(kMinadbdMessageFormatError);
}
}
// Reboots into the given target. We don't reboot directly from minadbd, but going through recovery

View File

@@ -53,6 +53,7 @@ enum class MinadbdCommand : uint32_t {
kRebootRescue = 6,
kWipeCache = 7,
kWipeData = 8,
kNoOp = 9,
// Last but invalid command.
kError,