Merge "Add a main function for the edit monitor" into main
diff --git a/core/Makefile b/core/Makefile
index 2cdb24f..96d0357 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -7950,9 +7950,14 @@
# Desktop pack recovery image hook.
ifneq (,$(strip $(PACK_DESKTOP_RECOVERY_IMAGE)))
PACK_RECOVERY_IMAGE_TARGET := $(PRODUCT_OUT)/android-desktop_recovery_image.bin
+PACK_RECOVERY_IMAGE_ARGS := --noarchive --recovery
+
+ifneq (,$(strip $(PACK_RECOVERY_IMAGE_EXPERIMENTAL)))
+PACK_RECOVERY_IMAGE_ARGS += --experimental
+endif # PACK_RECOVERY_IMAGE_EXPERIMENTAL
$(PACK_RECOVERY_IMAGE_TARGET): $(IMAGES) $(PACK_IMAGE_SCRIPT)
- $(PACK_IMAGE_SCRIPT) --out_dir $(PRODUCT_OUT) --noarchive --recovery
+ $(PACK_IMAGE_SCRIPT) --out_dir $(PRODUCT_OUT) $(PACK_RECOVERY_IMAGE_ARGS)
PACKED_RECOVERY_IMAGE_ARCHIVE_TARGET := $(PACK_RECOVERY_IMAGE_TARGET).gz
@@ -7986,6 +7991,28 @@
endif # PACK_DESKTOP_UPDATE_IMAGE
+PACK_MIGRATION_IMAGE_SCRIPT := $(HOST_OUT_EXECUTABLES)/pack_migration_image
+
+# -----------------------------------------------------------------
+# Desktop pack migration image hook.
+ifeq ($(ANDROID_DESKTOP_MIGRATION_IMAGE),true)
+PACK_MIGRATION_IMAGE_TARGET := $(PRODUCT_OUT)/android-desktop_migration_image.bin
+
+$(PACK_MIGRATION_IMAGE_TARGET): $(IMAGES) $(PACK_MIGRATION_IMAGE_SCRIPT)
+ $(PACK_MIGRATION_IMAGE_SCRIPT) --out_dir $(PRODUCT_OUT) --noarchive
+
+PACKED_MIGRATION_IMAGE_ARCHIVE_TARGET := $(PACK_MIGRATION_IMAGE_TARGET).gz
+
+$(PACKED_MIGRATION_IMAGE_ARCHIVE_TARGET): $(PACK_MIGRATION_IMAGE_TARGET) | $(GZIP)
+ $(GZIP) -fk $(PACK_MIGRATION_IMAGE_TARGET)
+
+$(call dist-for-goals,dist_files,$(PACKED_MIGRATION_IMAGE_ARCHIVE_TARGET))
+
+.PHONY: pack-migration-image
+pack-migration-image: $(PACK_MIGRATION_IMAGE_TARGET)
+
+endif # ANDROID_DESKTOP_MIGRATION_IMAGE
+
# -----------------------------------------------------------------
# OS Licensing
diff --git a/core/android_soong_config_vars.mk b/core/android_soong_config_vars.mk
index cb5575b..f66bdd9 100644
--- a/core/android_soong_config_vars.mk
+++ b/core/android_soong_config_vars.mk
@@ -192,3 +192,15 @@
ifneq ($(strip $(AUDIOSERVER_MULTILIB)),)
$(call soong_config_set,soundtrigger,audioserver_multilib,$(AUDIOSERVER_MULTILIB))
endif
+
+# Add sim_count, disable_rild_oem_hook, and use_aosp_rild flag for ril related modules
+$(call soong_config_set,ril,sim_count,$(SIM_COUNT))
+ifneq ($(DISABLE_RILD_OEM_HOOK), false)
+ $(call soong_config_set_bool,ril,disable_rild_oem_hook,true)
+endif
+ifneq ($(ENABLE_VENDOR_RIL_SERVICE), true)
+ $(call soong_config_set_bool,ril,use_aosp_rild,true)
+endif
+
+# Export target_board_platform to soong for hardware/google/graphics/common/libmemtrack:memtrack.$(TARGET_BOARD_PLATFORM)
+$(call soong_config_set,ANDROID,target_board_platform,$(TARGET_BOARD_PLATFORM))
diff --git a/core/config_sanitizers.mk b/core/config_sanitizers.mk
index c0f2c68..ab2d5c1 100644
--- a/core/config_sanitizers.mk
+++ b/core/config_sanitizers.mk
@@ -284,9 +284,9 @@
ifneq ($(filter memtag_stack,$(my_sanitize)),)
my_cflags += -fsanitize=memtag-stack
my_ldflags += -fsanitize=memtag-stack
- my_cflags += -Xclang -target-feature -Xclang +mte
- my_ldflags += -Xclang -target-feature -Xclang +mte
- my_asflags += -Xclang -target-feature -Xclang +mte
+ my_cflags += -march=armv8a+memtag
+ my_ldflags += -march=armv8a+memtag
+ my_asflags += -march=armv8a+memtag
my_sanitize := $(filter-out memtag_stack,$(my_sanitize))
endif
diff --git a/target/product/gsi/Android.bp b/target/product/gsi/Android.bp
index 45ba143..f18f35a 100644
--- a/target/product/gsi/Android.bp
+++ b/target/product/gsi/Android.bp
@@ -46,3 +46,18 @@
installed_location: "etc/init/config",
symlink_target: "/system/system_ext/etc/init/config",
}
+
+// init.gsi.rc, GSI-specific init script.
+prebuilt_etc {
+ name: "init.gsi.rc",
+ src: "init.gsi.rc",
+ system_ext_specific: true,
+ relative_install_path: "init",
+}
+
+prebuilt_etc {
+ name: "init.vndk-nodef.rc",
+ src: "init.vndk-nodef.rc",
+ system_ext_specific: true,
+ relative_install_path: "gsi",
+}
diff --git a/target/product/gsi/Android.mk b/target/product/gsi/Android.mk
index 36897fe..7291059 100644
--- a/target/product/gsi/Android.mk
+++ b/target/product/gsi/Android.mk
@@ -138,31 +138,3 @@
include $(BUILD_PHONY_PACKAGE)
-
-#####################################################################
-# init.gsi.rc, GSI-specific init script.
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := init.gsi.rc
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_NOTICE_FILE := build/soong/licenses/LICENSE
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-LOCAL_MODULE_CLASS := ETC
-LOCAL_SYSTEM_EXT_MODULE := true
-LOCAL_MODULE_RELATIVE_PATH := init
-
-include $(BUILD_PREBUILT)
-
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := init.vndk-nodef.rc
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_NOTICE_FILE := build/soong/licenses/LICENSE
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-LOCAL_MODULE_CLASS := ETC
-LOCAL_SYSTEM_EXT_MODULE := true
-LOCAL_MODULE_RELATIVE_PATH := gsi
-
-include $(BUILD_PREBUILT)
diff --git a/tools/aconfig/aconfig/Android.bp b/tools/aconfig/aconfig/Android.bp
index 68521af..f4dd103 100644
--- a/tools/aconfig/aconfig/Android.bp
+++ b/tools/aconfig/aconfig/Android.bp
@@ -234,6 +234,7 @@
name: "libaconfig_test_rust_library",
crate_name: "aconfig_test_rust_library",
aconfig_declarations: "aconfig.test.flags",
+ host_supported: true,
}
rust_test {
diff --git a/tools/aconfig/aconfig/src/commands.rs b/tools/aconfig/aconfig/src/commands.rs
index 797a893..496876e 100644
--- a/tools/aconfig/aconfig/src/commands.rs
+++ b/tools/aconfig/aconfig/src/commands.rs
@@ -280,10 +280,11 @@
caches: Vec<Input>,
container: &str,
file: &StorageFileType,
+ version: u32,
) -> Result<Vec<u8>> {
let parsed_flags_vec: Vec<ProtoParsedFlags> =
caches.into_iter().map(|mut input| input.try_parse_flags()).collect::<Result<Vec<_>>>()?;
- generate_storage_file(container, parsed_flags_vec.iter(), file)
+ generate_storage_file(container, parsed_flags_vec.iter(), file, version)
}
pub fn create_device_config_defaults(mut input: Input) -> Result<Vec<u8>> {
diff --git a/tools/aconfig/aconfig/src/main.rs b/tools/aconfig/aconfig/src/main.rs
index 1fb64f9..edb4fd3 100644
--- a/tools/aconfig/aconfig/src/main.rs
+++ b/tools/aconfig/aconfig/src/main.rs
@@ -16,6 +16,8 @@
//! `aconfig` is a build time tool to manage build time configurations, such as feature flags.
+use aconfig_storage_file::DEFAULT_FILE_VERSION;
+use aconfig_storage_file::MAX_SUPPORTED_FILE_VERSION;
use anyhow::{anyhow, bail, Context, Result};
use clap::{builder::ArgAction, builder::EnumValueParser, Arg, ArgMatches, Command};
use core::any::Any;
@@ -159,7 +161,13 @@
.value_parser(|s: &str| StorageFileType::try_from(s)),
)
.arg(Arg::new("cache").long("cache").action(ArgAction::Append).required(true))
- .arg(Arg::new("out").long("out").required(true)),
+ .arg(Arg::new("out").long("out").required(true))
+ .arg(
+ Arg::new("version")
+ .long("version")
+ .required(false)
+ .value_parser(|s: &str| s.parse::<u32>()),
+ ),
)
}
@@ -309,12 +317,18 @@
write_output_to_file_or_stdout(path, &output)?;
}
Some(("create-storage", sub_matches)) => {
+ let version =
+ get_optional_arg::<u32>(sub_matches, "version").unwrap_or(&DEFAULT_FILE_VERSION);
+ if *version > MAX_SUPPORTED_FILE_VERSION {
+ bail!("Invalid version selected ({})", version);
+ }
let file = get_required_arg::<StorageFileType>(sub_matches, "file")
.context("Invalid storage file selection")?;
let cache = open_zero_or_more_files(sub_matches, "cache")?;
let container = get_required_arg::<String>(sub_matches, "container")?;
let path = get_required_arg::<String>(sub_matches, "out")?;
- let output = commands::create_storage(cache, container, file)
+
+ let output = commands::create_storage(cache, container, file, *version)
.context("failed to create storage files")?;
write_output_to_file_or_stdout(path, &output)?;
}
diff --git a/tools/aconfig/aconfig/src/storage/flag_info.rs b/tools/aconfig/aconfig/src/storage/flag_info.rs
index 04e2b93..2532609 100644
--- a/tools/aconfig/aconfig/src/storage/flag_info.rs
+++ b/tools/aconfig/aconfig/src/storage/flag_info.rs
@@ -17,14 +17,12 @@
use crate::commands::assign_flag_ids;
use crate::storage::FlagPackage;
use aconfig_protos::ProtoFlagPermission;
-use aconfig_storage_file::{
- FlagInfoHeader, FlagInfoList, FlagInfoNode, StorageFileType, FILE_VERSION,
-};
+use aconfig_storage_file::{FlagInfoHeader, FlagInfoList, FlagInfoNode, StorageFileType};
use anyhow::{anyhow, Result};
-fn new_header(container: &str, num_flags: u32) -> FlagInfoHeader {
+fn new_header(container: &str, num_flags: u32, version: u32) -> FlagInfoHeader {
FlagInfoHeader {
- version: FILE_VERSION,
+ version,
container: String::from(container),
file_type: StorageFileType::FlagInfo as u8,
file_size: 0,
@@ -33,7 +31,11 @@
}
}
-pub fn create_flag_info(container: &str, packages: &[FlagPackage]) -> Result<FlagInfoList> {
+pub fn create_flag_info(
+ container: &str,
+ packages: &[FlagPackage],
+ version: u32,
+) -> Result<FlagInfoList> {
// create list
let num_flags = packages.iter().map(|pkg| pkg.boolean_flags.len() as u32).sum();
@@ -51,7 +53,7 @@
}
let mut list = FlagInfoList {
- header: new_header(container, num_flags),
+ header: new_header(container, num_flags, version),
nodes: is_flag_rw.iter().map(|&rw| FlagInfoNode::create(rw)).collect(),
};
@@ -67,11 +69,12 @@
mod tests {
use super::*;
use crate::storage::{group_flags_by_package, tests::parse_all_test_flags};
+ use aconfig_storage_file::DEFAULT_FILE_VERSION;
pub fn create_test_flag_info_list_from_source() -> Result<FlagInfoList> {
let caches = parse_all_test_flags();
let packages = group_flags_by_package(caches.iter());
- create_flag_info("mockup", &packages)
+ create_flag_info("mockup", &packages, DEFAULT_FILE_VERSION)
}
#[test]
diff --git a/tools/aconfig/aconfig/src/storage/flag_table.rs b/tools/aconfig/aconfig/src/storage/flag_table.rs
index a971211..6046d7e 100644
--- a/tools/aconfig/aconfig/src/storage/flag_table.rs
+++ b/tools/aconfig/aconfig/src/storage/flag_table.rs
@@ -19,13 +19,12 @@
use aconfig_protos::ProtoFlagPermission;
use aconfig_storage_file::{
get_table_size, FlagTable, FlagTableHeader, FlagTableNode, StorageFileType, StoredFlagType,
- FILE_VERSION,
};
use anyhow::{anyhow, Result};
-fn new_header(container: &str, num_flags: u32) -> FlagTableHeader {
+fn new_header(container: &str, num_flags: u32, version: u32) -> FlagTableHeader {
FlagTableHeader {
- version: FILE_VERSION,
+ version,
container: String::from(container),
file_type: StorageFileType::FlagMap as u8,
file_size: 0,
@@ -86,12 +85,16 @@
}
}
-pub fn create_flag_table(container: &str, packages: &[FlagPackage]) -> Result<FlagTable> {
+pub fn create_flag_table(
+ container: &str,
+ packages: &[FlagPackage],
+ version: u32,
+) -> Result<FlagTable> {
// create table
let num_flags = packages.iter().map(|pkg| pkg.boolean_flags.len() as u32).sum();
let num_buckets = get_table_size(num_flags)?;
- let mut header = new_header(container, num_flags);
+ let mut header = new_header(container, num_flags, version);
let mut buckets = vec![None; num_buckets as usize];
let mut node_wrappers = packages
.iter()
@@ -138,13 +141,15 @@
#[cfg(test)]
mod tests {
+ use aconfig_storage_file::DEFAULT_FILE_VERSION;
+
use super::*;
use crate::storage::{group_flags_by_package, tests::parse_all_test_flags};
fn create_test_flag_table_from_source() -> Result<FlagTable> {
let caches = parse_all_test_flags();
let packages = group_flags_by_package(caches.iter());
- create_flag_table("mockup", &packages)
+ create_flag_table("mockup", &packages, DEFAULT_FILE_VERSION)
}
#[test]
diff --git a/tools/aconfig/aconfig/src/storage/flag_value.rs b/tools/aconfig/aconfig/src/storage/flag_value.rs
index c15ba54..6a655b9 100644
--- a/tools/aconfig/aconfig/src/storage/flag_value.rs
+++ b/tools/aconfig/aconfig/src/storage/flag_value.rs
@@ -17,12 +17,12 @@
use crate::commands::assign_flag_ids;
use crate::storage::FlagPackage;
use aconfig_protos::ProtoFlagState;
-use aconfig_storage_file::{FlagValueHeader, FlagValueList, StorageFileType, FILE_VERSION};
+use aconfig_storage_file::{FlagValueHeader, FlagValueList, StorageFileType};
use anyhow::{anyhow, Result};
-fn new_header(container: &str, num_flags: u32) -> FlagValueHeader {
+fn new_header(container: &str, num_flags: u32, version: u32) -> FlagValueHeader {
FlagValueHeader {
- version: FILE_VERSION,
+ version,
container: String::from(container),
file_type: StorageFileType::FlagVal as u8,
file_size: 0,
@@ -31,12 +31,16 @@
}
}
-pub fn create_flag_value(container: &str, packages: &[FlagPackage]) -> Result<FlagValueList> {
+pub fn create_flag_value(
+ container: &str,
+ packages: &[FlagPackage],
+ version: u32,
+) -> Result<FlagValueList> {
// create list
let num_flags = packages.iter().map(|pkg| pkg.boolean_flags.len() as u32).sum();
let mut list = FlagValueList {
- header: new_header(container, num_flags),
+ header: new_header(container, num_flags, version),
booleans: vec![false; num_flags as usize],
};
@@ -61,13 +65,15 @@
#[cfg(test)]
mod tests {
+ use aconfig_storage_file::DEFAULT_FILE_VERSION;
+
use super::*;
use crate::storage::{group_flags_by_package, tests::parse_all_test_flags};
pub fn create_test_flag_value_list_from_source() -> Result<FlagValueList> {
let caches = parse_all_test_flags();
let packages = group_flags_by_package(caches.iter());
- create_flag_value("mockup", &packages)
+ create_flag_value("mockup", &packages, DEFAULT_FILE_VERSION)
}
#[test]
diff --git a/tools/aconfig/aconfig/src/storage/mod.rs b/tools/aconfig/aconfig/src/storage/mod.rs
index 1d8dcfc..9e5dad5 100644
--- a/tools/aconfig/aconfig/src/storage/mod.rs
+++ b/tools/aconfig/aconfig/src/storage/mod.rs
@@ -88,6 +88,7 @@
container: &str,
parsed_flags_vec_iter: I,
file: &StorageFileType,
+ version: u32,
) -> Result<Vec<u8>>
where
I: Iterator<Item = &'a ProtoParsedFlags>,
@@ -96,19 +97,19 @@
match file {
StorageFileType::PackageMap => {
- let package_table = create_package_table(container, &packages)?;
+ let package_table = create_package_table(container, &packages, version)?;
Ok(package_table.into_bytes())
}
StorageFileType::FlagMap => {
- let flag_table = create_flag_table(container, &packages)?;
+ let flag_table = create_flag_table(container, &packages, version)?;
Ok(flag_table.into_bytes())
}
StorageFileType::FlagVal => {
- let flag_value = create_flag_value(container, &packages)?;
+ let flag_value = create_flag_value(container, &packages, version)?;
Ok(flag_value.into_bytes())
}
StorageFileType::FlagInfo => {
- let flag_info = create_flag_info(container, &packages)?;
+ let flag_info = create_flag_info(container, &packages, version)?;
Ok(flag_info.into_bytes())
}
}
diff --git a/tools/aconfig/aconfig/src/storage/package_table.rs b/tools/aconfig/aconfig/src/storage/package_table.rs
index c53602f..56559f8 100644
--- a/tools/aconfig/aconfig/src/storage/package_table.rs
+++ b/tools/aconfig/aconfig/src/storage/package_table.rs
@@ -18,14 +18,13 @@
use aconfig_storage_file::{
get_table_size, PackageTable, PackageTableHeader, PackageTableNode, StorageFileType,
- FILE_VERSION,
};
use crate::storage::FlagPackage;
-fn new_header(container: &str, num_packages: u32) -> PackageTableHeader {
+fn new_header(container: &str, num_packages: u32, version: u32) -> PackageTableHeader {
PackageTableHeader {
- version: FILE_VERSION,
+ version,
container: String::from(container),
file_type: StorageFileType::PackageMap as u8,
file_size: 0,
@@ -56,20 +55,26 @@
}
}
-pub fn create_package_table(container: &str, packages: &[FlagPackage]) -> Result<PackageTable> {
+pub fn create_package_table(
+ container: &str,
+ packages: &[FlagPackage],
+ version: u32,
+) -> Result<PackageTable> {
// create table
let num_packages = packages.len() as u32;
let num_buckets = get_table_size(num_packages)?;
- let mut header = new_header(container, num_packages);
+ let mut header = new_header(container, num_packages, version);
let mut buckets = vec![None; num_buckets as usize];
- let mut node_wrappers: Vec<_> =
- packages.iter().map(|pkg| PackageTableNodeWrapper::new(pkg, num_buckets)).collect();
+ let mut node_wrappers: Vec<_> = packages
+ .iter()
+ .map(|pkg: &FlagPackage<'_>| PackageTableNodeWrapper::new(pkg, num_buckets))
+ .collect();
// initialize all header fields
header.bucket_offset = header.into_bytes().len() as u32;
header.node_offset = header.bucket_offset + num_buckets * 4;
header.file_size = header.node_offset
- + node_wrappers.iter().map(|x| x.node.into_bytes().len()).sum::<usize>() as u32;
+ + node_wrappers.iter().map(|x| x.node.into_bytes(version).len()).sum::<usize>() as u32;
// sort node_wrappers by bucket index for efficiency
node_wrappers.sort_by(|a, b| a.bucket_index.cmp(&b.bucket_index));
@@ -87,7 +92,7 @@
if buckets[node_bucket_idx as usize].is_none() {
buckets[node_bucket_idx as usize] = Some(offset);
}
- offset += node_wrappers[i].node.into_bytes().len() as u32;
+ offset += node_wrappers[i].node.into_bytes(version).len() as u32;
if let Some(index) = next_node_bucket_idx {
if index == node_bucket_idx {
@@ -106,13 +111,15 @@
#[cfg(test)]
mod tests {
+ use aconfig_storage_file::DEFAULT_FILE_VERSION;
+
use super::*;
use crate::storage::{group_flags_by_package, tests::parse_all_test_flags};
pub fn create_test_package_table_from_source() -> Result<PackageTable> {
let caches = parse_all_test_flags();
let packages = group_flags_by_package(caches.iter());
- create_package_table("mockup", &packages)
+ create_package_table("mockup", &packages, DEFAULT_FILE_VERSION)
}
#[test]
diff --git a/tools/aconfig/aconfig_flags/Android.bp b/tools/aconfig/aconfig_flags/Android.bp
index e327ced..4c1fd4e 100644
--- a/tools/aconfig/aconfig_flags/Android.bp
+++ b/tools/aconfig/aconfig_flags/Android.bp
@@ -44,3 +44,8 @@
name: "libaconfig_flags_cc",
aconfig_declarations: "aconfig_flags",
}
+
+java_aconfig_library {
+ name: "aconfig_flags_java",
+ aconfig_declarations: "aconfig_flags",
+}
diff --git a/tools/aconfig/aconfig_storage_file/src/lib.rs b/tools/aconfig/aconfig_storage_file/src/lib.rs
index cf52bc0..1d92ba4 100644
--- a/tools/aconfig/aconfig_storage_file/src/lib.rs
+++ b/tools/aconfig/aconfig_storage_file/src/lib.rs
@@ -57,8 +57,13 @@
BytesParseFail, HashTableSizeLimit, InvalidFlagValueType, InvalidStoredFlagType,
};
-/// Storage file version
-pub const FILE_VERSION: u32 = 1;
+/// The max storage file version from which we can safely read/write. May be
+/// experimental.
+pub const MAX_SUPPORTED_FILE_VERSION: u32 = 2;
+
+/// The newest fully-released version. Unless otherwise specified, this is the
+/// version we will write.
+pub const DEFAULT_FILE_VERSION: u32 = 1;
/// Good hash table prime number
pub(crate) const HASH_PRIMES: [u32; 29] = [
@@ -244,6 +249,11 @@
Ok(val)
}
+/// Read and parse the first 4 bytes of buf as u32.
+pub fn read_u32_from_start_of_bytes(buf: &[u8]) -> Result<u32, AconfigStorageError> {
+ read_u32_from_bytes(buf, &mut 0)
+}
+
/// Read and parse bytes as u32
pub fn read_u32_from_bytes(buf: &[u8], head: &mut usize) -> Result<u32, AconfigStorageError> {
let val =
@@ -254,6 +264,16 @@
Ok(val)
}
+// Read and parse bytes as u64
+pub fn read_u64_from_bytes(buf: &[u8], head: &mut usize) -> Result<u64, AconfigStorageError> {
+ let val =
+ u64::from_le_bytes(buf[*head..*head + 8].try_into().map_err(|errmsg| {
+ BytesParseFail(anyhow!("fail to parse u64 from bytes: {}", errmsg))
+ })?);
+ *head += 8;
+ Ok(val)
+}
+
/// Read and parse bytes as string
pub(crate) fn read_str_from_bytes(
buf: &[u8],
diff --git a/tools/aconfig/aconfig_storage_file/src/package_table.rs b/tools/aconfig/aconfig_storage_file/src/package_table.rs
index a5bd9e6..af39fbc 100644
--- a/tools/aconfig/aconfig_storage_file/src/package_table.rs
+++ b/tools/aconfig/aconfig_storage_file/src/package_table.rs
@@ -17,7 +17,10 @@
//! package table module defines the package table file format and methods for serialization
//! and deserialization
-use crate::{get_bucket_index, read_str_from_bytes, read_u32_from_bytes, read_u8_from_bytes};
+use crate::{
+ get_bucket_index, read_str_from_bytes, read_u32_from_bytes, read_u64_from_bytes,
+ read_u8_from_bytes,
+};
use crate::{AconfigStorageError, StorageFileType};
use anyhow::anyhow;
use serde::{Deserialize, Serialize};
@@ -117,7 +120,16 @@
impl PackageTableNode {
/// Serialize to bytes
- pub fn into_bytes(&self) -> Vec<u8> {
+ pub fn into_bytes(&self, version: u32) -> Vec<u8> {
+ match version {
+ 1 => Self::into_bytes_v1(self),
+ 2 => Self::into_bytes_v2(self),
+ // TODO(b/316357686): into_bytes should return a Result.
+ _ => Self::into_bytes_v2(&self),
+ }
+ }
+
+ fn into_bytes_v1(&self) -> Vec<u8> {
let mut result = Vec::new();
let name_bytes = self.package_name.as_bytes();
result.extend_from_slice(&(name_bytes.len() as u32).to_le_bytes());
@@ -128,18 +140,64 @@
result
}
- /// Deserialize from bytes
- pub fn from_bytes(bytes: &[u8]) -> Result<Self, AconfigStorageError> {
+ fn into_bytes_v2(&self) -> Vec<u8> {
+ let mut result = Vec::new();
+ let name_bytes = self.package_name.as_bytes();
+ result.extend_from_slice(&(name_bytes.len() as u32).to_le_bytes());
+ result.extend_from_slice(name_bytes);
+ result.extend_from_slice(&self.package_id.to_le_bytes());
+ // V2 storage files have a fingerprint. Current struct (v1) does not, so
+ // we write 0.
+ result.extend_from_slice(&0u64.to_le_bytes());
+ result.extend_from_slice(&self.boolean_start_index.to_le_bytes());
+ result.extend_from_slice(&self.next_offset.unwrap_or(0).to_le_bytes());
+ result
+ }
+
+ /// Deserialize from bytes based on file version.
+ pub fn from_bytes(bytes: &[u8], version: u32) -> Result<Self, AconfigStorageError> {
+ match version {
+ 1 => Self::from_bytes_v1(bytes),
+ 2 => Self::from_bytes_v2(bytes),
+ _ => {
+ return Err(AconfigStorageError::BytesParseFail(anyhow!(
+ "Binary file is an unsupported version: {}",
+ version
+ )))
+ }
+ }
+ }
+
+ fn from_bytes_v1(bytes: &[u8]) -> Result<Self, AconfigStorageError> {
let mut head = 0;
- let node = Self {
- package_name: read_str_from_bytes(bytes, &mut head)?,
- package_id: read_u32_from_bytes(bytes, &mut head)?,
- boolean_start_index: read_u32_from_bytes(bytes, &mut head)?,
- next_offset: match read_u32_from_bytes(bytes, &mut head)? {
- 0 => None,
- val => Some(val),
- },
+ let package_name = read_str_from_bytes(bytes, &mut head)?;
+ let package_id = read_u32_from_bytes(bytes, &mut head)?;
+ let boolean_start_index = read_u32_from_bytes(bytes, &mut head)?;
+ let next_offset = match read_u32_from_bytes(bytes, &mut head)? {
+ 0 => None,
+ val => Some(val),
};
+
+ let node = Self { package_name, package_id, boolean_start_index, next_offset };
+ Ok(node)
+ }
+
+ fn from_bytes_v2(bytes: &[u8]) -> Result<Self, AconfigStorageError> {
+ let mut head = 0;
+ let package_name = read_str_from_bytes(bytes, &mut head)?;
+ let package_id = read_u32_from_bytes(bytes, &mut head)?;
+
+ // Fingerprint is unused in the current struct (v1), but we need to read
+ // the bytes if the storage file type is v2 or else the subsequent
+ // fields will be inaccurate.
+ let _fingerprint = read_u64_from_bytes(bytes, &mut head)?;
+ let boolean_start_index = read_u32_from_bytes(bytes, &mut head)?;
+ let next_offset = match read_u32_from_bytes(bytes, &mut head)? {
+ 0 => None,
+ val => Some(val),
+ };
+
+ let node = Self { package_name, package_id, boolean_start_index, next_offset };
Ok(node)
}
@@ -180,7 +238,11 @@
[
self.header.into_bytes(),
self.buckets.iter().map(|v| v.unwrap_or(0).to_le_bytes()).collect::<Vec<_>>().concat(),
- self.nodes.iter().map(|v| v.into_bytes()).collect::<Vec<_>>().concat(),
+ self.nodes
+ .iter()
+ .map(|v| v.into_bytes(self.header.version))
+ .collect::<Vec<_>>()
+ .concat(),
]
.concat()
}
@@ -199,8 +261,8 @@
.collect();
let nodes = (0..num_packages)
.map(|_| {
- let node = PackageTableNode::from_bytes(&bytes[head..])?;
- head += node.into_bytes().len();
+ let node = PackageTableNode::from_bytes(&bytes[head..], header.version)?;
+ head += node.into_bytes(header.version).len();
Ok(node)
})
.collect::<Result<Vec<_>, AconfigStorageError>>()
@@ -219,7 +281,8 @@
#[cfg(test)]
mod tests {
use super::*;
- use crate::test_utils::create_test_package_table;
+ use crate::read_u32_from_start_of_bytes;
+ use crate::{test_utils::create_test_package_table, DEFAULT_FILE_VERSION};
#[test]
// this test point locks down the table serialization
@@ -232,7 +295,9 @@
let nodes: &Vec<PackageTableNode> = &package_table.nodes;
for node in nodes.iter() {
- let reinterpreted_node = PackageTableNode::from_bytes(&node.into_bytes()).unwrap();
+ let reinterpreted_node =
+ PackageTableNode::from_bytes(&node.into_bytes(header.version), header.version)
+ .unwrap();
assert_eq!(node, &reinterpreted_node);
}
@@ -249,9 +314,36 @@
fn test_version_number() {
let package_table = create_test_package_table();
let bytes = &package_table.into_bytes();
- let mut head = 0;
- let version = read_u32_from_bytes(bytes, &mut head).unwrap();
- assert_eq!(version, 1);
+ let version = read_u32_from_start_of_bytes(bytes).unwrap();
+ assert_eq!(version, DEFAULT_FILE_VERSION);
+ }
+
+ #[test]
+ fn test_round_trip_v1() {
+ let table_v1: PackageTable = create_test_package_table();
+ let table_bytes_v1 = table_v1.into_bytes();
+
+ // Will automatically read from version 2 as the version code is encoded
+ // into the bytes.
+ let reinterpreted_table = PackageTable::from_bytes(&table_bytes_v1).unwrap();
+
+ assert_eq!(table_v1, reinterpreted_table);
+ }
+
+ #[test]
+ fn test_round_trip_v2() {
+ // Have to fake v2 because though we will set the version to v2
+ // and write the bytes as v2, we don't have the ability to actually set
+ // the fingerprint yet.
+ let mut fake_table_v2 = create_test_package_table();
+ fake_table_v2.header.version = 2;
+ let table_bytes_v2 = fake_table_v2.into_bytes();
+
+ // Will automatically read from version 2 as the version code is encoded
+ // into the bytes.
+ let reinterpreted_table = PackageTable::from_bytes(&table_bytes_v2).unwrap();
+
+ assert_eq!(fake_table_v2, reinterpreted_table);
}
#[test]
diff --git a/tools/aconfig/aconfig_storage_file/src/test_utils.rs b/tools/aconfig/aconfig_storage_file/src/test_utils.rs
index 106666c..5c364f6 100644
--- a/tools/aconfig/aconfig_storage_file/src/test_utils.rs
+++ b/tools/aconfig/aconfig_storage_file/src/test_utils.rs
@@ -18,7 +18,7 @@
use crate::flag_table::{FlagTable, FlagTableHeader, FlagTableNode};
use crate::flag_value::{FlagValueHeader, FlagValueList};
use crate::package_table::{PackageTable, PackageTableHeader, PackageTableNode};
-use crate::{AconfigStorageError, StorageFileType, StoredFlagType};
+use crate::{AconfigStorageError, StorageFileType, StoredFlagType, DEFAULT_FILE_VERSION};
use anyhow::anyhow;
use std::io::Write;
@@ -26,7 +26,7 @@
pub fn create_test_package_table() -> PackageTable {
let header = PackageTableHeader {
- version: 1,
+ version: DEFAULT_FILE_VERSION,
container: String::from("mockup"),
file_type: StorageFileType::PackageMap as u8,
file_size: 209,
@@ -78,7 +78,7 @@
pub fn create_test_flag_table() -> FlagTable {
let header = FlagTableHeader {
- version: 1,
+ version: DEFAULT_FILE_VERSION,
container: String::from("mockup"),
file_type: StorageFileType::FlagMap as u8,
file_size: 321,
@@ -120,7 +120,7 @@
pub fn create_test_flag_value_list() -> FlagValueList {
let header = FlagValueHeader {
- version: 1,
+ version: DEFAULT_FILE_VERSION,
container: String::from("mockup"),
file_type: StorageFileType::FlagVal as u8,
file_size: 35,
@@ -133,7 +133,7 @@
pub fn create_test_flag_info_list() -> FlagInfoList {
let header = FlagInfoHeader {
- version: 1,
+ version: DEFAULT_FILE_VERSION,
container: String::from("mockup"),
file_type: StorageFileType::FlagInfo as u8,
file_size: 35,
diff --git a/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/PackageTable.java b/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/PackageTable.java
index dc1c583..39b7e59 100644
--- a/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/PackageTable.java
+++ b/tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/PackageTable.java
@@ -50,7 +50,7 @@
while (nodeIndex != -1) {
mReader.position(nodeIndex);
- Node node = Node.fromBytes(mReader);
+ Node node = Node.fromBytes(mReader, mHeader.mVersion);
if (Objects.equals(packageName, node.mPackageName)) {
return node;
}
@@ -74,7 +74,7 @@
private int mBucketOffset;
private int mNodeOffset;
- public static Header fromBytes(ByteBufferReader reader) {
+ private static Header fromBytes(ByteBufferReader reader) {
Header header = new Header();
header.mVersion = reader.readInt();
header.mContainer = reader.readString();
@@ -127,7 +127,29 @@
private int mBooleanStartIndex;
private int mNextOffset;
- public static Node fromBytes(ByteBufferReader reader) {
+ private static Node fromBytes(ByteBufferReader reader, int version) {
+ switch (version) {
+ case 1:
+ return fromBytesV1(reader);
+ case 2:
+ return fromBytesV2(reader);
+ default:
+ // Do we want to throw here?
+ return new Node();
+ }
+ }
+
+ private static Node fromBytesV1(ByteBufferReader reader) {
+ Node node = new Node();
+ node.mPackageName = reader.readString();
+ node.mPackageId = reader.readInt();
+ node.mBooleanStartIndex = reader.readInt();
+ node.mNextOffset = reader.readInt();
+ node.mNextOffset = node.mNextOffset == 0 ? -1 : node.mNextOffset;
+ return node;
+ }
+
+ private static Node fromBytesV2(ByteBufferReader reader) {
Node node = new Node();
node.mPackageName = reader.readString();
node.mPackageId = reader.readInt();
diff --git a/tools/aconfig/aconfig_storage_read_api/src/flag_info_query.rs b/tools/aconfig/aconfig_storage_read_api/src/flag_info_query.rs
index 6d03377..fe57a6d 100644
--- a/tools/aconfig/aconfig_storage_read_api/src/flag_info_query.rs
+++ b/tools/aconfig/aconfig_storage_read_api/src/flag_info_query.rs
@@ -16,8 +16,10 @@
//! flag value query module defines the flag value file read from mapped bytes
-use crate::{AconfigStorageError, FILE_VERSION};
-use aconfig_storage_file::{flag_info::FlagInfoHeader, read_u8_from_bytes, FlagValueType};
+use crate::AconfigStorageError;
+use aconfig_storage_file::{
+ flag_info::FlagInfoHeader, read_u8_from_bytes, FlagValueType, MAX_SUPPORTED_FILE_VERSION,
+};
use anyhow::anyhow;
/// Get flag attribute bitfield
@@ -27,11 +29,11 @@
flag_index: u32,
) -> Result<u8, AconfigStorageError> {
let interpreted_header = FlagInfoHeader::from_bytes(buf)?;
- if interpreted_header.version > crate::FILE_VERSION {
+ if interpreted_header.version > MAX_SUPPORTED_FILE_VERSION {
return Err(AconfigStorageError::HigherStorageFileVersion(anyhow!(
"Cannot read storage file with a higher version of {} with lib version {}",
interpreted_header.version,
- FILE_VERSION
+ MAX_SUPPORTED_FILE_VERSION
)));
}
@@ -108,15 +110,15 @@
// this test point locks down query error when file has a higher version
fn test_higher_version_storage_file() {
let mut info_list = create_test_flag_info_list();
- info_list.header.version = crate::FILE_VERSION + 1;
+ info_list.header.version = MAX_SUPPORTED_FILE_VERSION + 1;
let flag_info = info_list.into_bytes();
let error = find_flag_attribute(&flag_info[..], FlagValueType::Boolean, 4).unwrap_err();
assert_eq!(
format!("{:?}", error),
format!(
"HigherStorageFileVersion(Cannot read storage file with a higher version of {} with lib version {})",
- crate::FILE_VERSION + 1,
- crate::FILE_VERSION
+ MAX_SUPPORTED_FILE_VERSION + 1,
+ MAX_SUPPORTED_FILE_VERSION
)
);
}
diff --git a/tools/aconfig/aconfig_storage_read_api/src/flag_table_query.rs b/tools/aconfig/aconfig_storage_read_api/src/flag_table_query.rs
index a1a4793..e9bc604 100644
--- a/tools/aconfig/aconfig_storage_read_api/src/flag_table_query.rs
+++ b/tools/aconfig/aconfig_storage_read_api/src/flag_table_query.rs
@@ -16,9 +16,10 @@
//! flag table query module defines the flag table file read from mapped bytes
-use crate::{AconfigStorageError, FILE_VERSION};
+use crate::AconfigStorageError;
use aconfig_storage_file::{
flag_table::FlagTableHeader, flag_table::FlagTableNode, read_u32_from_bytes, StoredFlagType,
+ MAX_SUPPORTED_FILE_VERSION,
};
use anyhow::anyhow;
@@ -36,11 +37,11 @@
flag: &str,
) -> Result<Option<FlagReadContext>, AconfigStorageError> {
let interpreted_header = FlagTableHeader::from_bytes(buf)?;
- if interpreted_header.version > crate::FILE_VERSION {
+ if interpreted_header.version > MAX_SUPPORTED_FILE_VERSION {
return Err(AconfigStorageError::HigherStorageFileVersion(anyhow!(
"Cannot read storage file with a higher version of {} with lib version {}",
interpreted_header.version,
- FILE_VERSION
+ MAX_SUPPORTED_FILE_VERSION
)));
}
@@ -111,15 +112,15 @@
// this test point locks down query error when file has a higher version
fn test_higher_version_storage_file() {
let mut table = create_test_flag_table();
- table.header.version = crate::FILE_VERSION + 1;
+ table.header.version = MAX_SUPPORTED_FILE_VERSION + 1;
let flag_table = table.into_bytes();
let error = find_flag_read_context(&flag_table[..], 0, "enabled_ro").unwrap_err();
assert_eq!(
format!("{:?}", error),
format!(
"HigherStorageFileVersion(Cannot read storage file with a higher version of {} with lib version {})",
- crate::FILE_VERSION + 1,
- crate::FILE_VERSION
+ MAX_SUPPORTED_FILE_VERSION + 1,
+ MAX_SUPPORTED_FILE_VERSION
)
);
}
diff --git a/tools/aconfig/aconfig_storage_read_api/src/flag_value_query.rs b/tools/aconfig/aconfig_storage_read_api/src/flag_value_query.rs
index 9d32a16..12c1e83 100644
--- a/tools/aconfig/aconfig_storage_read_api/src/flag_value_query.rs
+++ b/tools/aconfig/aconfig_storage_read_api/src/flag_value_query.rs
@@ -16,18 +16,20 @@
//! flag value query module defines the flag value file read from mapped bytes
-use crate::{AconfigStorageError, FILE_VERSION};
-use aconfig_storage_file::{flag_value::FlagValueHeader, read_u8_from_bytes};
+use crate::AconfigStorageError;
+use aconfig_storage_file::{
+ flag_value::FlagValueHeader, read_u8_from_bytes, MAX_SUPPORTED_FILE_VERSION,
+};
use anyhow::anyhow;
/// Query flag value
pub fn find_boolean_flag_value(buf: &[u8], flag_index: u32) -> Result<bool, AconfigStorageError> {
let interpreted_header = FlagValueHeader::from_bytes(buf)?;
- if interpreted_header.version > crate::FILE_VERSION {
+ if interpreted_header.version > MAX_SUPPORTED_FILE_VERSION {
return Err(AconfigStorageError::HigherStorageFileVersion(anyhow!(
"Cannot read storage file with a higher version of {} with lib version {}",
interpreted_header.version,
- FILE_VERSION
+ MAX_SUPPORTED_FILE_VERSION
)));
}
@@ -74,15 +76,15 @@
// this test point locks down query error when file has a higher version
fn test_higher_version_storage_file() {
let mut value_list = create_test_flag_value_list();
- value_list.header.version = crate::FILE_VERSION + 1;
+ value_list.header.version = MAX_SUPPORTED_FILE_VERSION + 1;
let flag_value = value_list.into_bytes();
let error = find_boolean_flag_value(&flag_value[..], 4).unwrap_err();
assert_eq!(
format!("{:?}", error),
format!(
"HigherStorageFileVersion(Cannot read storage file with a higher version of {} with lib version {})",
- crate::FILE_VERSION + 1,
- crate::FILE_VERSION
+ MAX_SUPPORTED_FILE_VERSION + 1,
+ MAX_SUPPORTED_FILE_VERSION
)
);
}
diff --git a/tools/aconfig/aconfig_storage_read_api/src/lib.rs b/tools/aconfig/aconfig_storage_read_api/src/lib.rs
index d76cf3f..988ce63 100644
--- a/tools/aconfig/aconfig_storage_read_api/src/lib.rs
+++ b/tools/aconfig/aconfig_storage_read_api/src/lib.rs
@@ -46,7 +46,7 @@
pub use flag_table_query::FlagReadContext;
pub use package_table_query::PackageReadContext;
-use aconfig_storage_file::{read_u32_from_bytes, FILE_VERSION};
+use aconfig_storage_file::read_u32_from_bytes;
use flag_info_query::find_flag_attribute;
use flag_table_query::find_flag_read_context;
use flag_value_query::find_boolean_flag_value;
diff --git a/tools/aconfig/aconfig_storage_read_api/src/package_table_query.rs b/tools/aconfig/aconfig_storage_read_api/src/package_table_query.rs
index 2cb854b..acb60f6 100644
--- a/tools/aconfig/aconfig_storage_read_api/src/package_table_query.rs
+++ b/tools/aconfig/aconfig_storage_read_api/src/package_table_query.rs
@@ -16,9 +16,10 @@
//! package table query module defines the package table file read from mapped bytes
-use crate::{AconfigStorageError, FILE_VERSION};
+use crate::AconfigStorageError;
use aconfig_storage_file::{
package_table::PackageTableHeader, package_table::PackageTableNode, read_u32_from_bytes,
+ MAX_SUPPORTED_FILE_VERSION,
};
use anyhow::anyhow;
@@ -35,11 +36,11 @@
package: &str,
) -> Result<Option<PackageReadContext>, AconfigStorageError> {
let interpreted_header = PackageTableHeader::from_bytes(buf)?;
- if interpreted_header.version > FILE_VERSION {
+ if interpreted_header.version > MAX_SUPPORTED_FILE_VERSION {
return Err(AconfigStorageError::HigherStorageFileVersion(anyhow!(
"Cannot read storage file with a higher version of {} with lib version {}",
interpreted_header.version,
- FILE_VERSION
+ MAX_SUPPORTED_FILE_VERSION
)));
}
@@ -55,7 +56,8 @@
}
loop {
- let interpreted_node = PackageTableNode::from_bytes(&buf[package_node_offset..])?;
+ let interpreted_node =
+ PackageTableNode::from_bytes(&buf[package_node_offset..], interpreted_header.version)?;
if interpreted_node.package_name == package {
return Ok(Some(PackageReadContext {
package_id: interpreted_node.package_id,
@@ -118,7 +120,7 @@
// this test point locks down query error when file has a higher version
fn test_higher_version_storage_file() {
let mut table = create_test_package_table();
- table.header.version = crate::FILE_VERSION + 1;
+ table.header.version = MAX_SUPPORTED_FILE_VERSION + 1;
let package_table = table.into_bytes();
let error =
find_package_read_context(&package_table[..], "com.android.aconfig.storage.test_1")
@@ -127,8 +129,8 @@
format!("{:?}", error),
format!(
"HigherStorageFileVersion(Cannot read storage file with a higher version of {} with lib version {})",
- crate::FILE_VERSION + 1,
- crate::FILE_VERSION
+ MAX_SUPPORTED_FILE_VERSION + 1,
+ MAX_SUPPORTED_FILE_VERSION
)
);
}
diff --git a/tools/aconfig/aconfig_storage_write_api/src/flag_info_update.rs b/tools/aconfig/aconfig_storage_write_api/src/flag_info_update.rs
index 7e60713..5640922 100644
--- a/tools/aconfig/aconfig_storage_write_api/src/flag_info_update.rs
+++ b/tools/aconfig/aconfig_storage_write_api/src/flag_info_update.rs
@@ -18,7 +18,7 @@
use aconfig_storage_file::{
read_u8_from_bytes, AconfigStorageError, FlagInfoBit, FlagInfoHeader, FlagValueType,
- FILE_VERSION,
+ MAX_SUPPORTED_FILE_VERSION,
};
use anyhow::anyhow;
@@ -28,11 +28,11 @@
flag_index: u32,
) -> Result<usize, AconfigStorageError> {
let interpreted_header = FlagInfoHeader::from_bytes(buf)?;
- if interpreted_header.version > FILE_VERSION {
+ if interpreted_header.version > MAX_SUPPORTED_FILE_VERSION {
return Err(AconfigStorageError::HigherStorageFileVersion(anyhow!(
"Cannot write to storage file with a higher version of {} with lib version {}",
interpreted_header.version,
- FILE_VERSION
+ MAX_SUPPORTED_FILE_VERSION
)));
}
diff --git a/tools/aconfig/aconfig_storage_write_api/src/flag_value_update.rs b/tools/aconfig/aconfig_storage_write_api/src/flag_value_update.rs
index dd15c99..06a9b15 100644
--- a/tools/aconfig/aconfig_storage_write_api/src/flag_value_update.rs
+++ b/tools/aconfig/aconfig_storage_write_api/src/flag_value_update.rs
@@ -16,7 +16,7 @@
//! flag value update module defines the flag value file write to mapped bytes
-use aconfig_storage_file::{AconfigStorageError, FlagValueHeader, FILE_VERSION};
+use aconfig_storage_file::{AconfigStorageError, FlagValueHeader, MAX_SUPPORTED_FILE_VERSION};
use anyhow::anyhow;
/// Set flag value
@@ -26,11 +26,11 @@
flag_value: bool,
) -> Result<usize, AconfigStorageError> {
let interpreted_header = FlagValueHeader::from_bytes(buf)?;
- if interpreted_header.version > FILE_VERSION {
+ if interpreted_header.version > MAX_SUPPORTED_FILE_VERSION {
return Err(AconfigStorageError::HigherStorageFileVersion(anyhow!(
"Cannot write to storage file with a higher version of {} with lib version {}",
interpreted_header.version,
- FILE_VERSION
+ MAX_SUPPORTED_FILE_VERSION
)));
}
@@ -84,15 +84,15 @@
// this test point locks down query error when file has a higher version
fn test_higher_version_storage_file() {
let mut value_list = create_test_flag_value_list();
- value_list.header.version = FILE_VERSION + 1;
+ value_list.header.version = MAX_SUPPORTED_FILE_VERSION + 1;
let mut flag_value = value_list.into_bytes();
let error = update_boolean_flag_value(&mut flag_value[..], 4, true).unwrap_err();
assert_eq!(
format!("{:?}", error),
format!(
"HigherStorageFileVersion(Cannot write to storage file with a higher version of {} with lib version {})",
- FILE_VERSION + 1,
- FILE_VERSION
+ MAX_SUPPORTED_FILE_VERSION + 1,
+ MAX_SUPPORTED_FILE_VERSION
)
);
}
diff --git a/tools/aconfig/aflags/Android.bp b/tools/aconfig/aflags/Android.bp
index 2040cc6..56c4ec0 100644
--- a/tools/aconfig/aflags/Android.bp
+++ b/tools/aconfig/aflags/Android.bp
@@ -20,6 +20,10 @@
"libnix",
"libprotobuf",
"libregex",
+ // TODO: b/371021174 remove this fake dependency once we find a proper strategy to
+ // deal with test aconfig libs are not present in storage because they are never used
+ // by the actual build
+ "libaconfig_test_rust_library",
],
}
diff --git a/tools/ide_query/ide_query.go b/tools/ide_query/ide_query.go
index 23c7abd..89ac78f 100644
--- a/tools/ide_query/ide_query.go
+++ b/tools/ide_query/ide_query.go
@@ -363,6 +363,7 @@
Id: name,
SourceFilePaths: mod.Srcs,
GeneratedFiles: genFiles(env, paths),
+ DependencyIds: mod.Deps,
}
for _, d := range mod.Deps {