aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-05-09 16:35:27 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-05-09 16:35:27 +0000
commit037e277abab04530e964859152e1302b74a43562 (patch)
tree508e65b9865283e7d11f9ab90c253c6bfec37678
parent4adcc8daf93ee242ff9aed6f958bb9463c090df9 (diff)
parent6eb896f855ed0e8e25ea123edd569a239ebab28e (diff)
downloadcuttlefish-emu-35-1-release.tar.gz
Snap for 11819808 from 6eb896f855ed0e8e25ea123edd569a239ebab28e to emu-35-1-releaseemu-35-1-release
Change-Id: Ib246d29e8805bc142f96240d06d8bffe406a2473
-rw-r--r--common/libs/utils/Android.bp1
-rw-r--r--common/libs/utils/signals.cpp58
-rw-r--r--common/libs/utils/signals.h48
-rw-r--r--common/libs/utils/subprocess.cpp2
-rw-r--r--guest/hals/ril/reference-ril/reference-ril.c19
-rw-r--r--host/commands/assemble_cvd/assemble_cvd.cc26
-rw-r--r--host/commands/assemble_cvd/bootconfig_args.cpp5
-rw-r--r--host/commands/assemble_cvd/disk/gem5_image_unpacker.cpp2
-rw-r--r--host/commands/assemble_cvd/disk/generate_persistent_bootconfig.cpp2
-rw-r--r--host/commands/assemble_cvd/disk/initialize_instance_composite_disk.cc2
-rw-r--r--host/commands/assemble_cvd/disk/kernel_ramdisk_repacker.cpp3
-rw-r--r--host/commands/assemble_cvd/disk_builder.cpp10
-rw-r--r--host/commands/assemble_cvd/disk_builder.h6
-rw-r--r--host/commands/assemble_cvd/disk_flags.cc7
-rw-r--r--host/commands/assemble_cvd/flags.cc44
-rw-r--r--host/commands/assemble_cvd/flags_defaults.h3
-rw-r--r--host/commands/assemble_cvd/graphics_flags.cc29
-rw-r--r--host/commands/assemble_cvd/graphics_flags.h2
-rw-r--r--host/commands/metrics/events.cc4
-rw-r--r--host/commands/modem_simulator/main.cpp2
-rw-r--r--host/commands/modem_simulator/network_service.cpp17
-rw-r--r--host/commands/modem_simulator/nvram_config.cpp8
-rw-r--r--host/commands/modem_simulator/nvram_config.h2
-rw-r--r--host/commands/run_cvd/Android.bp2
-rw-r--r--host/commands/run_cvd/boot_state_machine.cc29
-rw-r--r--host/commands/run_cvd/launch/launch.h4
-rw-r--r--host/commands/run_cvd/launch/open_wrt.cpp4
-rw-r--r--host/commands/run_cvd/launch/secure_env.cpp8
-rw-r--r--host/commands/run_cvd/launch/snapshot_control_files.cpp (renamed from host/commands/run_cvd/launch/secure_env_files.cpp)6
-rw-r--r--host/commands/run_cvd/launch/snapshot_control_files.h (renamed from host/commands/run_cvd/launch/secure_env_files.h)8
-rw-r--r--host/commands/run_cvd/launch/streamer.cpp8
-rw-r--r--host/commands/run_cvd/main.cc2
-rw-r--r--host/commands/run_cvd/server_loop.cpp11
-rw-r--r--host/commands/run_cvd/server_loop.h12
-rw-r--r--host/commands/run_cvd/server_loop_impl.cpp8
-rw-r--r--host/commands/run_cvd/server_loop_impl.h8
-rw-r--r--host/commands/run_cvd/server_loop_impl_snapshot.cpp55
-rw-r--r--host/libs/config/cuttlefish_config.cpp13
-rw-r--r--host/libs/config/cuttlefish_config.h17
-rw-r--r--host/libs/config/cuttlefish_config_instance.cpp36
-rw-r--r--host/libs/config/data_image.cpp2
-rw-r--r--host/libs/config/kernel_args.cpp2
-rw-r--r--host/libs/vm_manager/Android.bp1
-rw-r--r--host/libs/vm_manager/crosvm_builder.cpp27
-rw-r--r--host/libs/vm_manager/crosvm_builder.h7
-rw-r--r--host/libs/vm_manager/crosvm_manager.cpp14
-rw-r--r--host/libs/vm_manager/pci.cpp37
-rw-r--r--host/libs/vm_manager/pci.h41
-rw-r--r--host/libs/vm_manager/vm_manager.cpp13
-rw-r--r--host/libs/vm_manager/vm_manager.h4
-rw-r--r--shared/tv/device_vendor.mk2
-rw-r--r--system_image/Android.bp749
52 files changed, 793 insertions, 639 deletions
diff --git a/common/libs/utils/Android.bp b/common/libs/utils/Android.bp
index ee5d565e1..6ac56bfc7 100644
--- a/common/libs/utils/Android.bp
+++ b/common/libs/utils/Android.bp
@@ -30,6 +30,7 @@ cc_library {
"network.cpp",
"proc_file_utils.cpp",
"shared_fd_flag.cpp",
+ "signals.cpp",
"subprocess.cpp",
"tcp_socket.cpp",
"tee_logging.cpp",
diff --git a/common/libs/utils/signals.cpp b/common/libs/utils/signals.cpp
new file mode 100644
index 000000000..ab6fb9388
--- /dev/null
+++ b/common/libs/utils/signals.cpp
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "common/libs/utils/signals.h"
+
+#include <errno.h>
+#include <signal.h>
+#include <string.h>
+
+#include <vector>
+
+#include <android-base/logging.h>
+
+namespace cuttlefish {
+
+SignalMasker::SignalMasker(sigset_t signals) {
+ auto res = sigprocmask(SIG_SETMASK, &signals, &old_mask_);
+ auto err = errno;
+ CHECK(res == 0) << "Failed to set thread's blocked signal mask: "
+ << strerror(err);
+}
+
+SignalMasker::~SignalMasker() {
+ auto res = sigprocmask(SIG_SETMASK, &old_mask_, NULL);
+ auto err = errno;
+ CHECK(res == 0) << "Failed to reset thread's blocked signal mask: "
+ << strerror(err);
+}
+
+void ChangeSignalHandlers(void (*handler)(int), std::vector<int> signals) {
+ struct sigaction act;
+ act.sa_handler = handler;
+ sigemptyset(&act.sa_mask);
+ for (auto signal: signals) {
+ sigaddset(&act.sa_mask, signal);
+ }
+ act.sa_flags = 0;
+
+ for (auto signal : signals) {
+ sigaction(signal, &act, NULL);
+ }
+}
+
+} // namespace cuttlefish
+
diff --git a/common/libs/utils/signals.h b/common/libs/utils/signals.h
new file mode 100644
index 000000000..4eb68437d
--- /dev/null
+++ b/common/libs/utils/signals.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <signal.h>
+
+#include <vector>
+
+namespace cuttlefish {
+
+/**
+ * Blocks signals for the current thread for the lifetime of the object.
+ *
+ * Provides a RAII interface to sigprocmask.
+ */
+class SignalMasker {
+ public:
+ /**
+ * Blocks the given signals until the object is destroyed.
+ */
+ SignalMasker(sigset_t signals);
+ SignalMasker(const SignalMasker&) = delete;
+ SignalMasker(SignalMasker&&) = delete;
+ SignalMasker operator=(const SignalMasker&) = delete;
+ SignalMasker operator=(SignalMasker&&) = delete;
+ ~SignalMasker();
+
+ private:
+ sigset_t old_mask_;
+};
+
+void ChangeSignalHandlers(void(*handler)(int), std::vector<int> signals);
+
+} // namespace cuttlefish
diff --git a/common/libs/utils/subprocess.cpp b/common/libs/utils/subprocess.cpp
index 40b13c3cf..2ef5957d3 100644
--- a/common/libs/utils/subprocess.cpp
+++ b/common/libs/utils/subprocess.cpp
@@ -230,7 +230,7 @@ int Subprocess::Wait(siginfo_t* infop, int options) {
return -1;
}
*infop = {};
- auto retval = waitid(P_PID, pid_, infop, options);
+ auto retval = TEMP_FAILURE_RETRY(waitid(P_PID, pid_, infop, options));
// We don't want to wait twice for the same process
bool exited = infop->si_code == CLD_EXITED || infop->si_code == CLD_DUMPED;
bool reaped = !(options & WNOWAIT);
diff --git a/guest/hals/ril/reference-ril/reference-ril.c b/guest/hals/ril/reference-ril/reference-ril.c
index b7915e109..c946db0f4 100644
--- a/guest/hals/ril/reference-ril/reference-ril.c
+++ b/guest/hals/ril/reference-ril/reference-ril.c
@@ -918,6 +918,10 @@ static void requestOrSendDataCallList(int cid, RIL_Token *t)
continue;
i = ncid - 1;
+
+ if (i >= n || i < 0)
+ goto error;
+
// Assume no error
responses[i].status = 0;
@@ -1054,14 +1058,21 @@ static void requestOrSendDataCallList(int cid, RIL_Token *t)
&input, (responses) ? &responses[i].dnses : &sskip); // dns_prim_addr
if (err < 0) goto error;
+ size_t response_size = 0;
+ RIL_Data_Call_Response_v11 *presponse = NULL;
+ if (responses) {
+ if (i >= n || i < 0)
+ goto error;
+ presponse = &responses[i];
+ response_size = sizeof(*presponse);
+ }
+
if (t != NULL)
RIL_onRequestComplete(*t, RIL_E_SUCCESS,
- (responses != NULL) ? (responses + i) : responses,
- sizeof(RIL_Data_Call_Response_v11));
+ presponse, response_size);
else
RIL_onUnsolicitedResponse(RIL_UNSOL_DATA_CALL_LIST_CHANGED,
- responses,
- n * sizeof(RIL_Data_Call_Response_v11));
+ responses, n * response_size);
at_response_free(p_response);
return;
diff --git a/host/commands/assemble_cvd/assemble_cvd.cc b/host/commands/assemble_cvd/assemble_cvd.cc
index 37d931af0..0f73d4d42 100644
--- a/host/commands/assemble_cvd/assemble_cvd.cc
+++ b/host/commands/assemble_cvd/assemble_cvd.cc
@@ -304,6 +304,32 @@ Result<const CuttlefishConfig*> InitFilesystemAndCreateConfig(
const std::string snapshot_path = FLAGS_snapshot_path;
if (!snapshot_path.empty()) {
CF_EXPECT(RestoreHostFiles(config.root_dir(), snapshot_path));
+
+ // Add a delimiter to each log file so that we can clearly tell what
+ // happened before vs after the restore.
+ const std::string snapshot_delimiter =
+ "\n\n\n"
+ "============ SNAPSHOT RESTORE POINT ============\n"
+ "Lines above are pre-snapshot.\n"
+ "Lines below are post-restore.\n"
+ "================================================\n"
+ "\n\n\n";
+ for (const auto& instance : config.Instances()) {
+ const auto log_files =
+ CF_EXPECT(DirectoryContents(instance.PerInstanceLogPath("")));
+ for (const auto& filename : log_files) {
+ if (filename == "." || filename == "..") {
+ continue;
+ }
+ const std::string path = instance.PerInstanceLogPath(filename);
+ auto fd = SharedFD::Open(path, O_WRONLY | O_APPEND);
+ CF_EXPECT(fd->IsOpen(),
+ "failed to open " << path << ": " << fd->StrError());
+ const ssize_t n = WriteAll(fd, snapshot_delimiter);
+ CF_EXPECT(n == snapshot_delimiter.size(),
+ "failed to write to " << path << ": " << fd->StrError());
+ }
+ }
}
// take the max value of modem_simulator_instance_number in each instance
diff --git a/host/commands/assemble_cvd/bootconfig_args.cpp b/host/commands/assemble_cvd/bootconfig_args.cpp
index b757102f3..baa1d9030 100644
--- a/host/commands/assemble_cvd/bootconfig_args.cpp
+++ b/host/commands/assemble_cvd/bootconfig_args.cpp
@@ -111,8 +111,7 @@ Result<std::unordered_map<std::string, std::string>> BootconfigArgsFromConfig(
std::to_string(instance.tombstone_receiver_port());
}
- const auto enable_confui =
- (config.vm_manager() == QemuManager::name() ? 0 : 1);
+ const auto enable_confui = (config.vm_manager() == VmmMode::kQemu ? 0 : 1);
bootconfig_args["androidboot.enable_confirmationui"] =
std::to_string(enable_confui);
@@ -173,7 +172,7 @@ Result<std::unordered_map<std::string, std::string>> BootconfigArgsFromConfig(
if (instance.target_arch() == Arch::X86 ||
instance.target_arch() == Arch::X86_64) {
bootconfig_args["androidboot.hypervisor.version"] =
- "cf-" + config.vm_manager();
+ "cf-" + ToString(config.vm_manager());
bootconfig_args["androidboot.hypervisor.vm.supported"] = "1";
} else {
bootconfig_args["androidboot.hypervisor.vm.supported"] = "0";
diff --git a/host/commands/assemble_cvd/disk/gem5_image_unpacker.cpp b/host/commands/assemble_cvd/disk/gem5_image_unpacker.cpp
index f4d91f876..b60bd39ba 100644
--- a/host/commands/assemble_cvd/disk/gem5_image_unpacker.cpp
+++ b/host/commands/assemble_cvd/disk/gem5_image_unpacker.cpp
@@ -26,7 +26,7 @@ namespace cuttlefish {
Result<void> Gem5ImageUnpacker(const CuttlefishConfig& config,
KernelRamdiskRepacker& /* dependency */) {
- if (config.vm_manager() != vm_manager::Gem5Manager::name()) {
+ if (config.vm_manager() != VmmMode::kGem5) {
return {};
}
// TODO: b/281130788 - This should accept InstanceSpecific as an argument
diff --git a/host/commands/assemble_cvd/disk/generate_persistent_bootconfig.cpp b/host/commands/assemble_cvd/disk/generate_persistent_bootconfig.cpp
index 7960b631b..04ebafa87 100644
--- a/host/commands/assemble_cvd/disk/generate_persistent_bootconfig.cpp
+++ b/host/commands/assemble_cvd/disk/generate_persistent_bootconfig.cpp
@@ -78,7 +78,7 @@ Result<void> GeneratePersistentBootconfig(
<< bootconfig_path
<< "` failed:" << bootconfig_fd->StrError());
- if (config.vm_manager() == vm_manager::Gem5Manager::name()) {
+ if (config.vm_manager() == VmmMode::kGem5) {
const off_t bootconfig_size_bytes_gem5 =
AlignToPowerOf2(bytesWritten, PARTITION_SIZE_SHIFT);
CF_EXPECT(bootconfig_fd->Truncate(bootconfig_size_bytes_gem5) == 0);
diff --git a/host/commands/assemble_cvd/disk/initialize_instance_composite_disk.cc b/host/commands/assemble_cvd/disk/initialize_instance_composite_disk.cc
index 6658a2bd8..ed6d36aa7 100644
--- a/host/commands/assemble_cvd/disk/initialize_instance_composite_disk.cc
+++ b/host/commands/assemble_cvd/disk/initialize_instance_composite_disk.cc
@@ -84,7 +84,7 @@ std::vector<ImagePartition> PersistentAPCompositeDiskConfig(
} // namespace
bool IsVmManagerQemu(const CuttlefishConfig& config) {
- return config.vm_manager() == vm_manager::QemuManager::name();
+ return config.vm_manager() == VmmMode::kQemu;
}
Result<void> InitializeInstanceCompositeDisk(
const CuttlefishConfig& config,
diff --git a/host/commands/assemble_cvd/disk/kernel_ramdisk_repacker.cpp b/host/commands/assemble_cvd/disk/kernel_ramdisk_repacker.cpp
index 46d49a549..6268d8604 100644
--- a/host/commands/assemble_cvd/disk/kernel_ramdisk_repacker.cpp
+++ b/host/commands/assemble_cvd/disk/kernel_ramdisk_repacker.cpp
@@ -136,7 +136,8 @@ class KernelRamdiskRepackerImpl : public KernelRamdiskRepacker {
// large to be repacked. Skip repack of boot.img on Gem5, as we need to be
// able to extract the ramdisk.img in a later stage and so this step must
// not fail (..and the repacked kernel wouldn't be used anyway).
- if (instance_.kernel_path().size() && config_.vm_manager() != Gem5Manager::name()) {
+ if (instance_.kernel_path().size() &&
+ config_.vm_manager() != VmmMode::kGem5) {
CF_EXPECT(RepackBootImage(avb_, instance_.kernel_path(), instance_.boot_image(),
instance_.new_boot_image(), instance_.instance_dir()),
"Failed to regenerate the boot image with the new kernel");
diff --git a/host/commands/assemble_cvd/disk_builder.cpp b/host/commands/assemble_cvd/disk_builder.cpp
index b7f6b4198..d6ee26ba4 100644
--- a/host/commands/assemble_cvd/disk_builder.cpp
+++ b/host/commands/assemble_cvd/disk_builder.cpp
@@ -91,11 +91,11 @@ DiskBuilder DiskBuilder::CrosvmPath(std::string crosvm_path) && {
return *this;
}
-DiskBuilder& DiskBuilder::VmManager(std::string vm_manager) & {
+DiskBuilder& DiskBuilder::VmManager(VmmMode vm_manager) & {
vm_manager_ = std::move(vm_manager);
return *this;
}
-DiskBuilder DiskBuilder::VmManager(std::string vm_manager) && {
+DiskBuilder DiskBuilder::VmManager(VmmMode vm_manager) && {
vm_manager_ = std::move(vm_manager);
return *this;
}
@@ -139,7 +139,7 @@ DiskBuilder DiskBuilder::ResumeIfPossible(bool resume_if_possible) && {
Result<std::string> DiskBuilder::TextConfig() {
std::ostringstream disk_conf;
- CF_EXPECT(!vm_manager_.empty(), "Missing vm_manager");
+ CF_EXPECT(vm_manager_ != VmmMode::kUnknown, "Missing vm_manager");
disk_conf << vm_manager_ << "\n";
CF_EXPECT(!partitions_.empty() ^ !entire_disk_.empty(),
@@ -195,8 +195,8 @@ Result<bool> DiskBuilder::BuildCompositeDiskIfNecessary() {
return false;
}
- CF_EXPECT(!vm_manager_.empty());
- if (vm_manager_ == vm_manager::CrosvmManager::name()) {
+ CF_EXPECT(vm_manager_ != VmmMode::kUnknown);
+ if (vm_manager_ == VmmMode::kCrosvm) {
CF_EXPECT(!header_path_.empty(), "No header path");
CF_EXPECT(!footer_path_.empty(), "No footer path");
CreateCompositeDisk(partitions_, AbsolutePath(header_path_),
diff --git a/host/commands/assemble_cvd/disk_builder.h b/host/commands/assemble_cvd/disk_builder.h
index 424a5ad63..6b3be7bd0 100644
--- a/host/commands/assemble_cvd/disk_builder.h
+++ b/host/commands/assemble_cvd/disk_builder.h
@@ -42,8 +42,8 @@ class DiskBuilder {
DiskBuilder& CrosvmPath(std::string crosvm_path) &;
DiskBuilder CrosvmPath(std::string crosvm_path) &&;
- DiskBuilder& VmManager(std::string vm_manager) &;
- DiskBuilder VmManager(std::string vm_manager) &&;
+ DiskBuilder& VmManager(VmmMode vm_manager) &;
+ DiskBuilder VmManager(VmmMode vm_manager) &&;
DiskBuilder& ConfigPath(std::string config_path) &;
DiskBuilder ConfigPath(std::string config_path) &&;
@@ -70,7 +70,7 @@ class DiskBuilder {
std::string entire_disk_;
std::string header_path_;
std::string footer_path_;
- std::string vm_manager_;
+ VmmMode vm_manager_ = VmmMode::kUnknown;
std::string crosvm_path_;
std::string config_path_;
std::string composite_disk_path_;
diff --git a/host/commands/assemble_cvd/disk_flags.cc b/host/commands/assemble_cvd/disk_flags.cc
index 6f23e0323..d7fac9688 100644
--- a/host/commands/assemble_cvd/disk_flags.cc
+++ b/host/commands/assemble_cvd/disk_flags.cc
@@ -625,7 +625,7 @@ Result<void> InitializeSdCard(
CF_EXPECT(CreateBlankImage(instance.sdcard_path(),
instance.blank_sdcard_image_mb(), "sdcard"),
"Failed to create \"" << instance.sdcard_path() << "\"");
- if (config.vm_manager() == "qemu_cli") {
+ if (config.vm_manager() == VmmMode::kQemu) {
const std::string crosvm_path = instance.crosvm_binary();
CreateQcowOverlay(crosvm_path, instance.sdcard_path(),
instance.sdcard_overlay_path());
@@ -927,8 +927,7 @@ Result<void> DiskImageFlagsVectorization(CuttlefishConfig& config, const Fetcher
// Repacking a boot.img changes boot_image and vendor_boot_image paths
const CuttlefishConfig& const_config = const_cast<const CuttlefishConfig&>(config);
const CuttlefishConfig::InstanceSpecific const_instance = const_config.ForInstance(num);
- if (cur_kernel_path.size() &&
- config.vm_manager() != Gem5Manager::name()) {
+ if (cur_kernel_path.size() && config.vm_manager() != VmmMode::kGem5) {
const std::string new_boot_image_path =
const_instance.PerInstancePath("boot_repacked.img");
// change the new flag value to corresponding instance
@@ -1078,7 +1077,7 @@ Result<void> CreateDynamicDiskFiles(const FetcherConfig& fetcher_config,
}
// Gem5 Simulate per-instance what the bootloader would usually do
// Since on other devices this runs every time, just do it here every time
- if (config.vm_manager() == Gem5Manager::name()) {
+ if (config.vm_manager() == VmmMode::kGem5) {
RepackGem5BootImage(instance.PerInstancePath("initrd.img"),
instance.persistent_bootconfig_path(),
config.assembly_dir(), instance.initramfs_path());
diff --git a/host/commands/assemble_cvd/flags.cc b/host/commands/assemble_cvd/flags.cc
index eef579c82..0bbc749f4 100644
--- a/host/commands/assemble_cvd/flags.cc
+++ b/host/commands/assemble_cvd/flags.cc
@@ -973,11 +973,12 @@ Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
// TODO(weihsu), b/250988697: moved bootconfig_supported and hctr2_supported
// into each instance, but target_arch is still in todo
// target_arch should be in instance later
- auto vmm = GetVmManager(vm_manager_vec[0], guest_configs[0].target_arch);
+ auto vmm_mode = CF_EXPECT(ParseVmm(vm_manager_vec[0]));
+ auto vmm = GetVmManager(vmm_mode, guest_configs[0].target_arch);
if (!vmm) {
LOG(FATAL) << "Invalid vm_manager: " << vm_manager_vec[0];
}
- tmp_config_obj.set_vm_manager(vm_manager_vec[0]);
+ tmp_config_obj.set_vm_manager(vmm_mode);
tmp_config_obj.set_ap_vm_manager(vm_manager_vec[0] + "_openwrt");
auto secure_hals_strs =
@@ -1373,7 +1374,7 @@ Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
std::set<Arch> default_on_arch = {Arch::Arm64};
if (guest_configs[instance_index].vhost_user_vsock) {
instance.set_vhost_user_vsock(true);
- } else if (tmp_config_obj.vm_manager() == CrosvmManager::name() &&
+ } else if (tmp_config_obj.vm_manager() == VmmMode::kCrosvm &&
default_on_arch.find(
guest_configs[instance_index].target_arch) !=
default_on_arch.end()) {
@@ -1383,7 +1384,7 @@ Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
}
} else if (vhost_user_vsock_vec[instance_index] ==
kVhostUserVsockModeTrue) {
- CHECK(tmp_config_obj.vm_manager() == CrosvmManager::name())
+ CHECK(tmp_config_obj.vm_manager() == VmmMode::kCrosvm)
<< "For now, only crosvm supports vhost_user_vsock";
instance.set_vhost_user_vsock(true);
} else if (vhost_user_vsock_vec[instance_index] ==
@@ -1552,7 +1553,7 @@ Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
const std::string gpu_mode = CF_EXPECT(ConfigureGpuSettings(
gpu_mode_vec[instance_index], gpu_vhost_user_mode_vec[instance_index],
gpu_renderer_features_vec[instance_index],
- gpu_context_types_vec[instance_index], vm_manager_vec[instance_index],
+ gpu_context_types_vec[instance_index], vmm_mode,
guest_configs[instance_index], instance));
calculated_gpu_mode_vec[instance_index] = gpu_mode_vec[instance_index];
@@ -1633,7 +1634,7 @@ Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
bool os_overlay = true;
os_overlay &= !protected_vm_vec[instance_index];
// Gem5 already uses CoW wrappers around disk images
- os_overlay &= vm_manager_vec[0] != Gem5Manager::name();
+ os_overlay &= vmm_mode != VmmMode::kGem5;
os_overlay &= FLAGS_use_overlay;
if (os_overlay) {
auto path = const_instance.PerInstancePath("overlay.img");
@@ -1644,13 +1645,14 @@ Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
bool persistent_disk = true;
persistent_disk &= !protected_vm_vec[instance_index];
- persistent_disk &= vm_manager_vec[0] != Gem5Manager::name();
+ persistent_disk &= vmm_mode != VmmMode::kGem5;
if (persistent_disk) {
#ifdef __APPLE__
const std::string persistent_composite_img_base =
"persistent_composite.img";
#else
- const bool is_vm_qemu_cli = (tmp_config_obj.vm_manager() == "qemu_cli");
+ const bool is_vm_qemu_cli =
+ (tmp_config_obj.vm_manager() == VmmMode::kQemu);
const std::string persistent_composite_img_base =
is_vm_qemu_cli ? "persistent_composite_overlay.img"
: "persistent_composite.img";
@@ -1666,7 +1668,7 @@ Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
sdcard &= use_sdcard_vec[instance_index];
sdcard &= !protected_vm_vec[instance_index];
if (sdcard) {
- if (tmp_config_obj.vm_manager() == "qemu_cli") {
+ if (tmp_config_obj.vm_manager() == VmmMode::kQemu) {
virtual_disk_paths.push_back(const_instance.sdcard_overlay_path());
} else {
virtual_disk_paths.push_back(const_instance.sdcard_path());
@@ -1765,7 +1767,7 @@ Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
auto external_network_mode = CF_EXPECT(
ParseExternalNetworkMode(device_external_network_vec[instance_index]));
CF_EXPECT(external_network_mode == ExternalNetworkMode::kTap ||
- vm_manager_vec[instance_index] == QemuManager::name(),
+ vmm_mode == VmmMode::kQemu,
"TODO(b/286284441): slirp only works on QEMU");
instance.set_external_network_mode(external_network_mode);
@@ -1824,7 +1826,7 @@ Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
.ForEnvironment(environment_name);
CF_EXPECT(CheckSnapshotCompatible(
FLAGS_snapshot_compatible &&
- (tmp_config_obj.vm_manager() == CrosvmManager::name()) &&
+ (tmp_config_obj.vm_manager() == VmmMode::kCrosvm) &&
instance_nums.size() == 1,
calculated_gpu_mode_vec),
"The set of flags is incompatible with snapshot");
@@ -2057,23 +2059,27 @@ Result<std::vector<GuestConfig>> GetGuestConfigAndSetDefaults() {
}
if (FLAGS_vm_manager == "") {
if (IsHostCompatible(guest_configs[0].target_arch)) {
- FLAGS_vm_manager = CrosvmManager::name();
+ FLAGS_vm_manager = ToString(VmmMode::kCrosvm);
} else {
- FLAGS_vm_manager = QemuManager::name();
+ FLAGS_vm_manager = ToString(VmmMode::kQemu);
}
}
- // TODO(weihsu), b/250988697:
- // Currently, all instances should use same vmm
+
std::vector<std::string> vm_manager_vec =
android::base::Split(FLAGS_vm_manager, ",");
+
+ // TODO(weihsu), b/250988697:
+ // Currently, all instances should use same vmm
+ auto vmm = CF_EXPECT(ParseVmm(vm_manager_vec[0]));
+
// get flag default values and store into map
auto name_to_default_value = CurrentFlagsToDefaultValue();
- if (vm_manager_vec[0] == QemuManager::name()) {
+ if (vmm == VmmMode::kQemu) {
CF_EXPECT(SetDefaultFlagsForQemu(guest_configs[0].target_arch, name_to_default_value));
- } else if (vm_manager_vec[0] == CrosvmManager::name()) {
+ } else if (vmm == VmmMode::kCrosvm) {
CF_EXPECT(SetDefaultFlagsForCrosvm(guest_configs, name_to_default_value));
- } else if (vm_manager_vec[0] == Gem5Manager::name()) {
+ } else if (vmm == VmmMode::kGem5) {
// TODO: Get the other architectures working
if (guest_configs[0].target_arch != Arch::Arm64) {
return CF_ERR("Gem5 only supports ARM64");
@@ -2082,7 +2088,7 @@ Result<std::vector<GuestConfig>> GetGuestConfigAndSetDefaults() {
} else {
return CF_ERR("Unknown Virtual Machine Manager: " << FLAGS_vm_manager);
}
- if (vm_manager_vec[0] != Gem5Manager::name()) {
+ if (vmm != VmmMode::kGem5) {
// After SetCommandLineOptionWithMode in SetDefaultFlagsForCrosvm/Qemu,
// default flag values changed, need recalculate name_to_default_value
name_to_default_value = CurrentFlagsToDefaultValue();
diff --git a/host/commands/assemble_cvd/flags_defaults.h b/host/commands/assemble_cvd/flags_defaults.h
index 34d69b38b..f1072fbfa 100644
--- a/host/commands/assemble_cvd/flags_defaults.h
+++ b/host/commands/assemble_cvd/flags_defaults.h
@@ -90,7 +90,8 @@
#define CF_DEFAULTS_USE_RANDOM_SERIAL false
#define CF_DEFAULTS_SERIAL_NUMBER \
cuttlefish::ForCurrentInstance("CUTTLEFISHCVD")
-#define CF_DEFAULTS_SECURE_HALS "keymint,gatekeeper,oemlock"
+#define CF_DEFAULTS_SECURE_HALS \
+ "oemlock,guest_keymint_insecure,guest_gatekeeper_insecure"
#define CF_DEFAULTS_PROTECTED_VM false
#define CF_DEFAULTS_MTE false
diff --git a/host/commands/assemble_cvd/graphics_flags.cc b/host/commands/assemble_cvd/graphics_flags.cc
index e5e7e4424..d843f5118 100644
--- a/host/commands/assemble_cvd/graphics_flags.cc
+++ b/host/commands/assemble_cvd/graphics_flags.cc
@@ -24,9 +24,8 @@
#include <google/protobuf/text_format.h>
#include "common/libs/utils/contains.h"
+#include "common/libs/utils/subprocess.h"
#include "host/libs/config/cuttlefish_config.h"
-#include "host/libs/vm_manager/crosvm_manager.h"
-#include "host/libs/vm_manager/qemu_manager.h"
#ifdef __APPLE__
#define CF_UNUSED_ON_MACOS [[maybe_unused]]
@@ -232,7 +231,7 @@ GetNeededVhostUserGpuHostRendererFeatures(
#ifndef __APPLE__
Result<std::string> SelectGpuMode(
- const std::string& gpu_mode_arg, const std::string& vm_manager,
+ const std::string& gpu_mode_arg, VmmMode vmm,
const GuestConfig& guest_config,
const gfxstream::proto::GraphicsAvailability& graphics_availability) {
if (gpu_mode_arg != kGpuModeAuto && gpu_mode_arg != kGpuModeDrmVirgl &&
@@ -260,7 +259,7 @@ Result<std::string> SelectGpuMode(
LOG(INFO) << "GPU auto mode: detected prerequisites for accelerated "
<< "rendering support.";
- if (vm_manager == vm_manager::QemuManager::name() && !UseQemuPrebuilt()) {
+ if (vmm == VmmMode::kQemu && !UseQemuPrebuilt()) {
LOG(INFO) << "Not using QEMU prebuilt (QEMU 8+): selecting guest swiftshader";
return kGpuModeGuestSwiftshader;
} else if (!guest_config.gfxstream_supported) {
@@ -290,7 +289,7 @@ Result<std::string> SelectGpuMode(
"--gpu_mode=auto or --gpu_mode=guest_swiftshader.";
}
- if (vm_manager == vm_manager::QemuManager::name() && !UseQemuPrebuilt()) {
+ if (vmm == VmmMode::kQemu && !UseQemuPrebuilt()) {
LOG(INFO) << "Not using QEMU prebuilt (QEMU 8+): selecting guest swiftshader";
return kGpuModeGuestSwiftshader;
}
@@ -301,7 +300,7 @@ Result<std::string> SelectGpuMode(
Result<bool> SelectGpuVhostUserMode(const std::string& gpu_mode,
const std::string& gpu_vhost_user_mode_arg,
- const std::string& vm_manager) {
+ VmmMode vmm) {
CF_EXPECT(gpu_vhost_user_mode_arg == kGpuVhostUserModeAuto ||
gpu_vhost_user_mode_arg == kGpuVhostUserModeOn ||
gpu_vhost_user_mode_arg == kGpuVhostUserModeOff);
@@ -313,9 +312,9 @@ Result<bool> SelectGpuVhostUserMode(const std::string& gpu_mode,
return false;
}
- if (vm_manager != vm_manager::CrosvmManager::name()) {
- LOG(INFO) << "GPU vhost user auto mode: not yet supported with "
- << vm_manager << ". Not enabling vhost user gpu.";
+ if (vmm != VmmMode::kCrosvm) {
+ LOG(INFO) << "GPU vhost user auto mode: not yet supported with " << vmm
+ << ". Not enabling vhost user gpu.";
return false;
}
@@ -490,12 +489,12 @@ static std::unordered_set<std::string> kSupportedGpuContexts{
Result<std::string> ConfigureGpuSettings(
const std::string& gpu_mode_arg, const std::string& gpu_vhost_user_mode_arg,
const std::string& gpu_renderer_features_arg,
- std::string& gpu_context_types_arg, const std::string& vm_manager,
+ std::string& gpu_context_types_arg, VmmMode vmm,
const GuestConfig& guest_config,
CuttlefishConfig::MutableInstanceSpecific& instance) {
#ifdef __APPLE__
(void)gpu_vhost_user_mode_arg;
- (void)vm_manager;
+ (void)vmm;
(void)guest_config;
CF_EXPECT(gpu_mode_arg == kGpuModeAuto ||
gpu_mode_arg == kGpuModeGuestSwiftshader ||
@@ -521,10 +520,10 @@ Result<std::string> ConfigureGpuSettings(
<< graphics_availability.DebugString();
}
- const std::string gpu_mode = CF_EXPECT(SelectGpuMode(
- gpu_mode_arg, vm_manager, guest_config, graphics_availability));
- const bool enable_gpu_vhost_user = CF_EXPECT(
- SelectGpuVhostUserMode(gpu_mode, gpu_vhost_user_mode_arg, vm_manager));
+ const std::string gpu_mode = CF_EXPECT(
+ SelectGpuMode(gpu_mode_arg, vmm, guest_config, graphics_availability));
+ const bool enable_gpu_vhost_user =
+ CF_EXPECT(SelectGpuVhostUserMode(gpu_mode, gpu_vhost_user_mode_arg, vmm));
if (gpu_mode == kGpuModeGfxstream ||
gpu_mode == kGpuModeGfxstreamGuestAngle ||
diff --git a/host/commands/assemble_cvd/graphics_flags.h b/host/commands/assemble_cvd/graphics_flags.h
index 63a4df13e..83297243f 100644
--- a/host/commands/assemble_cvd/graphics_flags.h
+++ b/host/commands/assemble_cvd/graphics_flags.h
@@ -27,7 +27,7 @@ namespace cuttlefish {
Result<std::string> ConfigureGpuSettings(
const std::string& gpu_mode_arg, const std::string& gpu_vhost_user_mode_arg,
const std::string& gpu_renderer_features_arg,
- std::string& gpu_context_types_arg, const std::string& vm_manager,
+ std::string& gpu_context_types_arg, VmmMode vmm,
const GuestConfig& guest_config,
CuttlefishConfig::MutableInstanceSpecific& instance);
diff --git a/host/commands/metrics/events.cc b/host/commands/metrics/events.cc
index 3d3a7c14a..ec0147e9a 100644
--- a/host/commands/metrics/events.cc
+++ b/host/commands/metrics/events.cc
@@ -94,10 +94,10 @@ cuttlefish::MetricsEvent::VmmType GetVmmManager() {
auto config = cuttlefish::CuttlefishConfig::Get();
CHECK(config) << "Could not open cuttlefish config";
auto vmm = config->vm_manager();
- if (vmm == cuttlefish::vm_manager::CrosvmManager::name()) {
+ if (vmm == cuttlefish::VmmMode::kCrosvm) {
return cuttlefish::MetricsEvent::CUTTLEFISH_VMM_TYPE_CROSVM;
}
- if (vmm == cuttlefish::vm_manager::QemuManager::name()) {
+ if (vmm == cuttlefish::VmmMode::kQemu) {
return cuttlefish::MetricsEvent::CUTTLEFISH_VMM_TYPE_QEMU;
}
return cuttlefish::MetricsEvent::CUTTLEFISH_VMM_TYPE_UNSPECIFIED;
diff --git a/host/commands/modem_simulator/main.cpp b/host/commands/modem_simulator/main.cpp
index a979c3662..c22d11d77 100644
--- a/host/commands/modem_simulator/main.cpp
+++ b/host/commands/modem_simulator/main.cpp
@@ -92,7 +92,7 @@ int ModemSimulatorMain(int argc, char** argv) {
}
auto nvram_config = NvramConfig::Get();
- auto nvram_config_file = nvram_config->ConfigFileLocation();
+ const auto nvram_config_file = nvram_config->ConfigFileLocation();
// Start channel monitor, wait for RIL to connect
int32_t modem_id = 0;
diff --git a/host/commands/modem_simulator/network_service.cpp b/host/commands/modem_simulator/network_service.cpp
index 25a2f97d4..03d0a59a9 100644
--- a/host/commands/modem_simulator/network_service.cpp
+++ b/host/commands/modem_simulator/network_service.cpp
@@ -160,18 +160,15 @@ void NetworkService::InitializeNetworkOperator() {
current_operator_numeric_ = operator_list_.begin()->numeric;
operator_list_.begin()->operator_state = NetworkOperator::OPER_STATE_CURRENT;
} else if (oper_selection_mode_ == OperatorSelectionMode::OPER_SELECTION_MANUAL_AUTOMATIC) {
- auto iter = operator_list_.begin();
- for (; iter != operator_list_.end(); ++iter) {
- if (iter->numeric == current_operator_numeric_) {
- break;
+ for (auto& iter : operator_list_) {
+ if (iter.numeric == current_operator_numeric_) {
+ iter.operator_state = NetworkOperator::OPER_STATE_CURRENT;
+ return;
}
}
- if (iter == operator_list_.end()) {
- current_operator_numeric_ = operator_list_.begin()->numeric;
- operator_list_.begin()->operator_state = NetworkOperator::OPER_STATE_CURRENT;
- } else {
- iter->operator_state = NetworkOperator::OPER_STATE_CURRENT;
- }
+ current_operator_numeric_ = operator_list_.begin()->numeric;
+ operator_list_.begin()->operator_state =
+ NetworkOperator::OPER_STATE_CURRENT;
}
}
diff --git a/host/commands/modem_simulator/nvram_config.cpp b/host/commands/modem_simulator/nvram_config.cpp
index 22b337329..021ba7391 100644
--- a/host/commands/modem_simulator/nvram_config.cpp
+++ b/host/commands/modem_simulator/nvram_config.cpp
@@ -45,11 +45,9 @@ static constexpr bool kDefaultEmergencyMode = false;
* Returns nullptr if there was an error loading from file
*/
NvramConfig* NvramConfig::BuildConfigImpl(size_t num_instances, int sim_type) {
- auto nvram_config_path =
- cuttlefish::modem::DeviceConfig::PerInstancePath("modem_nvram.json");
-
auto ret = new NvramConfig(num_instances, sim_type);
if (ret) {
+ const auto nvram_config_path = ConfigFileLocation();
if (!cuttlefish::FileExists(nvram_config_path) ||
!cuttlefish::FileHasContent(nvram_config_path.c_str())) {
ret->InitDefaultNvramConfig();
@@ -82,7 +80,7 @@ void NvramConfig::InitNvramConfigService(size_t num_instances, int sim_type) {
void NvramConfig::SaveToFile() {
auto nvram_config = Get();
- auto nvram_config_file = nvram_config->ConfigFileLocation();
+ const auto nvram_config_file = ConfigFileLocation();
nvram_config->SaveToFile(nvram_config_file);
}
@@ -101,7 +99,7 @@ NvramConfig::InstanceSpecific NvramConfig::ForInstance(int num) const {
return InstanceSpecific(this, std::to_string(num));
}
-std::string NvramConfig::ConfigFileLocation() const {
+/* static */ std::string NvramConfig::ConfigFileLocation() {
return cuttlefish::AbsolutePath(
cuttlefish::modem::DeviceConfig::PerInstancePath("modem_nvram.json"));
}
diff --git a/host/commands/modem_simulator/nvram_config.h b/host/commands/modem_simulator/nvram_config.h
index fc51c80fb..bf4370a0a 100644
--- a/host/commands/modem_simulator/nvram_config.h
+++ b/host/commands/modem_simulator/nvram_config.h
@@ -32,7 +32,7 @@ class NvramConfig {
~NvramConfig();
NvramConfig& operator=(NvramConfig&&);
- std::string ConfigFileLocation() const;
+ static std::string ConfigFileLocation();
// Saves the configuration object in a file
bool SaveToFile(const std::string& file) const;
diff --git a/host/commands/run_cvd/Android.bp b/host/commands/run_cvd/Android.bp
index 1ac066b5c..faacebb10 100644
--- a/host/commands/run_cvd/Android.bp
+++ b/host/commands/run_cvd/Android.bp
@@ -41,7 +41,7 @@ cc_binary_host {
"launch/pica.cpp",
"launch/screen_recording_server.cpp",
"launch/secure_env.cpp",
- "launch/secure_env_files.cpp",
+ "launch/snapshot_control_files.cpp",
"launch/webrtc_recorder.cpp",
"launch/streamer.cpp",
"launch/netsim_server.cpp",
diff --git a/host/commands/run_cvd/boot_state_machine.cc b/host/commands/run_cvd/boot_state_machine.cc
index 242c0a5e3..14c7252e6 100644
--- a/host/commands/run_cvd/boot_state_machine.cc
+++ b/host/commands/run_cvd/boot_state_machine.cc
@@ -21,6 +21,7 @@
#include <memory>
#include <thread>
+#include <android-base/file.h>
#include <android-base/logging.h>
#include <gflags/gflags.h>
@@ -231,6 +232,34 @@ class CvdBootStateMachine : public SetupFeature, public KernelLogPipeConsumer {
<< "Error writing to adbd restore pipe: "
<< restore_adbd_pipe->StrError() << ". This is unrecoverable.";
+ auto SubtoolPath = [](const std::string& subtool_name) {
+ auto my_own_dir = android::base::GetExecutableDirectory();
+ std::stringstream subtool_path_stream;
+ subtool_path_stream << my_own_dir << "/" << subtool_name;
+ auto subtool_path = subtool_path_stream.str();
+ if (my_own_dir.empty() || !FileExists(subtool_path)) {
+ return HostBinaryPath(subtool_name);
+ }
+ return subtool_path;
+ };
+ const auto adb_bin_path = SubtoolPath("adb");
+ CHECK(Execute({adb_bin_path, "-s", instance_.adb_ip_and_port(),
+ "wait-for-device"},
+ SubprocessOptions(), WEXITED)
+ .ok())
+ << "Failed to suspend bluetooth manager.";
+ CHECK(Execute({adb_bin_path, "-s", instance_.adb_ip_and_port(),
+ "shell", "cmd", "bluetooth_manager", "enable"},
+ SubprocessOptions(), WEXITED)
+ .ok());
+ CHECK(Execute({adb_bin_path, "-s", instance_.adb_ip_and_port(),
+ "shell", "svc", "wifi", "enable"},
+ SubprocessOptions(), WEXITED)
+ .ok());
+ CHECK(Execute({adb_bin_path, "-s", instance_.adb_ip_and_port(),
+ "shell", "cmd", "uwb", "enable-uwb"},
+ SubprocessOptions(), WEXITED)
+ .ok());
// Done last so that adb is more likely to be ready.
CHECK(cuttlefish::WriteAll(restore_complete_pipe_write, "1") == 1)
<< "Error writing to restore complete pipe: "
diff --git a/host/commands/run_cvd/launch/launch.h b/host/commands/run_cvd/launch/launch.h
index 3be989c89..4d939844a 100644
--- a/host/commands/run_cvd/launch/launch.h
+++ b/host/commands/run_cvd/launch/launch.h
@@ -26,7 +26,7 @@
#include "host/commands/run_cvd/launch/auto_cmd.h"
#include "host/commands/run_cvd/launch/grpc_socket_creator.h"
#include "host/commands/run_cvd/launch/log_tee_creator.h"
-#include "host/commands/run_cvd/launch/secure_env_files.h"
+#include "host/commands/run_cvd/launch/snapshot_control_files.h"
#include "host/commands/run_cvd/launch/webrtc_recorder.h"
#include "host/commands/run_cvd/launch/wmediumd_server.h"
#include "host/libs/config/command_source.h"
@@ -111,7 +111,7 @@ Result<std::optional<MonitorCommand>> ScreenRecordingServer(GrpcSocketCreator&);
Result<MonitorCommand> SecureEnv(const CuttlefishConfig&,
const CuttlefishConfig::InstanceSpecific&,
- AutoSecureEnvFiles::Type&,
+ AutoSnapshotControlFiles::Type&,
KernelLogPipeProvider&);
Result<MonitorCommand> TombstoneReceiver(
diff --git a/host/commands/run_cvd/launch/open_wrt.cpp b/host/commands/run_cvd/launch/open_wrt.cpp
index 0ca4a9cc6..5b84a3b00 100644
--- a/host/commands/run_cvd/launch/open_wrt.cpp
+++ b/host/commands/run_cvd/launch/open_wrt.cpp
@@ -123,7 +123,7 @@ class OpenWrt : public CommandSource {
auto openwrt_args = OpenwrtArgsFromConfig(instance_);
switch (instance_.ap_boot_flow()) {
case APBootFlow::Grub:
- if (config_.vm_manager() == "qemu_cli") {
+ if (config_.vm_manager() == VmmMode::kQemu) {
ap_cmd.AddReadWriteDisk(
instance_.persistent_ap_composite_overlay_path());
} else {
@@ -156,7 +156,7 @@ class OpenWrt : public CommandSource {
std::string Name() const override { return "OpenWrt"; }
bool Enabled() const override {
return instance_.ap_boot_flow() != APBootFlow::None &&
- config_.vm_manager() == vm_manager::CrosvmManager::name();
+ config_.vm_manager() == VmmMode::kCrosvm;
}
private:
diff --git a/host/commands/run_cvd/launch/secure_env.cpp b/host/commands/run_cvd/launch/secure_env.cpp
index 23a5b040d..5f499fad7 100644
--- a/host/commands/run_cvd/launch/secure_env.cpp
+++ b/host/commands/run_cvd/launch/secure_env.cpp
@@ -24,7 +24,7 @@
#include <fruit/fruit.h>
#include "common/libs/utils/result.h"
-#include "host/commands/run_cvd/launch/secure_env_files.h"
+#include "host/commands/run_cvd/launch/snapshot_control_files.h"
#include "host/libs/config/command_source.h"
#include "host/libs/config/known_paths.h"
@@ -33,13 +33,13 @@ namespace cuttlefish {
Result<MonitorCommand> SecureEnv(
const CuttlefishConfig& config,
const CuttlefishConfig::InstanceSpecific& instance,
- AutoSecureEnvFiles::Type& secure_env_files,
+ AutoSnapshotControlFiles::Type& snapshot_control_files,
KernelLogPipeProvider& kernel_log_pipe_provider) {
Command command(SecureEnvBinary());
command.AddParameter("-confui_server_fd=",
- secure_env_files->confui_server_fd);
+ snapshot_control_files->confui_server_fd);
command.AddParameter("-snapshot_control_fd=",
- secure_env_files->snapshot_control_fd);
+ snapshot_control_files->secure_env_snapshot_control_fd);
std::vector<std::string> fifo_paths = {
instance.PerInstanceInternalPath("keymaster_fifo_vm.in"),
diff --git a/host/commands/run_cvd/launch/secure_env_files.cpp b/host/commands/run_cvd/launch/snapshot_control_files.cpp
index 2a88d4b71..d9fc80b35 100644
--- a/host/commands/run_cvd/launch/secure_env_files.cpp
+++ b/host/commands/run_cvd/launch/snapshot_control_files.cpp
@@ -13,13 +13,13 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#include "host/commands/run_cvd/launch/secure_env_files.h"
+#include "host/commands/run_cvd/launch/snapshot_control_files.h"
#include <unistd.h>
namespace cuttlefish {
-Result<SecureEnvFiles> SecureEnvFiles::Create(
+Result<SnapshotControlFiles> SnapshotControlFiles::Create(
const CuttlefishConfig::InstanceSpecific& instance) {
auto confui_socket_path =
instance.PerInstanceInternalUdsPath("confui_sign.sock");
@@ -34,7 +34,7 @@ Result<SecureEnvFiles> SecureEnvFiles::Create(
CF_EXPECT(SharedFD::SocketPair(AF_UNIX, SOCK_STREAM, 0, &snapshot_control_fd,
&run_cvd_to_secure_env_fd));
- return SecureEnvFiles{
+ return SnapshotControlFiles{
confui_server_fd,
snapshot_control_fd,
run_cvd_to_secure_env_fd,
diff --git a/host/commands/run_cvd/launch/secure_env_files.h b/host/commands/run_cvd/launch/snapshot_control_files.h
index ed70ced66..dc0b391b0 100644
--- a/host/commands/run_cvd/launch/secure_env_files.h
+++ b/host/commands/run_cvd/launch/snapshot_control_files.h
@@ -24,15 +24,15 @@
namespace cuttlefish {
-struct SecureEnvFiles {
+struct SnapshotControlFiles {
SharedFD confui_server_fd;
- SharedFD snapshot_control_fd;
+ SharedFD secure_env_snapshot_control_fd;
SharedFD run_cvd_to_secure_env_fd;
- static Result<SecureEnvFiles> Create(
+ static Result<SnapshotControlFiles> Create(
const CuttlefishConfig::InstanceSpecific&);
};
-using AutoSecureEnvFiles = AutoSetup<SecureEnvFiles::Create>;
+using AutoSnapshotControlFiles = AutoSetup<SnapshotControlFiles::Create>;
} // namespace cuttlefish
diff --git a/host/commands/run_cvd/launch/streamer.cpp b/host/commands/run_cvd/launch/streamer.cpp
index 3334efdf1..b27fb7bd8 100644
--- a/host/commands/run_cvd/launch/streamer.cpp
+++ b/host/commands/run_cvd/launch/streamer.cpp
@@ -94,7 +94,7 @@ class StreamerSockets : public virtual SetupFeature {
: config_(config), instance_(instance) {}
void AppendCommandArguments(Command& cmd) {
- if (config_.vm_manager() == vm_manager::QemuManager::name()) {
+ if (config_.vm_manager() == VmmMode::kQemu) {
cmd.AddParameter("-write_virtio_input");
}
if (!touch_servers_.empty()) {
@@ -126,7 +126,7 @@ class StreamerSockets : public virtual SetupFeature {
// SetupFeature
std::string Name() const override { return "StreamerSockets"; }
bool Enabled() const override {
- bool is_qemu = config_.vm_manager() == vm_manager::QemuManager::name();
+ bool is_qemu = config_.vm_manager() == VmmMode::kQemu;
bool is_accelerated = instance_.gpu_mode() != kGpuModeGuestSwiftshader;
return !(is_qemu && is_accelerated);
}
@@ -261,7 +261,7 @@ class WebRtcServer : public virtual CommandSource,
webrtc.UnsetFromEnvironment("http_proxy");
sockets_.AppendCommandArguments(webrtc);
- if (config_.vm_manager() == vm_manager::CrosvmManager::name()) {
+ if (config_.vm_manager() == VmmMode::kCrosvm) {
webrtc.AddParameter("-switches_fd=", switches_server_);
}
// Currently there is no way to ensure the signaling server will already
@@ -300,7 +300,7 @@ class WebRtcServer : public virtual CommandSource,
}
Result<void> ResultSetup() override {
- if (config_.vm_manager() == vm_manager::CrosvmManager::name()) {
+ if (config_.vm_manager() == VmmMode::kCrosvm) {
switches_server_ =
CreateUnixInputServer(instance_.switches_socket_path());
CF_EXPECT(switches_server_->IsOpen(), switches_server_->StrError());
diff --git a/host/commands/run_cvd/main.cc b/host/commands/run_cvd/main.cc
index 35fcbd5cc..05bd8d2ac 100644
--- a/host/commands/run_cvd/main.cc
+++ b/host/commands/run_cvd/main.cc
@@ -163,7 +163,7 @@ fruit::Component<> runCvdComponent(
.install(RootCanalComponent)
.install(AutoCmd<Casimir>::Component)
.install(NetsimServerComponent)
- .install(AutoSecureEnvFiles::Component)
+ .install(AutoSnapshotControlFiles::Component)
.install(AutoCmd<SecureEnv>::Component)
.install(serverLoopComponent)
.install(WebRtcRecorderComponent)
diff --git a/host/commands/run_cvd/server_loop.cpp b/host/commands/run_cvd/server_loop.cpp
index abe4e65e8..81fd0ee6f 100644
--- a/host/commands/run_cvd/server_loop.cpp
+++ b/host/commands/run_cvd/server_loop.cpp
@@ -18,7 +18,6 @@
#include <fruit/fruit.h>
-#include "host/commands/run_cvd/launch/secure_env_files.h"
#include "host/commands/run_cvd/launch/webrtc_recorder.h"
#include "host/commands/run_cvd/server_loop_impl.h"
#include "host/libs/config/cuttlefish_config.h"
@@ -29,11 +28,11 @@ namespace cuttlefish {
ServerLoop::~ServerLoop() = default;
-fruit::Component<fruit::Required<const CuttlefishConfig,
- const CuttlefishConfig::InstanceSpecific,
- AutoSecureEnvFiles::Type,
- WebRtcRecorder>,
- ServerLoop>
+fruit::Component<
+ fruit::Required<const CuttlefishConfig,
+ const CuttlefishConfig::InstanceSpecific,
+ AutoSnapshotControlFiles::Type, WebRtcRecorder>,
+ ServerLoop>
serverLoopComponent() {
using run_cvd_impl::ServerLoopImpl;
return fruit::createComponent()
diff --git a/host/commands/run_cvd/server_loop.h b/host/commands/run_cvd/server_loop.h
index 9c28dfe2f..0ceeee0cb 100644
--- a/host/commands/run_cvd/server_loop.h
+++ b/host/commands/run_cvd/server_loop.h
@@ -18,7 +18,7 @@
#include <fruit/fruit.h>
-#include "host/commands/run_cvd/launch/secure_env_files.h"
+#include "host/commands/run_cvd/launch/snapshot_control_files.h"
#include "host/commands/run_cvd/launch/webrtc_recorder.h"
#include "host/libs/config/cuttlefish_config.h"
@@ -30,10 +30,10 @@ class ServerLoop {
virtual Result<void> Run() = 0;
};
-fruit::Component<fruit::Required<const CuttlefishConfig,
- const CuttlefishConfig::InstanceSpecific,
- AutoSecureEnvFiles::Type,
- WebRtcRecorder>,
- ServerLoop>
+fruit::Component<
+ fruit::Required<const CuttlefishConfig,
+ const CuttlefishConfig::InstanceSpecific,
+ AutoSnapshotControlFiles::Type, WebRtcRecorder>,
+ ServerLoop>
serverLoopComponent();
}
diff --git a/host/commands/run_cvd/server_loop_impl.cpp b/host/commands/run_cvd/server_loop_impl.cpp
index 61f1fa6bb..f5caa7c2d 100644
--- a/host/commands/run_cvd/server_loop_impl.cpp
+++ b/host/commands/run_cvd/server_loop_impl.cpp
@@ -63,11 +63,11 @@ bool ServerLoopImpl::CreateQcowOverlay(const std::string& crosvm_path,
ServerLoopImpl::ServerLoopImpl(
const CuttlefishConfig& config,
const CuttlefishConfig::InstanceSpecific& instance,
- AutoSecureEnvFiles::Type& secure_env_files,
+ AutoSnapshotControlFiles::Type& snapshot_control_files,
WebRtcRecorder& webrtc_recorder)
: config_(config),
instance_(instance),
- secure_env_files_(secure_env_files),
+ snapshot_control_files_(snapshot_control_files),
webrtc_recorder_(webrtc_recorder),
vm_name_to_control_sock_{InitializeVmToControlSockPath(instance)},
device_status_{DeviceStatus::kUnknown} {}
@@ -93,7 +93,7 @@ Result<void> ServerLoopImpl::Run() {
}
}
const auto& channel_to_secure_env =
- secure_env_files_->run_cvd_to_secure_env_fd;
+ snapshot_control_files_->run_cvd_to_secure_env_fd;
ProcessMonitor process_monitor(std::move(process_monitor_properties),
channel_to_secure_env);
@@ -414,7 +414,7 @@ void ServerLoopImpl::RestartRunCvd(int notification_fd) {
}
Result<std::string> ServerLoopImpl::VmControlSocket() const {
- CF_EXPECT_EQ(config_.vm_manager(), "crosvm",
+ CF_EXPECT_EQ(config_.vm_manager(), VmmMode::kCrosvm,
"Other VMs but crosvm is not yet supported.");
return instance_.CrosvmSocketPath();
}
diff --git a/host/commands/run_cvd/server_loop_impl.h b/host/commands/run_cvd/server_loop_impl.h
index 1577f283e..dde74b05f 100644
--- a/host/commands/run_cvd/server_loop_impl.h
+++ b/host/commands/run_cvd/server_loop_impl.h
@@ -46,7 +46,7 @@ class ServerLoopImpl : public ServerLoop,
public:
INJECT(ServerLoopImpl(const CuttlefishConfig& config,
const CuttlefishConfig::InstanceSpecific& instance,
- AutoSecureEnvFiles::Type& secure_env_files,
+ AutoSnapshotControlFiles::Type& snapshot_control_files,
WebRtcRecorder& webrtc_recorder));
Result<void> LateInject(fruit::Injector<>& injector) override;
@@ -66,7 +66,7 @@ class ServerLoopImpl : public ServerLoop,
private:
bool Enabled() const override { return true; }
std::unordered_set<SetupFeature*> Dependencies() const override {
- return {&secure_env_files_};
+ return {&snapshot_control_files_};
}
Result<void> ResultSetup() override;
Result<void> HandleExtended(const LauncherActionInfo& action_info,
@@ -93,7 +93,7 @@ class ServerLoopImpl : public ServerLoop,
static std::unordered_map<std::string, std::string>
InitializeVmToControlSockPath(const CuttlefishConfig::InstanceSpecific&);
Result<std::string> VmControlSocket() const;
- Result<void> TakeGuestSnapshot(const std::string&, const std::string&);
+ Result<void> TakeGuestSnapshot(VmmMode, const std::string&);
Result<void> TakeCrosvmGuestSnapshot(const Json::Value&);
const CuttlefishConfig& config_;
@@ -104,7 +104,7 @@ class ServerLoopImpl : public ServerLoop,
* secure_env. The socket pairs are used to send suspend/resume to
* secure_env, and get the responses.
*/
- AutoSecureEnvFiles::Type& secure_env_files_;
+ AutoSnapshotControlFiles::Type& snapshot_control_files_;
WebRtcRecorder& webrtc_recorder_;
std::vector<CommandSource*> command_sources_;
SharedFD server_;
diff --git a/host/commands/run_cvd/server_loop_impl_snapshot.cpp b/host/commands/run_cvd/server_loop_impl_snapshot.cpp
index c846e3726..9ed21a354 100644
--- a/host/commands/run_cvd/server_loop_impl_snapshot.cpp
+++ b/host/commands/run_cvd/server_loop_impl_snapshot.cpp
@@ -43,9 +43,9 @@ ServerLoopImpl::InitializeVmToControlSockPath(
const CuttlefishConfig::InstanceSpecific& instance) {
return std::unordered_map<std::string, std::string>{
// TODO(kwstephenkim): add the following two lines to support QEMU
- // {QemuManager::name(),
+ // {ToString(VmmMode::kQemu),
// instance.PerInstanceInternalUdsPath("qemu_monitor.sock")},
- {vm_manager::CrosvmManager::name(), instance.CrosvmSocketPath()},
+ {ToString(VmmMode::kCrosvm), instance.CrosvmSocketPath()},
{cuttlefish::kApName, instance.OpenwrtCrosvmSocketPath()},
};
}
@@ -105,15 +105,16 @@ Result<void> ServerLoopImpl::SuspendGuest() {
CF_EXPECT(SuspendCrosvm(openwrt_sock),
"failed to suspend openwrt crosvm instance.");
}
- const auto vm_name = config_.vm_manager();
- if (vm_name == vm_manager::CrosvmManager::name()) {
- const auto& vm_sock = GetSocketPath(vm_name, vm_name_to_control_sock_);
+ const auto main_vmm = config_.vm_manager();
+ if (main_vmm == VmmMode::kCrosvm) {
+ const auto& vm_sock =
+ GetSocketPath(ToString(main_vmm), vm_name_to_control_sock_);
if (vm_sock == "") {
- return CF_ERR("The vm_manager " + vm_name + " is not supported yet");
+ return CF_ERR("The vm_manager " << main_vmm << " is not supported yet");
}
return SuspendCrosvm(vm_sock);
} else {
- return CF_ERR("The vm_manager " + vm_name + " is not supported yet");
+ return CF_ERR("The vm_manager " << main_vmm << " is not supported yet");
}
}
@@ -130,21 +131,36 @@ Result<void> ServerLoopImpl::ResumeGuest() {
CF_EXPECT(ResumeCrosvm(openwrt_sock),
"failed to resume openwrt crosvm instance.");
}
- const auto vm_name = config_.vm_manager();
- if (vm_name == vm_manager::CrosvmManager::name()) {
- const auto& vm_sock = GetSocketPath(vm_name, vm_name_to_control_sock_);
+ const auto main_vmm = config_.vm_manager();
+ if (main_vmm == VmmMode::kCrosvm) {
+ const auto& vm_sock =
+ GetSocketPath(ToString(main_vmm), vm_name_to_control_sock_);
if (vm_sock == "") {
- return CF_ERR("The vm_manager " + vm_name + " is not supported yet");
+ return CF_ERR("The vm_manager " << main_vmm << " is not supported yet");
}
return ResumeCrosvm(vm_sock);
} else {
- return CF_ERR("The vm_manager " + vm_name + " is not supported yet");
+ return CF_ERR("The vm_manager " << main_vmm << " is not supported yet");
}
}
Result<void> ServerLoopImpl::HandleSuspend(ProcessMonitor& process_monitor) {
// right order: guest -> host
LOG(DEBUG) << "Suspending the guest..";
+ const auto adb_bin_path = SubtoolPath("adb");
+ CF_EXPECT(Execute({adb_bin_path, "-s", instance_.adb_ip_and_port(), "shell",
+ "cmd", "bluetooth_manager", "disable"},
+ SubprocessOptions(), WEXITED));
+ CF_EXPECT(Execute({adb_bin_path, "-s", instance_.adb_ip_and_port(), "shell",
+ "cmd", "bluetooth_manager", "wait-for-state:STATE_OFF"},
+ SubprocessOptions(), WEXITED));
+ CF_EXPECT(Execute({adb_bin_path, "-s", instance_.adb_ip_and_port(), "shell",
+ "svc", "wifi", "disable"},
+ SubprocessOptions(), WEXITED));
+ CF_EXPECT(Execute({adb_bin_path, "-s", instance_.adb_ip_and_port(), "shell",
+ "cmd", "uwb", "disable-uwb"},
+ SubprocessOptions(), WEXITED));
+ // right order: guest -> host
CF_EXPECT(SuspendGuest());
LOG(DEBUG) << "The guest is suspended.";
CF_EXPECT(process_monitor.SuspendMonitoredProcesses(),
@@ -160,6 +176,17 @@ Result<void> ServerLoopImpl::HandleResume(ProcessMonitor& process_monitor) {
LOG(DEBUG) << "The host processes are resumed.";
LOG(DEBUG) << "Resuming the guest..";
CF_EXPECT(ResumeGuest());
+ // Resume services after guest has resumed.
+ const auto adb_bin_path = SubtoolPath("adb");
+ CF_EXPECT(Execute({adb_bin_path, "-s", instance_.adb_ip_and_port(), "shell",
+ "cmd", "bluetooth_manager", "enable"},
+ SubprocessOptions(), WEXITED));
+ CF_EXPECT(Execute({adb_bin_path, "-s", instance_.adb_ip_and_port(), "shell",
+ "svc", "wifi", "enable"},
+ SubprocessOptions(), WEXITED));
+ CF_EXPECT(Execute({adb_bin_path, "-s", instance_.adb_ip_and_port(), "shell",
+ "cmd", "uwb", "enable-uwb"},
+ SubprocessOptions(), WEXITED));
LOG(DEBUG) << "The guest resumed.";
return {};
}
@@ -215,7 +242,7 @@ Result<void> ServerLoopImpl::TakeCrosvmGuestSnapshot(
/*
* Parse json file at json_path, and take guest snapshot
*/
-Result<void> ServerLoopImpl::TakeGuestSnapshot(const std::string& vm_manager,
+Result<void> ServerLoopImpl::TakeGuestSnapshot(VmmMode vm_manager,
const std::string& json_path) {
// common code across vm_manager
CF_EXPECTF(FileExists(json_path), "{} must exist but does not.", json_path);
@@ -226,7 +253,7 @@ Result<void> ServerLoopImpl::TakeGuestSnapshot(const std::string& vm_manager,
std::string("Failed to read from ") + json_path);
Json::Value meta_json = CF_EXPECTF(
ParseJson(json_contents), "Failed to parse json: \n{}", json_contents);
- CF_EXPECTF(vm_manager == "crosvm",
+ CF_EXPECTF(vm_manager == VmmMode::kCrosvm,
"{}, which is not crosvm, is not yet supported.", vm_manager);
CF_EXPECT(TakeCrosvmGuestSnapshot(meta_json),
"TakeCrosvmGuestSnapshot() failed.");
diff --git a/host/libs/config/cuttlefish_config.cpp b/host/libs/config/cuttlefish_config.cpp
index 6de482552..091b59160 100644
--- a/host/libs/config/cuttlefish_config.cpp
+++ b/host/libs/config/cuttlefish_config.cpp
@@ -111,11 +111,12 @@ void CuttlefishConfig::set_root_dir(const std::string& root_dir) {
}
static constexpr char kVmManager[] = "vm_manager";
-std::string CuttlefishConfig::vm_manager() const {
- return (*dictionary_)[kVmManager].asString();
+VmmMode CuttlefishConfig::vm_manager() const {
+ auto str = (*dictionary_)[kVmManager].asString();
+ return ParseVmm(str).value_or(VmmMode::kUnknown);
}
-void CuttlefishConfig::set_vm_manager(const std::string& name) {
- (*dictionary_)[kVmManager] = name;
+void CuttlefishConfig::set_vm_manager(VmmMode vmm) {
+ (*dictionary_)[kVmManager] = fmt::format("{}", vmm);
}
static constexpr char kApVmManager[] = "ap_vm_manager";
@@ -173,7 +174,9 @@ void CuttlefishConfig::set_crosvm_binary(const std::string& crosvm_binary) {
(*dictionary_)[kCrosvmBinary] = crosvm_binary;
}
-bool CuttlefishConfig::IsCrosvm() const { return vm_manager() == "crosvm"; }
+bool CuttlefishConfig::IsCrosvm() const {
+ return vm_manager() == VmmMode::kCrosvm;
+}
static constexpr char kGem5DebugFlags[] = "gem5_debug_flags";
std::string CuttlefishConfig::gem5_debug_flags() const {
diff --git a/host/libs/config/cuttlefish_config.h b/host/libs/config/cuttlefish_config.h
index 7fec650fd..ecc93ea03 100644
--- a/host/libs/config/cuttlefish_config.h
+++ b/host/libs/config/cuttlefish_config.h
@@ -52,6 +52,17 @@ enum class SecureHal {
HostOemlockSecure,
};
+enum class VmmMode {
+ kUnknown,
+ kCrosvm,
+ kGem5,
+ kQemu,
+};
+
+std::ostream& operator<<(std::ostream&, VmmMode);
+std::string ToString(VmmMode mode);
+Result<VmmMode> ParseVmm(std::string_view);
+
enum class ExternalNetworkMode {
kUnknown,
kTap,
@@ -100,8 +111,8 @@ class CuttlefishConfig {
std::string environments_uds_dir() const;
std::string EnvironmentsUdsPath(const std::string&) const;
- std::string vm_manager() const;
- void set_vm_manager(const std::string& name);
+ VmmMode vm_manager() const;
+ void set_vm_manager(VmmMode vmm);
std::string ap_vm_manager() const;
void set_ap_vm_manager(const std::string& name);
@@ -1010,4 +1021,6 @@ extern const char* const kHwComposerNone;
#if FMT_VERSION >= 90000
template <>
struct fmt::formatter<cuttlefish::ExternalNetworkMode> : ostream_formatter {};
+template <>
+struct fmt::formatter<cuttlefish::VmmMode> : ostream_formatter {};
#endif
diff --git a/host/libs/config/cuttlefish_config_instance.cpp b/host/libs/config/cuttlefish_config_instance.cpp
index ace76e8ef..24b246417 100644
--- a/host/libs/config/cuttlefish_config_instance.cpp
+++ b/host/libs/config/cuttlefish_config_instance.cpp
@@ -62,6 +62,37 @@ Result<ExternalNetworkMode> ParseExternalNetworkMode(std::string_view str) {
}
}
+std::string ToString(VmmMode mode) {
+ std::stringstream ss;
+ ss << mode;
+ return ss.str();
+}
+
+std::ostream& operator<<(std::ostream& out, VmmMode vmm) {
+ switch (vmm) {
+ case VmmMode::kUnknown:
+ return out << "unknown";
+ case VmmMode::kCrosvm:
+ return out << "crosvm";
+ case VmmMode::kGem5:
+ return out << "gem5";
+ case VmmMode::kQemu:
+ return out << "qemu_cli";
+ }
+}
+
+Result<VmmMode> ParseVmm(std::string_view str) {
+ if (android::base::EqualsIgnoreCase(str, "crosvm")) {
+ return VmmMode::kCrosvm;
+ } else if (android::base::EqualsIgnoreCase(str, "gem5")) {
+ return VmmMode::kGem5;
+ } else if (android::base::EqualsIgnoreCase(str, "qemu_cli")) {
+ return VmmMode::kQemu;
+ } else {
+ return CF_ERRF("\"{}\" is not a valid Vmm.", str);
+ }
+}
+
static constexpr char kInstanceDir[] = "instance_dir";
CuttlefishConfig::MutableInstanceSpecific::MutableInstanceSpecific(
CuttlefishConfig* config, const std::string& id)
@@ -1199,8 +1230,7 @@ bool CuttlefishConfig::InstanceSpecific::console() const {
std::string CuttlefishConfig::InstanceSpecific::console_dev() const {
auto can_use_virtio_console = !kgdb() && !use_bootloader();
std::string console_dev;
- if (can_use_virtio_console ||
- config_->vm_manager() == vm_manager::Gem5Manager::name()) {
+ if (can_use_virtio_console || config_->vm_manager() == VmmMode::kGem5) {
// If kgdb and the bootloader are disabled, the Android serial console
// spawns on a virtio-console port. If the bootloader is enabled, virtio
// console can't be used since uboot doesn't support it.
@@ -1210,7 +1240,7 @@ std::string CuttlefishConfig::InstanceSpecific::console_dev() const {
// architectures emulate ns16550a/uart8250 instead.
Arch target = target_arch();
if ((target == Arch::Arm64 || target == Arch::Arm) &&
- config_->vm_manager() != vm_manager::CrosvmManager::name()) {
+ config_->vm_manager() != VmmMode::kCrosvm) {
console_dev = "ttyAMA0";
} else {
console_dev = "ttyS0";
diff --git a/host/libs/config/data_image.cpp b/host/libs/config/data_image.cpp
index 0849fd088..915728efc 100644
--- a/host/libs/config/data_image.cpp
+++ b/host/libs/config/data_image.cpp
@@ -271,7 +271,7 @@ class InitializeEspImageImpl : public InitializeEspImage {
LOG(DEBUG) << "creating esp_image: " << instance_.ap_esp_image_path();
CF_EXPECT(BuildAPImage());
}
- const auto is_not_gem5 = config_.vm_manager() != vm_manager::Gem5Manager::name();
+ const auto is_not_gem5 = config_.vm_manager() != VmmMode::kGem5;
const auto esp_required_for_boot_flow = EspRequiredForBootFlow();
if (is_not_gem5 && esp_required_for_boot_flow) {
LOG(DEBUG) << "creating esp_image: " << instance_.esp_image_path();
diff --git a/host/libs/config/kernel_args.cpp b/host/libs/config/kernel_args.cpp
index 91e0bbd0e..f5bdf7dc0 100644
--- a/host/libs/config/kernel_args.cpp
+++ b/host/libs/config/kernel_args.cpp
@@ -42,7 +42,7 @@ std::vector<std::string> VmManagerKernelCmdline(
const CuttlefishConfig& config,
const CuttlefishConfig::InstanceSpecific& instance) {
std::vector<std::string> vm_manager_cmdline;
- if (config.vm_manager() == QemuManager::name()) {
+ if (config.vm_manager() == VmmMode::kQemu) {
Arch target_arch = instance.target_arch();
if (target_arch == Arch::Arm64 || target_arch == Arch::Arm) {
if (instance.enable_kernel_log()) {
diff --git a/host/libs/vm_manager/Android.bp b/host/libs/vm_manager/Android.bp
index 7cd03297f..1bc3ee0be 100644
--- a/host/libs/vm_manager/Android.bp
+++ b/host/libs/vm_manager/Android.bp
@@ -24,6 +24,7 @@ cc_library {
"crosvm_manager.cpp",
"gem5_manager.cpp",
"host_configuration.cpp",
+ "pci.cpp",
"qemu_manager.cpp",
"vm_manager.cpp",
],
diff --git a/host/libs/vm_manager/crosvm_builder.cpp b/host/libs/vm_manager/crosvm_builder.cpp
index cb863db32..4f51e331c 100644
--- a/host/libs/vm_manager/crosvm_builder.cpp
+++ b/host/libs/vm_manager/crosvm_builder.cpp
@@ -28,6 +28,17 @@
#include "host/libs/config/known_paths.h"
namespace cuttlefish {
+namespace {
+
+std::string MacCrosvmArgument(std::optional<std::string_view> mac) {
+ return mac.has_value() ? fmt::format(",mac={}", mac.value()) : "";
+}
+
+std::string PciCrosvmArgument(std::optional<pci::Address> pci) {
+ return pci.has_value() ? fmt::format(",pci-address={}", pci.value().Id()) : "";
+}
+
+}
CrosvmBuilder::CrosvmBuilder() : command_("crosvm") {}
@@ -104,10 +115,12 @@ void CrosvmBuilder::AddSerial(const std::string& output,
}
#ifdef __linux__
-SharedFD CrosvmBuilder::AddTap(const std::string& tap_name) {
+SharedFD CrosvmBuilder::AddTap(const std::string& tap_name,
+ std::optional<std::string_view> mac,
+ const std::optional<pci::Address>& pci) {
auto tap_fd = OpenTapInterface(tap_name);
if (tap_fd->IsOpen()) {
- command_.AddParameter("--net=tap-fd=", tap_fd);
+ command_.AddParameter("--net=tap-fd=", tap_fd, MacCrosvmArgument(mac), PciCrosvmArgument(pci));
} else {
LOG(ERROR) << "Unable to connect to \"" << tap_name
<< "\": " << tap_fd->StrError();
@@ -115,16 +128,6 @@ SharedFD CrosvmBuilder::AddTap(const std::string& tap_name) {
return tap_fd;
}
-SharedFD CrosvmBuilder::AddTap(const std::string& tap_name, const std::string& mac) {
- auto tap_fd = OpenTapInterface(tap_name);
- if (tap_fd->IsOpen()) {
- command_.AddParameter("--net=tap-fd=", tap_fd, ",mac=\"", mac, "\"");
- } else {
- LOG(ERROR) << "Unable to connect to \"" << tap_name
- << "\": " << tap_fd->StrError();
- }
- return tap_fd;
-}
#endif
int CrosvmBuilder::HvcNum() { return hvc_num_; }
diff --git a/host/libs/vm_manager/crosvm_builder.h b/host/libs/vm_manager/crosvm_builder.h
index e2f722e03..123d01a6a 100644
--- a/host/libs/vm_manager/crosvm_builder.h
+++ b/host/libs/vm_manager/crosvm_builder.h
@@ -15,12 +15,14 @@
#pragma once
+#include <optional>
#include <string>
#include <utility>
#include "common/libs/fs/shared_fd.h"
#include "common/libs/utils/result.h"
#include "common/libs/utils/subprocess.h"
+#include "host/libs/vm_manager/pci.h"
namespace cuttlefish {
@@ -48,8 +50,9 @@ class CrosvmBuilder {
void AddSerial(const std::string& output, const std::string& input);
#ifdef __linux__
- SharedFD AddTap(const std::string& tap_name);
- SharedFD AddTap(const std::string& tap_name, const std::string& mac);
+ SharedFD AddTap(const std::string& tap_name,
+ std::optional<std::string_view> mac = std::nullopt,
+ const std::optional<pci::Address>& pci = std::nullopt);
#endif
int HvcNum();
diff --git a/host/libs/vm_manager/crosvm_manager.cpp b/host/libs/vm_manager/crosvm_manager.cpp
index 899e39653..529a660cc 100644
--- a/host/libs/vm_manager/crosvm_manager.cpp
+++ b/host/libs/vm_manager/crosvm_manager.cpp
@@ -582,10 +582,16 @@ Result<std::vector<MonitorCommand>> CrosvmManager::StartCommands(
// having to pass arguments to crosvm via a wrapper script.
#ifdef __linux__
if (!gpu_capture_enabled) {
- // The ordering of tap devices is important. Make sure any change here
- // is reflected in ethprime u-boot variable
- crosvm_cmd.AddTap(instance.mobile_tap_name(), instance.mobile_mac());
- crosvm_cmd.AddTap(instance.ethernet_tap_name(), instance.ethernet_mac());
+ // The PCI ordering of tap devices is important. Make sure any change here
+ // is reflected in ethprime u-boot variable.
+ // TODO(b/218364216, b/322862402): Crosvm occupies 32 PCI devices first and only then uses PCI
+ // functions which may break order. The final solution is going to be a PCI allocation strategy
+ // that will guarantee the ordering. For now, hardcode PCI network devices to unoccupied
+ // functions.
+ const pci::Address mobile_pci = pci::Address(0, VmManager::kNetPciDeviceNum, 1);
+ const pci::Address ethernet_pci = pci::Address(0, VmManager::kNetPciDeviceNum, 2);
+ crosvm_cmd.AddTap(instance.mobile_tap_name(), instance.mobile_mac(), mobile_pci);
+ crosvm_cmd.AddTap(instance.ethernet_tap_name(), instance.ethernet_mac(), ethernet_pci);
if (!config.virtio_mac80211_hwsim() && environment.enable_wifi()) {
wifi_tap = crosvm_cmd.AddTap(instance.wifi_tap_name());
diff --git a/host/libs/vm_manager/pci.cpp b/host/libs/vm_manager/pci.cpp
new file mode 100644
index 000000000..9b57fcfd1
--- /dev/null
+++ b/host/libs/vm_manager/pci.cpp
@@ -0,0 +1,37 @@
+//
+// Copyright (C) 2024 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "host/libs/vm_manager/pci.h"
+
+#include <android-base/logging.h>
+
+namespace cuttlefish {
+namespace pci {
+namespace {
+constexpr unsigned int kMaxBus = 255;
+constexpr unsigned int kMaxDevice = 31;
+constexpr unsigned int kMaxFunction = 7;
+} // namespace
+
+Address::Address(unsigned int bus, unsigned int device, unsigned int function)
+ : bus_(bus), device_(device), function_(function) {
+ if (bus_ > kMaxBus || device_ > kMaxDevice || function_ > kMaxFunction) {
+ LOG(FATAL) << "Failed to create PCI address instance with bus: " << bus_
+ << " device: " << device_ << " function: " << function_;
+ }
+}
+
+} // namespace pci
+} // namespace cuttlefish \ No newline at end of file
diff --git a/host/libs/vm_manager/pci.h b/host/libs/vm_manager/pci.h
new file mode 100644
index 000000000..47ca0769a
--- /dev/null
+++ b/host/libs/vm_manager/pci.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <fmt/core.h>
+
+namespace cuttlefish {
+namespace pci {
+
+class Address {
+ public:
+ Address(unsigned int bus, unsigned int device, unsigned int function);
+
+ unsigned int Bus() const { return bus_; };
+ unsigned int Device() const { return device_; }
+ unsigned int Function() const { return function_; }
+ std::string Id() const {
+ return fmt::format("{:02x}:{:02x}.{:01x}", bus_, device_, function_);
+ }
+
+ private:
+ unsigned int bus_;
+ unsigned int device_;
+ unsigned int function_;
+};
+
+} // namespace pci
+} // namespace cuttlefish
diff --git a/host/libs/vm_manager/vm_manager.cpp b/host/libs/vm_manager/vm_manager.cpp
index c916b13e8..7860d3cb2 100644
--- a/host/libs/vm_manager/vm_manager.cpp
+++ b/host/libs/vm_manager/vm_manager.cpp
@@ -37,21 +37,22 @@
namespace cuttlefish {
namespace vm_manager {
-std::unique_ptr<VmManager> GetVmManager(const std::string& name, Arch arch) {
+std::unique_ptr<VmManager> GetVmManager(VmmMode vmm_mode, Arch arch) {
std::unique_ptr<VmManager> vmm;
- if (name == QemuManager::name()) {
+ if (vmm_mode == VmmMode::kQemu) {
vmm.reset(new QemuManager(arch));
- } else if (name == Gem5Manager::name()) {
+ } else if (vmm_mode == VmmMode::kGem5) {
vmm.reset(new Gem5Manager(arch));
- } else if (name == CrosvmManager::name()) {
+ } else if (vmm_mode == VmmMode::kCrosvm) {
vmm.reset(new CrosvmManager());
}
if (!vmm) {
- LOG(ERROR) << "Invalid VM manager: " << name;
+ LOG(ERROR) << "Invalid VM manager: " << vmm_mode;
return {};
}
if (!vmm->IsSupported()) {
- LOG(ERROR) << "VM manager " << name << " is not supported on this machine.";
+ LOG(ERROR) << "VM manager " << vmm_mode
+ << " is not supported on this machine.";
return {};
}
return vmm;
diff --git a/host/libs/vm_manager/vm_manager.h b/host/libs/vm_manager/vm_manager.h
index 29fb68a8e..9b704771c 100644
--- a/host/libs/vm_manager/vm_manager.h
+++ b/host/libs/vm_manager/vm_manager.h
@@ -80,6 +80,8 @@ class VmManager {
// the persistent disk
static const int kDefaultNumBootDevices = 2;
+ static constexpr const int kNetPciDeviceNum = 1;
+
// LINT.IfChange(virtio_gpu_pci_address)
static constexpr const int kGpuPciSlotNum = 2;
// LINT.ThenChange(../../../shared/sepolicy/vendor/genfs_contexts:virtio_gpu_pci_address)
@@ -116,7 +118,7 @@ fruit::Component<fruit::Required<const CuttlefishConfig,
VmManager>
VmManagerComponent();
-std::unique_ptr<VmManager> GetVmManager(const std::string&, Arch arch);
+std::unique_ptr<VmManager> GetVmManager(VmmMode vmm, Arch arch);
Result<std::unordered_map<std::string, std::string>>
ConfigureMultipleBootDevices(const std::string& pci_path, int pci_offset,
diff --git a/shared/tv/device_vendor.mk b/shared/tv/device_vendor.mk
index 77e6a493a..f6e10ab4a 100644
--- a/shared/tv/device_vendor.mk
+++ b/shared/tv/device_vendor.mk
@@ -25,7 +25,7 @@ $(call inherit-product, device/google/cuttlefish/shared/graphics/device_vendor.m
$(call inherit-product, device/google/cuttlefish/shared/swiftshader/device_vendor.mk)
$(call inherit-product, device/google/cuttlefish/shared/virgl/device_vendor.mk)
$(call inherit-product, device/google/cuttlefish/shared/device.mk)
-$(call inherit-product, vendor/google/tv/gcbs/projects/reference-v4/dtvstack.mk)
+$(call inherit-product-if-exists, vendor/google/tv/gcbs/projects/reference-v4/dtvstack.mk)
# Loads the camera HAL and which set of cameras is required.
$(call inherit-product, device/google/cuttlefish/shared/camera/device_vendor.mk)
diff --git a/system_image/Android.bp b/system_image/Android.bp
index 65abbd5f2..c8347dd71 100644
--- a/system_image/Android.bp
+++ b/system_image/Android.bp
@@ -62,114 +62,279 @@ android_symlinks = [
},
]
+phony {
+ name: "fonts",
+ required: [
+ "AndroidClock.ttf",
+ "CarroisGothicSC-Regular.ttf",
+ "ComingSoon.ttf",
+ "CutiveMono.ttf",
+ "DancingScript-Regular.ttf",
+ "DroidSansMono.ttf",
+ "NotoColorEmoji.ttf",
+ "NotoColorEmojiFlags.ttf",
+ "NotoColorEmojiLegacy.ttf",
+ "NotoNaskhArabic-Bold.ttf",
+ "NotoNaskhArabic-Regular.ttf",
+ "NotoNaskhArabicUI-Bold.ttf",
+ "NotoNaskhArabicUI-Regular.ttf",
+ "NotoSansAdlam-VF.ttf",
+ "NotoSansAhom-Regular.otf",
+ "NotoSansAnatolianHieroglyphs-Regular.otf",
+ "NotoSansArmenian-VF.ttf",
+ "NotoSansAvestan-Regular.ttf",
+ "NotoSansBalinese-Regular.ttf",
+ "NotoSansBamum-Regular.ttf",
+ "NotoSansBassaVah-Regular.otf",
+ "NotoSansBatak-Regular.ttf",
+ "NotoSansBengali-VF.ttf",
+ "NotoSansBengaliUI-VF.ttf",
+ "NotoSansBhaiksuki-Regular.otf",
+ "NotoSansBrahmi-Regular.ttf",
+ "NotoSansBuginese-Regular.ttf",
+ "NotoSansBuhid-Regular.ttf",
+ "NotoSansCJK-Regular.ttc",
+ "NotoSansCanadianAboriginal-Regular.ttf",
+ "NotoSansCarian-Regular.ttf",
+ "NotoSansChakma-Regular.otf",
+ "NotoSansCham-Bold.ttf",
+ "NotoSansCham-Regular.ttf",
+ "NotoSansCherokee-Regular.ttf",
+ "NotoSansCoptic-Regular.ttf",
+ "NotoSansCuneiform-Regular.ttf",
+ "NotoSansCypriot-Regular.ttf",
+ "NotoSansDeseret-Regular.ttf",
+ "NotoSansDevanagari-VF.ttf",
+ "NotoSansDevanagariUI-VF.ttf",
+ "NotoSansEgyptianHieroglyphs-Regular.ttf",
+ "NotoSansElbasan-Regular.otf",
+ "NotoSansEthiopic-VF.ttf",
+ "NotoSansGeorgian-VF.ttf",
+ "NotoSansGlagolitic-Regular.ttf",
+ "NotoSansGothic-Regular.ttf",
+ "NotoSansGrantha-Regular.ttf",
+ "NotoSansGujarati-Bold.ttf",
+ "NotoSansGujarati-Regular.ttf",
+ "NotoSansGujaratiUI-Bold.ttf",
+ "NotoSansGujaratiUI-Regular.ttf",
+ "NotoSansGunjalaGondi-Regular.otf",
+ "NotoSansGurmukhi-VF.ttf",
+ "NotoSansGurmukhiUI-VF.ttf",
+ "NotoSansHanifiRohingya-Regular.otf",
+ "NotoSansHanunoo-Regular.ttf",
+ "NotoSansHatran-Regular.otf",
+ "NotoSansHebrew-Bold.ttf",
+ "NotoSansHebrew-Regular.ttf",
+ "NotoSansImperialAramaic-Regular.ttf",
+ "NotoSansInscriptionalPahlavi-Regular.ttf",
+ "NotoSansInscriptionalParthian-Regular.ttf",
+ "NotoSansJavanese-Regular.otf",
+ "NotoSansKaithi-Regular.ttf",
+ "NotoSansKannada-VF.ttf",
+ "NotoSansKannadaUI-VF.ttf",
+ "NotoSansKayahLi-Regular.ttf",
+ "NotoSansKharoshthi-Regular.ttf",
+ "NotoSansKhmer-VF.ttf",
+ "NotoSansKhmerUI-Bold.ttf",
+ "NotoSansKhmerUI-Regular.ttf",
+ "NotoSansKhojki-Regular.otf",
+ "NotoSansLao-Bold.ttf",
+ "NotoSansLao-Regular.ttf",
+ "NotoSansLaoUI-Bold.ttf",
+ "NotoSansLaoUI-Regular.ttf",
+ "NotoSansLepcha-Regular.ttf",
+ "NotoSansLimbu-Regular.ttf",
+ "NotoSansLinearA-Regular.otf",
+ "NotoSansLinearB-Regular.ttf",
+ "NotoSansLisu-Regular.ttf",
+ "NotoSansLycian-Regular.ttf",
+ "NotoSansLydian-Regular.ttf",
+ "NotoSansMalayalam-VF.ttf",
+ "NotoSansMalayalamUI-VF.ttf",
+ "NotoSansMandaic-Regular.ttf",
+ "NotoSansManichaean-Regular.otf",
+ "NotoSansMarchen-Regular.otf",
+ "NotoSansMasaramGondi-Regular.otf",
+ "NotoSansMedefaidrin-VF.ttf",
+ "NotoSansMeeteiMayek-Regular.ttf",
+ "NotoSansMeroitic-Regular.otf",
+ "NotoSansMiao-Regular.otf",
+ "NotoSansModi-Regular.ttf",
+ "NotoSansMongolian-Regular.ttf",
+ "NotoSansMro-Regular.otf",
+ "NotoSansMultani-Regular.otf",
+ "NotoSansMyanmar-Bold.otf",
+ "NotoSansMyanmar-Medium.otf",
+ "NotoSansMyanmar-Regular.otf",
+ "NotoSansMyanmarUI-Bold.otf",
+ "NotoSansMyanmarUI-Medium.otf",
+ "NotoSansMyanmarUI-Regular.otf",
+ "NotoSansNKo-Regular.ttf",
+ "NotoSansNabataean-Regular.otf",
+ "NotoSansNewTaiLue-Regular.ttf",
+ "NotoSansNewa-Regular.otf",
+ "NotoSansOgham-Regular.ttf",
+ "NotoSansOlChiki-Regular.ttf",
+ "NotoSansOldItalic-Regular.ttf",
+ "NotoSansOldNorthArabian-Regular.otf",
+ "NotoSansOldPermic-Regular.otf",
+ "NotoSansOldPersian-Regular.ttf",
+ "NotoSansOldSouthArabian-Regular.ttf",
+ "NotoSansOldTurkic-Regular.ttf",
+ "NotoSansOriya-Bold.ttf",
+ "NotoSansOriya-Regular.ttf",
+ "NotoSansOriyaUI-Bold.ttf",
+ "NotoSansOriyaUI-Regular.ttf",
+ "NotoSansOsage-Regular.ttf",
+ "NotoSansOsmanya-Regular.ttf",
+ "NotoSansPahawhHmong-Regular.otf",
+ "NotoSansPalmyrene-Regular.otf",
+ "NotoSansPauCinHau-Regular.otf",
+ "NotoSansPhagsPa-Regular.ttf",
+ "NotoSansPhoenician-Regular.ttf",
+ "NotoSansRejang-Regular.ttf",
+ "NotoSansRunic-Regular.ttf",
+ "NotoSansSamaritan-Regular.ttf",
+ "NotoSansSaurashtra-Regular.ttf",
+ "NotoSansSharada-Regular.otf",
+ "NotoSansShavian-Regular.ttf",
+ "NotoSansSinhala-VF.ttf",
+ "NotoSansSinhalaUI-VF.ttf",
+ "NotoSansSoraSompeng-Regular.otf",
+ "NotoSansSoyombo-VF.ttf",
+ "NotoSansSundanese-Regular.ttf",
+ "NotoSansSylotiNagri-Regular.ttf",
+ "NotoSansSymbols-Regular-Subsetted.ttf",
+ "NotoSansSymbols-Regular-Subsetted2.ttf",
+ "NotoSansSyriacEastern-Regular.ttf",
+ "NotoSansSyriacEstrangela-Regular.ttf",
+ "NotoSansSyriacWestern-Regular.ttf",
+ "NotoSansTagalog-Regular.ttf",
+ "NotoSansTagbanwa-Regular.ttf",
+ "NotoSansTaiLe-Regular.ttf",
+ "NotoSansTaiTham-Regular.ttf",
+ "NotoSansTaiViet-Regular.ttf",
+ "NotoSansTakri-VF.ttf",
+ "NotoSansTamil-VF.ttf",
+ "NotoSansTamilUI-VF.ttf",
+ "NotoSansTelugu-VF.ttf",
+ "NotoSansTeluguUI-VF.ttf",
+ "NotoSansThaana-Bold.ttf",
+ "NotoSansThaana-Regular.ttf",
+ "NotoSansThai-Bold.ttf",
+ "NotoSansThai-Regular.ttf",
+ "NotoSansThaiUI-Bold.ttf",
+ "NotoSansThaiUI-Regular.ttf",
+ "NotoSansTifinagh-Regular.otf",
+ "NotoSansUgaritic-Regular.ttf",
+ "NotoSansVai-Regular.ttf",
+ "NotoSansWancho-Regular.otf",
+ "NotoSansWarangCiti-Regular.otf",
+ "NotoSansYi-Regular.ttf",
+ "NotoSerif-Bold.ttf",
+ "NotoSerif-BoldItalic.ttf",
+ "NotoSerif-Italic.ttf",
+ "NotoSerif-Regular.ttf",
+ "NotoSerifArmenian-VF.ttf",
+ "NotoSerifBengali-VF.ttf",
+ "NotoSerifCJK-Regular.ttc",
+ "NotoSerifDevanagari-VF.ttf",
+ "NotoSerifDogra-Regular.ttf",
+ "NotoSerifEthiopic-VF.ttf",
+ "NotoSerifGeorgian-VF.ttf",
+ "NotoSerifGujarati-VF.ttf",
+ "NotoSerifGurmukhi-VF.ttf",
+ "NotoSerifHebrew-Bold.ttf",
+ "NotoSerifHebrew-Regular.ttf",
+ "NotoSerifKannada-VF.ttf",
+ "NotoSerifKhmer-Bold.otf",
+ "NotoSerifKhmer-Regular.otf",
+ "NotoSerifLao-Bold.ttf",
+ "NotoSerifLao-Regular.ttf",
+ "NotoSerifMalayalam-VF.ttf",
+ "NotoSerifMyanmar-Bold.otf",
+ "NotoSerifMyanmar-Regular.otf",
+ "NotoSerifNyiakengPuachueHmong-VF.ttf",
+ "NotoSerifSinhala-VF.ttf",
+ "NotoSerifTamil-VF.ttf",
+ "NotoSerifTelugu-VF.ttf",
+ "NotoSerifThai-Bold.ttf",
+ "NotoSerifThai-Regular.ttf",
+ "NotoSerifTibetan-VF.ttf",
+ "NotoSerifYezidi-VF.ttf",
+ "Roboto-Regular.ttf",
+ "RobotoFlex-Regular.ttf",
+ "RobotoStatic-Regular.ttf",
+ "SourceSansPro-Bold.ttf",
+ "SourceSansPro-BoldItalic.ttf",
+ "SourceSansPro-Italic.ttf",
+ "SourceSansPro-Regular.ttf",
+ "SourceSansPro-SemiBold.ttf",
+ "SourceSansPro-SemiBoldItalic.ttf",
+ "font_fallback.xml",
+ "fonts.xml",
+ ],
+}
+
android_system_image {
name: "aosp_cf_system_x86_64",
+
+ partition_name: "system",
+ base_dir: "system",
+ dirs: android_rootdirs,
+ symlinks: android_symlinks,
+ file_contexts: ":plat_file_contexts",
+ linker_config_src: "linker.config.json",
+ fsverity: {
+ inputs: [
+ "etc/boot-image.prof",
+ "etc/dirty-image-objects",
+ "etc/preloaded-classes",
+ "etc/classpaths/*.pb",
+ "framework/*",
+ "framework/*/*", // framework/{arch}
+ "framework/oat/*/*", // framework/oat/{arch}
+ ],
+ libs: [":framework-res{.export-package.apk}"],
+ },
+ build_logtags: true,
+
use_avb: true,
avb_private_key: ":microdroid_sign_key",
avb_algorithm: "SHA256_RSA4096",
avb_hash_algorithm: "sha256",
- partition_name: "system",
+
deps: [
- "abb",
"abx",
- "abx2xml",
"aconfigd",
- "adb_debug.prop",
- "adevice_fingerprint",
"aflags",
- "aidl_lazy_cb_test_server",
- "aidl_lazy_test_server",
"am",
"android_build_prop",
"android_vintf_manifest",
- "android.hardware.audio.common-util",
- "android.hardware.audio.common-V3-ndk",
- "android.hardware.audio.common@5.0-util",
- "android.hardware.audio.common@5.0",
- "android.hardware.audio.common@6.0-util",
- "android.hardware.audio.common@6.0",
- "android.hardware.audio.core-V2-ndk",
- "android.hardware.audio.core.sounddose-V2-ndk",
- "android.hardware.audio.effect-V2-ndk",
- "android.hardware.audio.effect.service-aidl.example",
- "android.hardware.audio.effect@5.0-util",
- "android.hardware.audio.effect@5.0",
- "android.hardware.audio.effect@6.0-util",
- "android.hardware.audio.effect@6.0",
- "android.hardware.audio.effect@7.0-impl",
- "android.hardware.audio.service-aidl.example",
- "android.hardware.audio@5.0-util",
- "android.hardware.audio@5.0",
- "android.hardware.audio@6.0-util",
- "android.hardware.audio@6.0",
- "android.hardware.biometrics.fingerprint@2.1",
- "android.hardware.bluetooth.audio-impl",
- "android.hardware.boot-service.default_recovery",
- "android.hardware.common.fmq-V1-ndk",
- "android.hardware.fastboot@1.1-impl-mock",
- "android.hardware.graphics.allocator-service.minigbm",
- "android.hardware.graphics.mapper@4.0-impl.minigbm",
- "android.hardware.health-service.cuttlefish_recovery",
- "android.hardware.health-V2-ndk",
- "android.hardware.health-V3-ndk",
- "android.hardware.power.stats-V1-cpp",
- "android.hardware.radio.config@1.0",
- "android.hardware.radio.deprecated@1.0",
- "android.hardware.radio@1.0",
- "android.hardware.radio@1.1",
- "android.hardware.radio@1.2",
- "android.hardware.radio@1.3",
- "android.hardware.radio@1.4",
- "android.hardware.secure_element@1.0",
- "android.hardware.security.secretkeeper-service.nonsecure",
- "android.hidl.allocator@1.0-service",
- "android.hidl.memory.token@1.0",
- "android.hidl.memory@1.0",
- "android.hidl.safe_union@1.0",
- "android.media.audio.common.types-V3-ndk",
"android.system.suspend-service",
- "AndroidClock.ttf",
"apexd",
"app_process",
"appops",
"appwidget",
- "arping",
"atrace",
- "audio.primary.default",
"audioserver",
- "auditctl",
- "av-audio-types-aidl-V1-ndk",
- "avbctl",
- "awk",
- "bc",
"bcc",
"blank_screen",
"blkid",
"bmgr",
"bootanimation",
- "bootctl",
"bootstat",
"boringssl_self_test",
"bpfloader",
"bu",
- "bugreport_procdump",
"bugreport",
"bugreportz",
- "bzip2",
- "cacerts",
"cameraserver",
- "CarroisGothicSC-Regular.ttf",
"cgroups.json",
- "cgroups.recovery.json",
- "checkpoint_gc",
"cmd",
- "ComingSoon.ttf",
"content",
"cppreopts.sh",
"credstore",
- "CutiveMono.ttf",
- "cuttlefish_sensor_injection",
- "DancingScript-Regular.ttf",
"debuggerd",
"device_config",
"dirty-image-objects",
@@ -177,45 +342,30 @@ android_system_image {
"dmabuf_dump",
"dmctl",
"dmesgd",
- "dmuserd",
"dnsmasq",
"dpm",
- "DroidSansMono.ttf",
"dump.erofs",
"dumpstate",
- "dumpsys_vendor",
"dumpsys",
"e2freefrag",
"e2fsck",
"e2fsdroid",
"etc_hosts",
- "evemu-record",
"extra_free_kbytes",
"fastbootd",
"flags_health_check",
- "font_fallback.xml",
- "fonts.xml",
"framework-audio_effects.xml",
"framework-sysconfig.xml",
"fsck_msdos",
"fsck.erofs",
- "fsck.exfat",
"fsck.f2fs",
- "fstab.cf.ext4.cts",
- "fstab.cf.ext4.hctr2",
- "fstab.cf.f2fs.cts",
- "fstab.cf.f2fs.hctr2",
"fstab.postinstall",
"fsverity_init",
"fsverity-release-cert-der",
"gatekeeperd",
"gpu_counter_producer",
"gpuservice",
- "group_odm",
- "group_product",
- "group_system_ext",
"group_system",
- "group_vendor",
"gsi_tool",
"gsid",
"heapprofd_client",
@@ -224,8 +374,7 @@ android_system_image {
"hiddenapi-package-whitelist.xml",
"hidl_lazy_cb_test_server",
"hidl_lazy_test_server",
- "hwservicemanager",
- "idlcli",
+ "idc_data",
"idmap2",
"idmap2d",
"ime",
@@ -233,7 +382,6 @@ android_system_image {
"incident-helper-cmd",
"incident",
"incidentd",
- "init-debug.rc",
"init_first_stage",
"init.boringssl.zygote64_32.rc",
"init.boringssl.zygote64.rc",
@@ -247,52 +395,30 @@ android_system_image {
"initial-package-stopped-states.xml",
"input",
"installd",
- "iotop",
"ip",
- "iperf3",
"iptables",
- "iw",
"kcmdlinectrl",
+ "keychars_data",
+ "keylayout_data",
"keystore_cli_v2",
"keystore2",
- "layertracegenerator",
- "ld.config.recovery.txt",
"ld.mc",
- "ldd",
- "lib_renderControl_enc",
"libaaudio",
- "libadbd_auth",
- "libadbd_fs",
"libalarm_jni",
"libamidi",
"libandroid_runtime",
"libandroid_servers",
"libandroid",
- "libandroidemu",
"libandroidfw",
"libartpalette-system",
"libasyncio",
- "libasyncio",
- "libaudio_aidl_conversion_common_ndk_cpp",
- "libaudio_aidl_conversion_common_ndk",
- "libaudio_aidl_conversion_common_ndk",
- "libaudio_aidl_conversion_core_ndk",
- "libaudio_aidl_conversion_effect_ndk",
"libaudio-resampler",
- "libaudioaidlcommon",
- "libaudioaidlcommon",
"libaudioeffect_jni",
"libaudiohal_deathhandler",
"libaudiohal",
- "libaudiohal@5.0",
- "libaudiohal@6.0",
- "libaudiohal@7.0",
- "libaudiohal@7.1",
- "libaudiohal@aidl",
"libaudiopolicyengineconfigurable",
"libaudiopreprocessing",
"libaudioutils",
- "libaudioutils",
"libbinder_ndk",
"libbinder_rpc_unstable",
"libbinder",
@@ -311,11 +437,8 @@ android_system_image {
"libcups",
"libcutils",
"libdmabufheap",
- "libdmabufheap",
"libdownmix",
"libdrm",
- "libdrm",
- "libdrm",
"libdrmclearkeyplugin",
"libdrmframework_jni",
"libdrmframework",
@@ -323,9 +446,7 @@ android_system_image {
"libeffectproxy",
"libeffects",
"libeffectsconfig",
- "libeffectsconfig",
"libEGL_angle",
- "libEGL_emulation",
"libEGL",
"libepoxy",
"libETC1",
@@ -341,12 +462,8 @@ android_system_image {
"libgatekeeper",
"libgbm",
"libGLESv1_CM_angle",
- "libGLESv1_CM_emulation",
"libGLESv1_CM",
- "libGLESv1_enc",
"libGLESv2_angle",
- "libGLESv2_emulation",
- "libGLESv2_enc",
"libGLESv2",
"libGLESv3",
"libgralloctypes",
@@ -357,7 +474,6 @@ android_system_image {
"libhardware",
"libhidcommand_jni",
"libhidlmemory",
- "libhidlmemory",
"libhidltransport",
"libhwbinder",
"libincident",
@@ -374,7 +490,6 @@ android_system_image {
"liblp",
"liblz4",
"libmedia_helper",
- "libmedia_helper",
"libmedia_jni",
"libmedia",
"libmediandk",
@@ -387,10 +502,7 @@ android_system_image {
"libnetlink",
"libnetutils",
"libneuralnetworks_packageinfo",
- "libnfc_nci_jni",
"libnl",
- "libOpenglCodecCommon",
- "libOpenglSystemCommon",
"libOpenMAXAL",
"libOpenSLES",
"libpdfium",
@@ -398,7 +510,6 @@ android_system_image {
"libpolicy-subsystem",
"libpower",
"libpowermanager",
- "libprintspooler_jni",
"libprocessgroup_setup",
"libprotobuf-cpp-full",
"libradio_metadata",
@@ -418,14 +529,10 @@ android_system_image {
"libsonivox",
"libsoundpool",
"libspeexresampler",
- "libspeexresampler",
- "libspeexresampler",
"libsqlite",
"libsquashfs_utils",
"libssl",
"libstagefright_foundation",
- "libstagefright_foundation",
- "libstagefright_foundation",
"libstagefright_httplive",
"libstagefright_omx",
"libstagefright",
@@ -460,235 +567,31 @@ android_system_image {
"logcat",
"logcatd",
"logd",
- "logpersist.start",
- "logtagd.rc",
- "logwrapper",
"lpdump",
"lpdumpd",
"lshal",
"make_f2fs",
- "mapper.minigbm",
"mdnsd",
"media_profiles_V1_0.dtd",
"mediacodec.policy",
"mediaextractor",
"mediametrics",
"migrate_legacy_obb_data",
- "mini-keyctl",
"misctrl",
"mke2fs",
"mkfs.erofs",
- "mkfs.exfat",
"mm_events",
"monkey",
"mtectrl",
"ndc",
"netd",
"netutils-wrapper-1.0",
- "newfs_msdos",
- "NotoColorEmoji.ttf",
- "NotoColorEmojiFlags.ttf",
- "NotoColorEmojiLegacy.ttf",
- "NotoNaskhArabic-Bold.ttf",
- "NotoNaskhArabic-Regular.ttf",
- "NotoNaskhArabicUI-Bold.ttf",
- "NotoNaskhArabicUI-Regular.ttf",
- "NotoSansAdlam-VF.ttf",
- "NotoSansAhom-Regular.otf",
- "NotoSansAnatolianHieroglyphs-Regular.otf",
- "NotoSansArmenian-VF.ttf",
- "NotoSansAvestan-Regular.ttf",
- "NotoSansBalinese-Regular.ttf",
- "NotoSansBamum-Regular.ttf",
- "NotoSansBassaVah-Regular.otf",
- "NotoSansBatak-Regular.ttf",
- "NotoSansBengali-VF.ttf",
- "NotoSansBengaliUI-VF.ttf",
- "NotoSansBhaiksuki-Regular.otf",
- "NotoSansBrahmi-Regular.ttf",
- "NotoSansBuginese-Regular.ttf",
- "NotoSansBuhid-Regular.ttf",
- "NotoSansCanadianAboriginal-Regular.ttf",
- "NotoSansCarian-Regular.ttf",
- "NotoSansChakma-Regular.otf",
- "NotoSansCham-Bold.ttf",
- "NotoSansCham-Regular.ttf",
- "NotoSansCherokee-Regular.ttf",
- "NotoSansCJK-Regular.ttc",
- "NotoSansCoptic-Regular.ttf",
- "NotoSansCuneiform-Regular.ttf",
- "NotoSansCypriot-Regular.ttf",
- "NotoSansDeseret-Regular.ttf",
- "NotoSansDevanagari-VF.ttf",
- "NotoSansDevanagariUI-VF.ttf",
- "NotoSansEgyptianHieroglyphs-Regular.ttf",
- "NotoSansElbasan-Regular.otf",
- "NotoSansEthiopic-VF.ttf",
- "NotoSansGeorgian-VF.ttf",
- "NotoSansGlagolitic-Regular.ttf",
- "NotoSansGothic-Regular.ttf",
- "NotoSansGrantha-Regular.ttf",
- "NotoSansGujarati-Bold.ttf",
- "NotoSansGujarati-Regular.ttf",
- "NotoSansGujaratiUI-Bold.ttf",
- "NotoSansGujaratiUI-Regular.ttf",
- "NotoSansGunjalaGondi-Regular.otf",
- "NotoSansGurmukhi-VF.ttf",
- "NotoSansGurmukhiUI-VF.ttf",
- "NotoSansHanifiRohingya-Regular.otf",
- "NotoSansHanunoo-Regular.ttf",
- "NotoSansHatran-Regular.otf",
- "NotoSansHebrew-Bold.ttf",
- "NotoSansHebrew-Regular.ttf",
- "NotoSansImperialAramaic-Regular.ttf",
- "NotoSansInscriptionalPahlavi-Regular.ttf",
- "NotoSansInscriptionalParthian-Regular.ttf",
- "NotoSansJavanese-Regular.otf",
- "NotoSansKaithi-Regular.ttf",
- "NotoSansKannada-VF.ttf",
- "NotoSansKannadaUI-VF.ttf",
- "NotoSansKayahLi-Regular.ttf",
- "NotoSansKharoshthi-Regular.ttf",
- "NotoSansKhmer-VF.ttf",
- "NotoSansKhmerUI-Bold.ttf",
- "NotoSansKhmerUI-Regular.ttf",
- "NotoSansKhojki-Regular.otf",
- "NotoSansLao-Bold.ttf",
- "NotoSansLao-Regular.ttf",
- "NotoSansLaoUI-Bold.ttf",
- "NotoSansLaoUI-Regular.ttf",
- "NotoSansLepcha-Regular.ttf",
- "NotoSansLimbu-Regular.ttf",
- "NotoSansLinearA-Regular.otf",
- "NotoSansLinearB-Regular.ttf",
- "NotoSansLisu-Regular.ttf",
- "NotoSansLycian-Regular.ttf",
- "NotoSansLydian-Regular.ttf",
- "NotoSansMalayalam-VF.ttf",
- "NotoSansMalayalamUI-VF.ttf",
- "NotoSansMandaic-Regular.ttf",
- "NotoSansManichaean-Regular.otf",
- "NotoSansMarchen-Regular.otf",
- "NotoSansMasaramGondi-Regular.otf",
- "NotoSansMedefaidrin-VF.ttf",
- "NotoSansMeeteiMayek-Regular.ttf",
- "NotoSansMeroitic-Regular.otf",
- "NotoSansMiao-Regular.otf",
- "NotoSansModi-Regular.ttf",
- "NotoSansMongolian-Regular.ttf",
- "NotoSansMro-Regular.otf",
- "NotoSansMultani-Regular.otf",
- "NotoSansMyanmar-Bold.otf",
- "NotoSansMyanmar-Medium.otf",
- "NotoSansMyanmar-Regular.otf",
- "NotoSansMyanmarUI-Bold.otf",
- "NotoSansMyanmarUI-Medium.otf",
- "NotoSansMyanmarUI-Regular.otf",
- "NotoSansNabataean-Regular.otf",
- "NotoSansNewa-Regular.otf",
- "NotoSansNewTaiLue-Regular.ttf",
- "NotoSansNKo-Regular.ttf",
- "NotoSansOgham-Regular.ttf",
- "NotoSansOlChiki-Regular.ttf",
- "NotoSansOldItalic-Regular.ttf",
- "NotoSansOldNorthArabian-Regular.otf",
- "NotoSansOldPermic-Regular.otf",
- "NotoSansOldPersian-Regular.ttf",
- "NotoSansOldSouthArabian-Regular.ttf",
- "NotoSansOldTurkic-Regular.ttf",
- "NotoSansOriya-Bold.ttf",
- "NotoSansOriya-Regular.ttf",
- "NotoSansOriyaUI-Bold.ttf",
- "NotoSansOriyaUI-Regular.ttf",
- "NotoSansOsage-Regular.ttf",
- "NotoSansOsmanya-Regular.ttf",
- "NotoSansPahawhHmong-Regular.otf",
- "NotoSansPalmyrene-Regular.otf",
- "NotoSansPauCinHau-Regular.otf",
- "NotoSansPhagsPa-Regular.ttf",
- "NotoSansPhoenician-Regular.ttf",
- "NotoSansRejang-Regular.ttf",
- "NotoSansRunic-Regular.ttf",
- "NotoSansSamaritan-Regular.ttf",
- "NotoSansSaurashtra-Regular.ttf",
- "NotoSansSharada-Regular.otf",
- "NotoSansShavian-Regular.ttf",
- "NotoSansSinhala-VF.ttf",
- "NotoSansSinhalaUI-VF.ttf",
- "NotoSansSoraSompeng-Regular.otf",
- "NotoSansSoyombo-VF.ttf",
- "NotoSansSundanese-Regular.ttf",
- "NotoSansSylotiNagri-Regular.ttf",
- "NotoSansSymbols-Regular-Subsetted.ttf",
- "NotoSansSymbols-Regular-Subsetted2.ttf",
- "NotoSansSyriacEastern-Regular.ttf",
- "NotoSansSyriacEstrangela-Regular.ttf",
- "NotoSansSyriacWestern-Regular.ttf",
- "NotoSansTagalog-Regular.ttf",
- "NotoSansTagbanwa-Regular.ttf",
- "NotoSansTaiLe-Regular.ttf",
- "NotoSansTaiTham-Regular.ttf",
- "NotoSansTaiViet-Regular.ttf",
- "NotoSansTakri-VF.ttf",
- "NotoSansTamil-VF.ttf",
- "NotoSansTamilUI-VF.ttf",
- "NotoSansTelugu-VF.ttf",
- "NotoSansTeluguUI-VF.ttf",
- "NotoSansThaana-Bold.ttf",
- "NotoSansThaana-Regular.ttf",
- "NotoSansThai-Bold.ttf",
- "NotoSansThai-Regular.ttf",
- "NotoSansThaiUI-Bold.ttf",
- "NotoSansThaiUI-Regular.ttf",
- "NotoSansTifinagh-Regular.otf",
- "NotoSansUgaritic-Regular.ttf",
- "NotoSansVai-Regular.ttf",
- "NotoSansWancho-Regular.otf",
- "NotoSansWarangCiti-Regular.otf",
- "NotoSansYi-Regular.ttf",
- "NotoSerif-Bold.ttf",
- "NotoSerif-BoldItalic.ttf",
- "NotoSerif-Italic.ttf",
- "NotoSerif-Regular.ttf",
- "NotoSerifArmenian-VF.ttf",
- "NotoSerifBengali-VF.ttf",
- "NotoSerifCJK-Regular.ttc",
- "NotoSerifDevanagari-VF.ttf",
- "NotoSerifDogra-Regular.ttf",
- "NotoSerifEthiopic-VF.ttf",
- "NotoSerifGeorgian-VF.ttf",
- "NotoSerifGujarati-VF.ttf",
- "NotoSerifGurmukhi-VF.ttf",
- "NotoSerifHebrew-Bold.ttf",
- "NotoSerifHebrew-Regular.ttf",
- "NotoSerifKannada-VF.ttf",
- "NotoSerifKhmer-Bold.otf",
- "NotoSerifKhmer-Regular.otf",
- "NotoSerifLao-Bold.ttf",
- "NotoSerifLao-Regular.ttf",
- "NotoSerifMalayalam-VF.ttf",
- "NotoSerifMyanmar-Bold.otf",
- "NotoSerifMyanmar-Regular.otf",
- "NotoSerifNyiakengPuachueHmong-VF.ttf",
- "NotoSerifSinhala-VF.ttf",
- "NotoSerifTamil-VF.ttf",
- "NotoSerifTelugu-VF.ttf",
- "NotoSerifThai-Bold.ttf",
- "NotoSerifThai-Regular.ttf",
- "NotoSerifTibetan-VF.ttf",
- "NotoSerifYezidi-VF.ttf",
"odsign",
- "ot-cli-ftd",
- "ot-ctl",
"otapreopt_chroot",
"otapreopt_script",
"otapreopt_slot",
"otapreopt",
- "passwd_odm",
- "passwd_product",
- "passwd_system_ext",
"passwd_system",
- "passwd_vendor",
"perfetto",
"ping",
"ping6",
@@ -697,11 +600,8 @@ android_system_image {
"pm",
"power.default",
"preinstalled-packages-asl-files.xml",
- "preinstalled-packages-platform-aosp-product.xml",
"preinstalled-packages-platform-generic-system.xml",
- "preinstalled-packages-platform-handheld-product.xml",
"preinstalled-packages-platform-handheld-system.xml",
- "preinstalled-packages-platform-telephony-product.xml",
"preinstalled-packages-platform.xml",
"preinstalled-packages-strict-signature.xml",
"preloaded-classes",
@@ -712,24 +612,13 @@ android_system_image {
"printflags",
"privapp-permissions-platform.xml",
"prng_seeder",
- "procrank",
- "profcollectctl",
- "profcollectd",
- "reboot",
- "record_binder",
"recovery-persist",
"recovery-refresh",
- "recovery",
- "remount",
"requestsync",
"resize2fs",
- "Roboto-Regular.ttf",
- "RobotoFlex-Regular.ttf",
- "RobotoStatic-Regular.ttf",
"rss_hwm_reset",
"run-as",
"sample_camera_extensions.xml",
- "sanitizer-status",
"schedtest",
"screencap",
"screenrecord",
@@ -738,68 +627,36 @@ android_system_image {
"sensorservice",
"server_configurable_flags",
"service",
- "servicedispatcher",
- "servicemanager.recovery",
"servicemanager",
- "settaskprofile",
"settings",
"sfdo",
"sgdisk",
- "sh",
- "showmap",
- "simpleperf_app_runner",
- "simpleperf",
"sload_f2fs",
"sm",
"snapshotctl",
"snapuserd_ramdisk",
"snapuserd",
"socket_vsock_proxy",
- "SourceSansPro-Bold.ttf",
- "SourceSansPro-BoldItalic.ttf",
- "SourceSansPro-Italic.ttf",
- "SourceSansPro-Regular.ttf",
- "SourceSansPro-SemiBold.ttf",
- "SourceSansPro-SemiBoldItalic.ttf",
- "sqlite3",
- "ss",
- "start_with_lockagent",
"storaged",
- "strace",
"surfaceflinger",
"suspend_blocker",
"svc",
"task_profiles.json",
"tc",
- "tcpdump",
"telecom",
- "tinycap",
- "tinyhostless",
- "tinymix",
- "tinypcminfo",
- "tinyplay",
"tombstone_producer",
"tombstone_transmit",
"tombstoned",
"toolbox",
- "toybox",
- "toybox",
"traced_perf",
"traced_probes",
"traced",
- "tracepath",
- "tracepath6",
- "traceroute6",
"trigger_perfetto",
"tune2fs",
"ueventd.rc",
"uiautomator",
"uinput",
"uncrypt",
- "unwind_info",
- "unwind_reg_info",
- "unwind_symbols",
- "update_engine_client",
"update_engine_sideload",
"update_engine",
"update_verifier",
@@ -814,9 +671,7 @@ android_system_image {
"wifi.rc",
"wificond",
"wm",
- "xml2abx",
"xtables.lock",
- "ziptool",
],
multilib: {
common: {
@@ -859,57 +714,12 @@ android_system_image {
"com.android.cellbroadcast",
"com.android.compos",
"com.android.future.usb.accessory",
- "com.android.hardware.authsecret",
- "com.android.hardware.biometrics.face.virtual",
- "com.android.hardware.biometrics.fingerprint.virtual",
- "com.android.hardware.boot",
- "com.android.hardware.cas",
- "com.android.hardware.contexthub",
- "com.android.hardware.dumpstate",
- "com.android.hardware.gnss",
- "com.android.hardware.input.processor",
- "com.android.hardware.keymint.rust_cf_remote",
- "com.android.hardware.keymint.rust_nonsecure",
- "com.android.hardware.memtrack",
- "com.android.hardware.net.nlinterceptor",
- "com.android.hardware.neuralnetworks",
- "com.android.hardware.power",
- "com.android.hardware.rebootescrow",
- "com.android.hardware.secure_element",
- "com.android.hardware.security.authgraph",
- "com.android.hardware.sensors",
- "com.android.hardware.tetheroffload",
- "com.android.hardware.thermal",
- "com.android.hardware.threadnetwork",
- "com.android.hardware.usb",
- "com.android.hardware.uwb",
- "com.android.hardware.vibrator",
- "com.android.hardware.wifi",
- "com.android.i18n",
- "com.android.ipsec",
- "com.android.hardware.gatekeeper.cf_remote",
- "com.android.hardware.gatekeeper.nonsecure",
- "com.android.hardware.keymint.rust_cf_remote",
- "com.android.hardware.keymint.rust_nonsecure",
"com.android.location.provider",
"com.android.media.remotedisplay.xml",
"com.android.media.remotedisplay",
"com.android.mediadrm.signer",
"com.android.nfc_extras",
"com.android.runtime",
- "com.google.cf.bt",
- "com.google.cf.confirmationui",
- "com.google.cf.health.storage",
- "com.google.cf.health",
- "com.google.cf.identity",
- "com.google.cf.input.config",
- "com.google.cf.ir",
- "com.google.cf.light",
- "com.google.cf.nfc",
- "com.google.cf.oemlock",
- "com.google.cf.rild",
- "com.google.cf.vulkan",
- "com.google.cf.wifi",
"CompanionDeviceManager",
"Contacts",
"ContactsProvider",
@@ -928,6 +738,7 @@ android_system_image {
"ext",
"ExternalStorageProvider",
"ExtShared",
+ "fonts",
"framework-graphics",
"framework-location",
"framework-minus-apex-install-dependencies",
@@ -984,9 +795,7 @@ android_system_image {
"SettingsIntelligence",
"SettingsProvider",
"SharedStorageBackup",
- "shell_and_utilities_recovery",
"shell_and_utilities_system",
- "shell_and_utilities_vendor",
"Shell",
"SimAppDialog",
"SoundPicker",
@@ -1024,46 +833,52 @@ android_system_image {
],
},
},
- base_dir: "system",
- dirs: android_rootdirs,
- symlinks: android_symlinks,
- file_contexts: ":plat_file_contexts",
- linker_config_src: "linker.config.json",
- arch: {
- x86: {
- multilib: {
- common: {
- deps: [
- "com.android.wifi",
- ],
- },
- },
- },
- x86_64: {
+ product_variables: {
+ debuggable: {
deps: [
- "libgfxstream_backend",
+ "adevice_fingerprint",
+ "arping",
+ "avbctl",
+ "bootctl",
+ "dmuserd",
+ "evemu-record",
+ "idlcli",
+ "init-debug.rc",
+ "iotop",
+ "iperf3",
+ "iw",
+ "layertracegenerator",
+ "logpersist.start",
+ "logtagd.rc",
+ "ot-cli-ftd",
+ "ot-ctl",
+ "procrank",
+ "profcollectctl",
+ "profcollectd",
+ "record_binder",
+ "sanitizer-status",
+ "servicedispatcher",
+ "showmap",
+ "sqlite3",
+ "ss",
+ "start_with_lockagent",
+ "strace",
+ "su",
+ "tinycap",
+ "tinyhostless",
+ "tinymix",
+ "tinypcminfo",
+ "tinyplay",
+ "tracepath",
+ "tracepath6",
+ "traceroute6",
+ "unwind_info",
+ "unwind_reg_info",
+ "unwind_symbols",
+ "update_engine_client",
],
- multilib: {
- common: {
- deps: [
- "com.android.wifi",
- ],
- },
- },
},
},
- fsverity: {
- inputs: [
- "etc/boot-image.prof",
- "etc/dirty-image-objects",
- "etc/preloaded-classes",
- "etc/classpaths/*.pb",
- "framework/*",
- "framework/*/*", // framework/{arch}
- "framework/oat/*/*", // framework/oat/{arch}
- ],
- libs: [":framework-res{.export-package.apk}"],
- },
}
prebuilt_etc {