Allow generating OTA package from non-sparse images.

Test: build OTA package in cuttlefish

Bug: 120041578
Change-Id: I246c38e08376c837b7f126aa19cb8c1d73ed1e26
This commit is contained in:
Yifan Hong
2019-04-04 15:37:57 -07:00
parent 2eb9692618
commit 8a66a71b06
4 changed files with 210 additions and 26 deletions

View File

@@ -824,6 +824,77 @@ def UnzipTemp(filename, pattern=None):
return tmp
def GetUserImage(which, tmpdir, input_zip,
info_dict=None,
allow_shared_blocks=None,
hashtree_info_generator=None,
reset_file_map=False):
"""Returns an Image object suitable for passing to BlockImageDiff.
This function loads the specified image from the given path. If the specified
image is sparse, it also performs additional processing for OTA purpose. For
example, it always adds block 0 to clobbered blocks list. It also detects
files that cannot be reconstructed from the block list, for whom we should
avoid applying imgdiff.
Args:
which: The partition name.
tmpdir: The directory that contains the prebuilt image and block map file.
input_zip: The target-files ZIP archive.
info_dict: The dict to be looked up for relevant info.
allow_shared_blocks: If image is sparse, whether having shared blocks is
allowed. If none, it is looked up from info_dict.
hashtree_info_generator: If present and image is sparse, generates the
hashtree_info for this sparse image.
reset_file_map: If true and image is sparse, reset file map before returning
the image.
Returns:
A Image object. If it is a sparse image and reset_file_map is False, the
image will have file_map info loaded.
"""
if info_dict == None:
info_dict = LoadInfoDict(input_zip)
is_sparse = info_dict.get("extfs_sparse_flag")
# When target uses 'BOARD_EXT4_SHARE_DUP_BLOCKS := true', images may contain
# shared blocks (i.e. some blocks will show up in multiple files' block
# list). We can only allocate such shared blocks to the first "owner", and
# disable imgdiff for all later occurrences.
if allow_shared_blocks is None:
allow_shared_blocks = info_dict.get("ext4_share_dup_blocks") == "true"
if is_sparse:
img = GetSparseImage(which, tmpdir, input_zip, allow_shared_blocks,
hashtree_info_generator)
if reset_file_map:
img.ResetFileMap()
return img
else:
return GetNonSparseImage(which, tmpdir, hashtree_info_generator)
def GetNonSparseImage(which, tmpdir, hashtree_info_generator=None):
"""Returns a Image object suitable for passing to BlockImageDiff.
This function loads the specified non-sparse image from the given path.
Args:
which: The partition name.
tmpdir: The directory that contains the prebuilt image and block map file.
Returns:
A Image object.
"""
path = os.path.join(tmpdir, "IMAGES", which + ".img")
mappath = os.path.join(tmpdir, "IMAGES", which + ".map")
# The image and map files must have been created prior to calling
# ota_from_target_files.py (since LMP).
assert os.path.exists(path) and os.path.exists(mappath)
return blockimgdiff.FileImage(path, hashtree_info_generator=
hashtree_info_generator)
def GetSparseImage(which, tmpdir, input_zip, allow_shared_blocks,
hashtree_info_generator=None):
"""Returns a SparseImage object suitable for passing to BlockImageDiff.
@@ -2068,7 +2139,7 @@ class BlockDifference(object):
DataImage = blockimgdiff.DataImage
EmptyImage = blockimgdiff.EmptyImage
# map recovery.fstab's fs_types to mount/format "partition types"
PARTITION_TYPES = {