No description
Find a file
Tianjie Xu 2903cddb58 Improve imgdiff for large zip files
Due to the cache size limit for OTA generation, we used to split large
zip files linearly into pieces and do bsdiff on them. As a result, i) we
lose the advantage of imgdiff; ii) if there's an accidental order change
of some huge files inside the zip, we'll create an insanely large patch.

This patch splits the src&tgt more smartly based on the zip entry_name.
If the entry_name is empty or no matching source is found for a target
chunk, we'll skip adding its source and later do a bsdiff against the
whole split source image (this rarely happens in our use cases except
for the metadata inside a ziparchive).

After the split, the target pieces are continuous and block aligned,
while the sources pieces are mutually exclusive. (Some of the source
blocks may not be used if there's no matching entry_name in the target.)
Then we will generate patches accordingly between each split image
pairs.

Afterwards, if we apply imgpatch to each pair of split source/target
images and add up the patched result, we can get back the original
target image.

For example:
Input: [src_image, tgt_image]
Split: [src-0,tgt-0; src-1,tgt-1, src-2,tgt-2]
Diff:  [  patch-0;     patch-1;    patch-2]

Patch: [(src-0,patch-0)=tgt-0; (src-1,patch-1)=tgt-1;
(src-2,patch-2)=tgt-2;]
Append: [tgt-0 + tgt-1 + tgt-2 = tgt_image]

Peformance:
For the small package in b/34220646, we decrease the patch size of
chrome.apk dramatically from 30M to 400K due to the order change of
two big .so files.

On two versions of angler, I also observe decent patch size decrease.
For chrome.apk, we reduced the size from 5.9M to 3.2M; and for
vevlet.apk from 8.0M to 6.5M.

Bug: 34220646
Test: recovery component test && apply imgdiff & imgpatch on two
chrome.apk
Change-Id: I145d802984fa805efbbac9d01a2e64d82ef9728b
2017-09-05 15:09:58 -07:00
applypatch Improve imgdiff for large zip files 2017-09-05 15:09:58 -07:00
boot_control Boot control HAL based on the A/B headers. 2017-04-03 11:25:33 -07:00
bootloader_message Turn on -Wall for recovery modules 2017-08-28 21:56:33 -07:00
edify Turn on -Wall for libedify 2017-08-30 23:04:35 +00:00
etc Merge "init.rc: Remove sys.powerctl action" am: 9848209088 am: 9fcc7c8253 2017-04-18 18:33:09 +00:00
fonts more font improvements and cleanup 2013-03-07 13:34:24 -08:00
minadbd Remove LOCAL_CLANG 2017-07-25 21:48:39 +02:00
minui Turn on -Wall for recovery modules 2017-08-28 21:56:33 -07:00
otafault Turn on -Wall for recovery modules 2017-08-28 21:56:33 -07:00
otautil otautil: Clean up dirCreateHierarchy(). 2017-07-27 10:33:07 -07:00
private Add a binary path param to update_binary_command(). 2017-05-08 12:16:45 -07:00
res-hdpi/images Merge "Add the missing sr-Latn into png files and rename the png locale header" 2017-03-28 19:52:47 +00:00
res-mdpi/images Merge "Add the missing sr-Latn into png files and rename the png locale header" 2017-03-28 19:52:47 +00:00
res-xhdpi/images Merge "Add the missing sr-Latn into png files and rename the png locale header" 2017-03-28 19:52:47 +00:00
res-xxhdpi/images Merge "Add the missing sr-Latn into png files and rename the png locale header" 2017-03-28 19:52:47 +00:00
res-xxxhdpi/images Merge "Add the missing sr-Latn into png files and rename the png locale header" 2017-03-28 19:52:47 +00:00
tests Improve imgdiff for large zip files 2017-09-05 15:09:58 -07:00
tools Import translations. DO NOT MERGE 2017-04-01 15:49:37 -07:00
uncrypt Turn on -Wall for recovery modules 2017-08-28 21:56:33 -07:00
update_verifier update_verifier now logs to kmesg 2017-08-15 18:57:17 +00:00
updater Turn on -Wall for recovery modules 2017-08-28 21:56:33 -07:00
.clang-format clang-format: Adjust short functions / if settings. 2016-12-12 15:00:52 -08:00
adb_install.cpp Don't write to /sys/class/android_usb/android0/enable with configfs. 2017-05-11 14:50:20 -07:00
adb_install.h adb_install: Stop passing RecoveryUI as a parameter. 2017-05-01 11:47:43 -07:00
Android.bp libbootloader_message: convert to Android.bp 2017-05-17 11:43:29 -07:00
Android.mk Merge "Turn on -Wall for recovery modules" 2017-08-29 17:21:09 +00:00
asn1_decoder.cpp Checking unsigned variable less than zero 2017-03-23 17:07:39 +01:00
asn1_decoder.h Refactor asn1_decoder functions into a class. 2017-03-21 15:17:43 -07:00
bootloader.h Create bootloader_message static library. 2016-10-18 11:37:05 -07:00
CleanSpec.mk recovery: minui: add adf backend 2014-04-25 15:47:34 -07:00
common.h Revert "Remove EXPAND/STRINGIFY macros." 2017-05-04 00:31:11 +00:00
default_device.cpp Auto-detect whether to use the long-press UI. 2015-04-10 15:14:35 -07:00
device.cpp recovery: Move a few int to bool. 2017-03-07 15:35:12 -08:00
device.h recovery: Move a few int to bool. 2017-03-07 15:35:12 -08:00
error_code.h Add missing report of error code under recovery 2017-08-23 00:18:07 -07:00
fuse_sdcard_provider.cpp Check an edge case when read(2) returns 0 2016-08-31 19:11:41 -07:00
fuse_sdcard_provider.h recovery: Fork a process for fuse when sideloading from SD card. 2016-01-13 21:29:20 -08:00
fuse_sideload.cpp fuse_sideload: Change the minimal block size to 4096. 2017-05-02 15:56:22 -07:00
fuse_sideload.h recovery: Switch fuse_* to C++. 2015-07-24 11:22:05 -07:00
install.cpp Merge "Add missing report of error code under recovery" 2017-08-24 22:10:25 +00:00
install.h recovery: Change install_package() to take std::string. 2017-05-01 12:31:48 -07:00
interlace-frames.py Go back to the old ear-wiggling Android animation. 2016-04-21 14:26:14 -07:00
mounts.cpp libmounts: Remove two dead functions. 2017-04-16 15:53:47 -07:00
mounts.h libmounts: Remove two dead functions. 2017-04-16 15:53:47 -07:00
NOTICE Automated import from //branches/master/...@140824,140824 2009-03-24 18:36:42 -07:00
OWNERS Add OWNERS in bootable/recovery 2017-06-15 14:17:27 -07:00
print_sha1.h Turn on -Wall for recovery modules 2017-08-28 21:56:33 -07:00
rangeset.h Move Image/ImageChunk/PatchChunk declaration into header files 2017-08-18 17:56:22 -07:00
README.md Add checkers and tests for empty locale in PNG file 2017-01-18 19:37:06 -08:00
recovery-persist.cpp Fix the android-cloexec-* warnings in bootable/recovery 2017-07-19 12:17:41 -07:00
recovery-persist.rc recovery: use __android_log_pmsg_file_write for log files 2016-03-31 13:52:54 -07:00
recovery-refresh.cpp Cleanup the duplicates of logs rotation functions 2016-11-03 18:16:33 -07:00
recovery-refresh.rc recovery: use __android_log_pmsg_file_write for log files 2016-03-31 13:52:54 -07:00
recovery.cpp Merge "screen_ui: Word-wrap menu headers." 2017-08-16 05:07:55 +00:00
res-560dpi Make text for recovery larger on angler 2016-05-02 12:20:04 -07:00
roots.cpp roots.cpp: Clean up format_volume(). 2017-07-25 15:26:32 -07:00
roots.h Revert "Revert "Some cleanups to recovery."" 2016-11-03 11:57:46 -07:00
rotate_logs.cpp Cleanup the duplicates of logs rotation functions 2016-11-03 18:16:33 -07:00
rotate_logs.h Cleanup the duplicates of logs rotation functions 2016-11-03 18:16:33 -07:00
screen_ui.cpp Merge changes I5d7a6baa,Id0fb2d4e 2017-08-22 17:44:16 +00:00
screen_ui.h Merge changes I5d7a6baa,Id0fb2d4e 2017-08-22 17:44:16 +00:00
stub_ui.h recovery: Fix the broken UI text. 2017-01-03 22:40:03 -08:00
ui.cpp ui: Check for bootreason=recovery_ui. 2017-08-03 11:37:37 -07:00
ui.h ui: Check for bootreason=recovery_ui. 2017-08-03 11:37:37 -07:00
verifier.cpp Fix the android-cloexec-* warnings in bootable/recovery 2017-07-19 12:17:41 -07:00
verifier.h Const modifiers 2017-03-23 21:52:30 +01:00
vr_device.cpp Introduce VR recovery ui 2017-06-16 15:33:02 -07:00
vr_ui.cpp Update ScreenRecoveryUI::Draw* function signatures. 2017-07-01 17:41:24 -07:00
vr_ui.h Update ScreenRecoveryUI::Draw* function signatures. 2017-07-01 17:41:24 -07:00
wear_device.cpp Allow customizing WearRecoveryUI via Makefile variables. 2017-08-10 09:31:17 -07:00
wear_ui.cpp Turn on -Wall for recovery modules 2017-08-28 21:56:33 -07:00
wear_ui.h Merge "wear_ui: Remove kMaxCols/kMaxRows/visible_text_rows/menu_headers_." 2017-08-28 19:42:12 +00:00

The Recovery Image

Quick turn-around testing

mm -j && m ramdisk-nodeps && m recoveryimage-nodeps

# To boot into the new recovery image
# without flashing the recovery partition:
adb reboot bootloader
fastboot boot $ANDROID_PRODUCT_OUT/recovery.img

Running the tests

# After setting up environment and lunch.
mmma -j bootable/recovery

# Running the tests on device.
adb root
adb sync data

# 32-bit device
adb shell /data/nativetest/recovery_unit_test/recovery_unit_test
adb shell /data/nativetest/recovery_component_test/recovery_component_test

# Or 64-bit device
adb shell /data/nativetest64/recovery_unit_test/recovery_unit_test
adb shell /data/nativetest64/recovery_component_test/recovery_component_test

Running the manual tests

recovery-refresh and recovery-persist executables exist only on systems without /cache partition. And we need to follow special steps to run tests for them.

  • Execute the test on an A/B device first. The test should fail but it will log some contents to pmsg.

  • Reboot the device immediately and run the test again. The test should save the contents of pmsg buffer into /data/misc/recovery/inject.txt. Test will pass if this file has expected contents.

ResourceTest validates whether the png files are qualified as background text image under recovery.

1. `adb sync data` to make sure the test-dir has the images to test.
2. The test will automatically pickup and verify all `_text.png` files in
   the test dir.