diff options
Diffstat (limited to 'tools/releasetools/common.py')
| -rw-r--r-- | tools/releasetools/common.py | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 171c794566..3e2a113e06 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -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 = { |