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 ----")