Allow generating OTA package from non-sparse images.
Test: build OTA package in cuttlefish Bug: 120041578 Change-Id: I246c38e08376c837b7f126aa19cb8c1d73ed1e26
This commit is contained in:
@@ -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 = {
|
||||
|
Reference in New Issue
Block a user