Revert "Move otadexopt-related logic to otapreopt_chroot binary"
Revert "Allow otapreopt_chroot to call otadexopt binder service"
Revert submission 1750144-otapreopt_chroot_speed_up
Reason for revert: Breaks postinstall step on some devices
Reverted Changes:
I56dec13c8:Add ota_dexopt_aidl_interface
Ib32cbbbf8:Allow otapreopt_chroot to call otadexopt binder se...
I02e80a8e6:Move otadexopt-related logic to otapreopt_chroot b...
Bug: 190817237
Change-Id: If090e0cbf8d086b41c0b22a42b5daf4561954156
diff --git a/cmds/installd/Android.bp b/cmds/installd/Android.bp
index 619579e..18c267d 100644
--- a/cmds/installd/Android.bp
+++ b/cmds/installd/Android.bp
@@ -191,10 +191,6 @@
"libbase",
"liblog",
"libutils",
- "libbinder",
- ],
- static_libs: [
- "ota_dexopt_aidl_interface-cpp",
],
required: [
"apexd"
diff --git a/cmds/installd/otapreopt_chroot.cpp b/cmds/installd/otapreopt_chroot.cpp
index 7fcce2c..c62734a 100644
--- a/cmds/installd/otapreopt_chroot.cpp
+++ b/cmds/installd/otapreopt_chroot.cpp
@@ -21,21 +21,15 @@
#include <sys/wait.h>
#include <array>
-#include <chrono>
#include <fstream>
#include <sstream>
-#include <thread>
#include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/macros.h>
-#include <android-base/parseint.h>
#include <android-base/scopeguard.h>
#include <android-base/stringprintf.h>
-#include <android-base/strings.h>
#include <android-base/unique_fd.h>
-#include <android/content/pm/IOtaDexopt.h>
-#include <binder/IServiceManager.h>
#include <libdm/dm.h>
#include <selinux/android.h>
@@ -51,8 +45,6 @@
namespace android {
namespace installd {
-using namespace std::literals::chrono_literals;
-
static void CloseDescriptor(int fd) {
if (fd >= 0) {
int result = close(fd);
@@ -61,6 +53,15 @@
}
}
+static void CloseDescriptor(const char* descriptor_string) {
+ int fd = -1;
+ std::istringstream stream(descriptor_string);
+ stream >> fd;
+ if (!stream.fail()) {
+ CloseDescriptor(fd);
+ }
+}
+
static void ActivateApexPackages() {
std::vector<std::string> apexd_cmd{"/system/bin/apexd", "--otachroot-bootstrap"};
std::string apexd_error_msg;
@@ -112,38 +113,6 @@
UNUSED(mount_result);
}
-static android::sp<android::content::pm::IOtaDexopt> GetDexoptService() {
- auto binder = android::defaultServiceManager()->getService(android::String16("otadexopt"));
- if (binder == nullptr) {
- return nullptr;
- }
- return android::interface_cast<android::content::pm::IOtaDexopt>(binder);
-}
-
-static bool RunDexoptCommand(int argc, char **arg, const std::string& dexopt_cmd) {
- // Incoming: cmd + status-fd + target-slot + cmd... | Incoming | = argc
- // Outgoing: cmd + target-slot + cmd... | Outgoing | = argc - 1
- std::vector<std::string> cmd;
- cmd.reserve(argc);
- cmd.push_back("/system/bin/otapreopt");
-
- // The first parameter is the status file descriptor, skip.
- for (size_t i = 2; i < static_cast<size_t>(argc); ++i) {
- cmd.push_back(arg[i]);
- }
- for (const std::string& part : android::base::Split(dexopt_cmd, " ")) {
- cmd.push_back(part);
- }
-
- // Fork and execute otapreopt in its own process.
- std::string error_msg;
- bool exec_result = Exec(cmd, &error_msg);
- if (!exec_result) {
- LOG(ERROR) << "Running otapreopt failed: " << error_msg;
- }
- return exec_result;
-}
-
// Entry for otapreopt_chroot. Expected parameters are:
// [cmd] [status-fd] [target-slot] "dexopt" [dexopt-params]
// The file descriptor denoted by status-fd will be closed. The rest of the parameters will
@@ -161,18 +130,8 @@
CloseDescriptor(STDIN_FILENO);
CloseDescriptor(STDOUT_FILENO);
CloseDescriptor(STDERR_FILENO);
-
- int fd;
- if (!android::base::ParseInt(arg[1], &fd)) {
- LOG(ERROR) << "Failed to parse " << arg[1];
- exit(225);
- }
- // Add O_CLOEXEC to status channel, since we don't want to pass it across fork/exec, but we need
- // to keep it open in otapreopt_chroot to report progress
- if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
- PLOG(ERROR) << "Failed to set O_CLOEXEC on " << fd;
- exit(226);
- }
+ // 2) The status channel.
+ CloseDescriptor(arg[1]);
// We need to run the otapreopt tool from the postinstall partition. As such, set up a
// mount namespace and change root.
@@ -354,50 +313,28 @@
exit(218);
}
- android::sp<android::content::pm::IOtaDexopt> dexopt = GetDexoptService();
- if (dexopt == nullptr) {
- LOG(ERROR) << "Failed to find otadexopt service";
- exit(222);
+ // Now go on and run otapreopt.
+
+ // Incoming: cmd + status-fd + target-slot + cmd... | Incoming | = argc
+ // Outgoing: cmd + target-slot + cmd... | Outgoing | = argc - 1
+ std::vector<std::string> cmd;
+ cmd.reserve(argc);
+ cmd.push_back("/system/bin/otapreopt");
+
+ // The first parameter is the status file descriptor, skip.
+ for (size_t i = 2; i < static_cast<size_t>(argc); ++i) {
+ cmd.push_back(arg[i]);
}
- android::base::borrowed_fd status_fd(fd);
- // Now go on and run otapreopt.
- constexpr const int kMaximumPackages = 1000;
- for (int iter = 0; iter < kMaximumPackages; iter++) {
- android::String16 cmd;
- android::binder::Status status = dexopt->nextDexoptCommand(&cmd);
- if (!status.isOk()) {
- LOG(ERROR) << "Failed to retrieve next dexopt command";
- // Should we fail instead?
- exit(224);
- }
- if (!RunDexoptCommand(argc, arg, android::String8(cmd).string())) {
- exit(213);
- }
+ // Fork and execute otapreopt in its own process.
+ std::string error_msg;
+ bool exec_result = Exec(cmd, &error_msg);
+ if (!exec_result) {
+ LOG(ERROR) << "Running otapreopt failed: " << error_msg;
+ }
- float progress;
- status = dexopt->getProgress(&progress);
- if (!status.isOk()) {
- LOG(ERROR) << "Failed to retrieve dexopt progress";
- continue;
- }
- LOG(VERBOSE) << "Progress: " << progress;
- std::string progress_str = StringPrintf("global_progress %.2f\n", progress);
- if (!android::base::WriteStringToFd(progress_str, status_fd)) {
- PLOG(ERROR) << "Failed to write '" << progress_str << "' to " << status_fd.get();
- }
-
- bool done;
- status = dexopt->isDone(&done);
- if (!status.isOk()) {
- LOG(WARNING) << "Failed to check if dexopt is done";
- continue;
- }
- if (done) {
- LOG(INFO) << "dexopt is done";
- break;
- }
- std::this_thread::sleep_for(1s);
+ if (!exec_result) {
+ exit(213);
}
return 0;
diff --git a/cmds/installd/otapreopt_script.sh b/cmds/installd/otapreopt_script.sh
index 8bcbc9f..f950276 100644
--- a/cmds/installd/otapreopt_script.sh
+++ b/cmds/installd/otapreopt_script.sh
@@ -58,7 +58,23 @@
PROGRESS=$(cmd otadexopt progress)
print -u${STATUS_FD} "global_progress $PROGRESS"
-/system/bin/otapreopt_chroot $STATUS_FD $TARGET_SLOT_SUFFIX $DEXOPT_PARAMS >&- 2>&-
+i=0
+while ((i<MAXIMUM_PACKAGES)) ; do
+ DEXOPT_PARAMS=$(cmd otadexopt next)
+
+ /system/bin/otapreopt_chroot $STATUS_FD $TARGET_SLOT_SUFFIX $DEXOPT_PARAMS >&- 2>&-
+
+ PROGRESS=$(cmd otadexopt progress)
+ print -u${STATUS_FD} "global_progress $PROGRESS"
+
+ DONE=$(cmd otadexopt done)
+ if [ "$DONE" = "OTA incomplete." ] ; then
+ sleep 1
+ i=$((i+1))
+ continue
+ fi
+ break
+done
DONE=$(cmd otadexopt done)
if [ "$DONE" = "OTA incomplete." ] ; then