AOSP has long supported CoW version 3, but it wasn't used by the stock OS on any Pixel devices until the new Pixel 9a. CoW version 3 is fundamentally similar to version 2, though with differences in the main header and how the operation headers are stored. The compression is no longer done in fixed-size chunks equal to the block size. Instead, the payload specifies a "compression factor", which is the maximum chunk size to pass to the compressor. The actual chunk size is the largest power of 2 <= the compression factor and the remaining input size. Additionally, for version 3, the payload stores an additional estimate_op_count_max field containing the number of CoW operations. While working on support for version 3, a few bugs in the version 2 estimation logic were found and fixed: * The cluster_ops * sizeof(CowOperationV2) overhead incorrectly assumed that cluster_ops was a constant 200 instead of the actual number of CoW operations. * The overhead did not account for kCowLabelOp headers, which delta_generator emits once for every InstallOperation in the payload. * The overhead did not account for kCowClusterOp headers, which batch CoW operations into groups of 200. * The overhead did not account for the CowFooter. The version 3 overhead is much simpler and easier to calculate compared to version 2. Fixes: #441 Signed-off-by: Andrew Gunnerson <accounts+github@chiller3.com>
End-to-end tests
avbroot's output file is reproducible for a given input file. e2e.toml lists some profiles for generating mock OTA images with unique properties and the expected checksums before and after patching. These tests use pregenerated, hardcoded test keys for signing. These keys should NEVER be used for any other purpose.
For each profile listed in the config, the test process will:
- Generate a mock OTA based on the specification
- Verify tha original OTA checksum
- Run avbroot against the OTA using
--magisk(with a mock Magisk APK) - Verify the patched OTA checksum
- Extract the AVB-related partitions from the patched OTA
- Run avbroot against the OTA again using
--prepatched - Verify the patched OTA checksum again
The default profiles shipped with the project mimic how various stock OTAs for Pixel devices are built. The generated mock OTAs have valid signatures and data structures for all components, but without any actual data where possible. For example, most files in the ramdisks are empty files. To ensure the mock OTAs cannot be mistakenly installed on a real device, the OTA metadata lists a fake device name in the preconditions section.
Running the tests
To test against the profiles listed in e2e.toml, run:
# To test all profiles
cargo run --release -- test -a
# Or to test against specific profiles
cargo run --release -- test -p pixel_v4_gki -p pixel_v4_non_gki