From d4caaae1607e8110727fbcaf14fb9eda1c78faf5 Mon Sep 17 00:00:00 2001 From: Tao Bao Date: Tue, 12 Apr 2016 15:53:16 -0700 Subject: [PATCH] releasetools: Only verify the blocks to be touched. For incremental BBOTAs, we used to verify the integrity of all the blocks in the source partition. In order to reduce the time cost under recovery, this CL changes to only verify the blocks that will be touched in the given OTA package (BBOTA >= 3 only). This is a trade-off between performance and reliability. Bug: 27813356 Change-Id: I3975ae6f461f0f7e58d24f1df7df46a449d2988b (cherry picked from commit d522bdc9edbf64d15a59c6924853b2e2c8c39e90) --- tools/releasetools/blockimgdiff.py | 13 +++++++++++++ tools/releasetools/common.py | 15 +++++++++++---- tools/releasetools/ota_from_target_files.py | 4 ++-- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/tools/releasetools/blockimgdiff.py b/tools/releasetools/blockimgdiff.py index 625dca2c8f..d49112fd16 100644 --- a/tools/releasetools/blockimgdiff.py +++ b/tools/releasetools/blockimgdiff.py @@ -272,6 +272,8 @@ class BlockImageDiff(object): self.src_basenames = {} self.src_numpatterns = {} self._max_stashed_size = 0 + self.touched_src_ranges = RangeSet() + self.touched_src_sha1 = None assert version in (1, 2, 3, 4) @@ -373,6 +375,7 @@ class BlockImageDiff(object): else: stashes[sh] = 1 stashed_blocks += sr.size() + self.touched_src_ranges = self.touched_src_ranges.union(sr) out.append("stash %s %s\n" % (sh, sr.to_string_raw())) if stashed_blocks > max_stashed_blocks: @@ -479,6 +482,9 @@ class BlockImageDiff(object): if temp_stash_usage > max_stashed_blocks: max_stashed_blocks = temp_stash_usage + self.touched_src_ranges = self.touched_src_ranges.union( + xf.src_ranges) + out.append("%s %s %s %s\n" % ( xf.style, self.HashBlocks(self.tgt, xf.tgt_ranges), @@ -502,6 +508,9 @@ class BlockImageDiff(object): if temp_stash_usage > max_stashed_blocks: max_stashed_blocks = temp_stash_usage + self.touched_src_ranges = self.touched_src_ranges.union( + xf.src_ranges) + out.append("%s %d %d %s %s %s %s\n" % ( xf.style, xf.patch_start, xf.patch_len, @@ -537,6 +546,10 @@ class BlockImageDiff(object): self.tgt.blocksize, max_allowed, cache_size, stash_threshold) + if self.version >= 3: + self.touched_src_sha1 = self.HashBlocks( + self.src, self.touched_src_ranges) + # Zero out extended blocks as a workaround for bug 20881595. if self.tgt.extended: out.append("zero %s\n" % (self.tgt.extended.to_string_raw(),)) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index e54bbb0951..f68596b7ba 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -1425,6 +1425,8 @@ class BlockDifference(object): self.path = os.path.join(tmpdir, partition) b.Compute(self.path) self._required_cache = b.max_stashed_size + self.touched_src_ranges = b.touched_src_ranges + self.touched_src_sha1 = b.touched_src_sha1 if src is None: _, self.device = GetTypeAndDevice("/" + partition, OPTIONS.info_dict) @@ -1468,26 +1470,31 @@ class BlockDifference(object): self.device)) script.AppendExtra("") - def WriteVerifyScript(self, script): + def WriteVerifyScript(self, script, touched_blocks_only=False): partition = self.partition if not self.src: script.Print("Image %s will be patched unconditionally." % (partition,)) else: - ranges = self.src.care_map.subtract(self.src.clobbered_blocks) + if touched_blocks_only and self.version >= 3: + ranges = self.touched_src_ranges + expected_sha1 = self.touched_src_sha1 + else: + ranges = self.src.care_map.subtract(self.src.clobbered_blocks) + expected_sha1 = self.src.TotalSha1() ranges_str = ranges.to_string_raw() if self.version >= 4: script.AppendExtra(('if (range_sha1("%s", "%s") == "%s" || ' 'block_image_verify("%s", ' 'package_extract_file("%s.transfer.list"), ' '"%s.new.dat", "%s.patch.dat")) then') % ( - self.device, ranges_str, self.src.TotalSha1(), + self.device, ranges_str, expected_sha1, self.device, partition, partition, partition)) elif self.version == 3: script.AppendExtra(('if (range_sha1("%s", "%s") == "%s" || ' 'block_image_verify("%s", ' 'package_extract_file("%s.transfer.list"), ' '"%s.new.dat", "%s.patch.dat")) then') % ( - self.device, ranges_str, self.src.TotalSha1(), + self.device, ranges_str, expected_sha1, self.device, partition, partition, partition)) else: script.AppendExtra('if range_sha1("%s", "%s") == "%s" then' % ( diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 1f37eb456f..582412a1cf 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -1003,9 +1003,9 @@ else """ % bcb_dev) # Verify the existing partitions. - system_diff.WriteVerifyScript(script) + system_diff.WriteVerifyScript(script, touched_blocks_only=True) if vendor_diff: - vendor_diff.WriteVerifyScript(script) + vendor_diff.WriteVerifyScript(script, touched_blocks_only=True) script.Comment("---- start making changes here ----")