diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 4241b2bc35..a3dd780b92 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -1069,17 +1069,25 @@ class BlockDifference: script.AppendExtra('if range_sha1("%s", "%s") == "%s" then' % (self.device, self.src.care_map.to_string_raw(), self.src.TotalSha1())) - script.Print("Verified %s image..." % (partition,)) + script.Print('Verified %s image...' % (partition,)) script.AppendExtra('else'); + # When generating incrementals for the system and vendor partitions, + # explicitly check the first block (which contains the superblock) of + # the partition to see if it's what we expect. If this check fails, + # give an explicit log message about the partition having been + # remounted R/W (the most likely explanation) and the need to flash to + # get OTAs working again. if self.check_first_block: self._CheckFirstBlock(script) - script.AppendExtra(('(range_sha1("%s", "%s") == "%s") ||\n' - ' abort("%s partition has unexpected contents");\n' - 'endif;') % - (self.device, self.tgt.care_map.to_string_raw(), - self.tgt.TotalSha1(), self.partition)) + # Abort the OTA update. Note that the incremental OTA cannot be applied + # even if it may match the checksum of the target partition. + # a) If version < 3, operations like move and erase will make changes + # unconditionally and damage the partition. + # b) If version >= 3, it won't even reach here. + script.AppendExtra(('abort("%s partition has unexpected contents");\n' + 'endif;') % (partition,)) def _WriteUpdate(self, script, output_zip): partition = self.partition @@ -1109,14 +1117,11 @@ class BlockDifference: def _CheckFirstBlock(self, script): r = RangeSet((0, 1)) srchash = self._HashBlocks(self.src, r); - tgthash = self._HashBlocks(self.tgt, r); script.AppendExtra(('(range_sha1("%s", "%s") == "%s") || ' - '(range_sha1("%s", "%s") == "%s") || ' 'abort("%s has been remounted R/W; ' 'reflash device to reenable OTA updates");') % (self.device, r.to_string_raw(), srchash, - self.device, r.to_string_raw(), tgthash, self.device)) DataImage = blockimgdiff.DataImage