Generate apex-info-list.xml in the ota chroot
This file is needed to generate linker rules within the chroot.
Test: Manual OTA of cuttlefish
Bug: 181182967
Change-Id: I6eb6fe1763c749713c6d4a2286438d223bc76cb0
diff --git a/cmds/installd/otapreopt_chroot.cpp b/cmds/installd/otapreopt_chroot.cpp
index 46c3fd7..379cf92 100644
--- a/cmds/installd/otapreopt_chroot.cpp
+++ b/cmds/installd/otapreopt_chroot.cpp
@@ -20,15 +20,19 @@
#include <sys/stat.h>
#include <sys/wait.h>
+#include <fstream>
#include <sstream>
+#include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/macros.h>
#include <android-base/stringprintf.h>
+#include <android-base/unique_fd.h>
#include <libdm/dm.h>
#include <selinux/android.h>
#include <apex_file_repository.h>
+#include <apex_constants.h>
#include <apexd.h>
#include "installd_constants.h"
@@ -77,6 +81,22 @@
return apex::GetActivePackages();
}
+static void CreateApexInfoList(const std::vector<apex::ApexFile>& apex_files) {
+ // Setup the apex-info-list.xml file
+ const std::string apex_info_file = std::string(apex::kApexRoot) + "/" + apex::kApexInfoList;
+ std::fstream xml(apex_info_file.c_str(), std::ios::out | std::ios::trunc);
+ if (!xml.is_open()) {
+ PLOG(ERROR) << "Failed to open " << apex_info_file;
+ exit(216);
+ }
+
+ // we do not care about inactive apexs
+ std::vector<apex::ApexFile> inactive;
+ apex::CollectApexInfoList(xml, apex_files, inactive);
+ xml.flush();
+ xml.close();
+}
+
static void DeactivateApexPackages(const std::vector<apex::ApexFile>& active_packages) {
for (const apex::ApexFile& apex_file : active_packages) {
const std::string& package_path = apex_file.GetPath();
@@ -250,6 +270,7 @@
// Try to mount APEX packages in "/apex" in the chroot dir. We need at least
// the ART APEX, as it is required by otapreopt to run dex2oat.
std::vector<apex::ApexFile> active_packages = ActivateApexPackages();
+ CreateApexInfoList(active_packages);
// Check that an ART APEX has been activated; clean up and exit
// early otherwise.