From 7fc951ca6ac44f7015351b867b5d69a0ac532d61 Mon Sep 17 00:00:00 2001 From: Tao Bao Date: Tue, 15 Mar 2016 13:20:19 -0700 Subject: [PATCH] DO NOT MERGE Revert "Revert "releasetools: Support OTAs that have OEM properties changes."" This CL fixes the bug in [1] (copy-paste error) and reenables it. We need to handle a special case that an OTA goes from a source build without OEM properties to a target build with those properties (or vice versa). Add support in OTA scripts to deal the case properly, by a) using two oem_props variables to handle source and target builds respectively; b) adjusting the fingerprint/thumbprint assertions to allow a mix of both. [1] commit c086370440bb32501da427718a7313f12ec2c841 Bug: 62252466 Change-Id: I98118d77d5a0ff694fa1ee33602b5ee5e048599b (cherry picked from commit eee30d97dde42416a1762c161ed7217d4e7ebf2c6) --- tools/releasetools/edify_generator.py | 11 +++ tools/releasetools/ota_from_target_files.py | 75 +++++++++++++-------- 2 files changed, 57 insertions(+), 29 deletions(-) diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index 1e7d873d0..8125bb644 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -123,6 +123,17 @@ class EdifyGenerator(object): common.ErrorCode.THUMBPRINT_MISMATCH, " or ".join(fp)) self.script.append(cmd) + def AssertFingerprintOrThumbprint(self, fp, tp): + """Assert that the current recovery build fingerprint is fp, or thumbprint + is tp.""" + cmd = ('getprop("ro.build.fingerprint") == "{fp}" ||\n' + ' getprop("ro.build.thumbprint") == "{tp}" ||\n' + ' abort("Package expects build fingerprint of {fp} or ' + 'thumbprint of {tp}; this device has a fingerprint of " ' + '+ getprop("ro.build.fingerprint") and a thumbprint of " ' + '+ getprop("ro.build.thumbprint") + ".");').format(fp=fp, tp=tp) + self.script.append(cmd) + def AssertOlderBuild(self, timestamp, timestamp_text): """Assert that the build on the device is older (or the same as) the given timestamp.""" diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 4b6d394a2..199e700cc 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -468,7 +468,7 @@ def SignOutput(temp_zip_name, output_zip_name): def AppendAssertions(script, info_dict, oem_dicts=None): oem_props = info_dict.get("oem_fingerprint_properties") - if oem_props is None or len(oem_props) == 0: + if not oem_props: device = GetBuildProp("ro.product.device", info_dict) script.AssertDevice(device) else: @@ -486,7 +486,7 @@ def AppendAssertions(script, info_dict, oem_dicts=None): script.AssertOemProperty(prop, values) -def _LoadOemDicts(script, recovery_mount_options): +def _LoadOemDicts(script, recovery_mount_options=None): """Returns the list of loaded OEM properties dict.""" oem_dicts = None if OPTIONS.oem_source is None: @@ -892,15 +892,16 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): source_version, OPTIONS.target_info_dict, fstab=OPTIONS.source_info_dict["fstab"]) - oem_props = OPTIONS.info_dict.get("oem_fingerprint_properties") recovery_mount_options = OPTIONS.source_info_dict.get( "recovery_mount_options") + source_oem_props = OPTIONS.source_info_dict.get("oem_fingerprint_properties") + target_oem_props = OPTIONS.target_info_dict.get("oem_fingerprint_properties") oem_dicts = None - if oem_props: + if source_oem_props or target_oem_props: oem_dicts = _LoadOemDicts(script, recovery_mount_options) metadata = { - "pre-device": GetOemProperty("ro.product.device", oem_props, + "pre-device": GetOemProperty("ro.product.device", source_oem_props, oem_dicts and oem_dicts[0], OPTIONS.source_info_dict), "ota-type": "BLOCK", @@ -918,9 +919,9 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): metadata=metadata, info_dict=OPTIONS.source_info_dict) - source_fp = CalculateFingerprint(oem_props, oem_dicts and oem_dicts[0], + source_fp = CalculateFingerprint(source_oem_props, oem_dicts and oem_dicts[0], OPTIONS.source_info_dict) - target_fp = CalculateFingerprint(oem_props, oem_dicts and oem_dicts[0], + target_fp = CalculateFingerprint(target_oem_props, oem_dicts and oem_dicts[0], OPTIONS.target_info_dict) metadata["pre-build"] = source_fp metadata["post-build"] = target_fp @@ -1036,32 +1037,39 @@ else if get_stage("%(bcb_dev)s") != "3/3" then script.Comment("Stage 1/3") # Dump fingerprints - script.Print("Source: %s" % CalculateFingerprint( - oem_props, oem_dicts and oem_dicts[0], OPTIONS.source_info_dict)) - script.Print("Target: %s" % CalculateFingerprint( - oem_props, oem_dicts and oem_dicts[0], OPTIONS.target_info_dict)) + script.Print("Source: %s" % (source_fp,)) + script.Print("Target: %s" % (target_fp,)) script.Print("Verifying current system...") device_specific.IncrementalOTA_VerifyBegin() - if oem_props is None: - # When blockimgdiff version is less than 3 (non-resumable block-based OTA), - # patching on a device that's already on the target build will damage the - # system. Because operations like move don't check the block state, they - # always apply the changes unconditionally. - if blockimgdiff_version <= 2: + # When blockimgdiff version is less than 3 (non-resumable block-based OTA), + # patching on a device that's already on the target build will damage the + # system. Because operations like move don't check the block state, they + # always apply the changes unconditionally. + if blockimgdiff_version <= 2: + if source_oem_props is None: script.AssertSomeFingerprint(source_fp) else: - script.AssertSomeFingerprint(source_fp, target_fp) - else: - if blockimgdiff_version <= 2: script.AssertSomeThumbprint( GetBuildProp("ro.build.thumbprint", OPTIONS.source_info_dict)) - else: + + else: # blockimgdiff_version > 2 + if source_oem_props is None and target_oem_props is None: + script.AssertSomeFingerprint(source_fp, target_fp) + elif source_oem_props is not None and target_oem_props is not None: script.AssertSomeThumbprint( GetBuildProp("ro.build.thumbprint", OPTIONS.target_info_dict), GetBuildProp("ro.build.thumbprint", OPTIONS.source_info_dict)) + elif source_oem_props is None and target_oem_props is not None: + script.AssertFingerprintOrThumbprint( + source_fp, + GetBuildProp("ro.build.thumbprint", OPTIONS.target_info_dict)) + else: + script.AssertFingerprintOrThumbprint( + target_fp, + GetBuildProp("ro.build.thumbprint", OPTIONS.source_info_dict)) # Check the required cache size (i.e. stashed blocks). size = [] @@ -1285,7 +1293,7 @@ def WriteABOTAPackageWithBrilloScript(target_file, output_file, oem_props = OPTIONS.info_dict.get("oem_fingerprint_properties", None) oem_dicts = None if oem_props: - oem_dicts = _LoadOemDicts(script, None) + oem_dicts = _LoadOemDicts(None) metadata = { "post-build": CalculateFingerprint(oem_props, oem_dicts and oem_dicts[0], @@ -1571,15 +1579,16 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): source_version, OPTIONS.target_info_dict, fstab=OPTIONS.source_info_dict["fstab"]) - oem_props = OPTIONS.info_dict.get("oem_fingerprint_properties") recovery_mount_options = OPTIONS.source_info_dict.get( "recovery_mount_options") + source_oem_props = OPTIONS.source_info_dict.get("oem_fingerprint_properties") + target_oem_props = OPTIONS.target_info_dict.get("oem_fingerprint_properties") oem_dicts = None - if oem_props: + if source_oem_props or target_oem_props: oem_dicts = _LoadOemDicts(script, recovery_mount_options) metadata = { - "pre-device": GetOemProperty("ro.product.device", oem_props, + "pre-device": GetOemProperty("ro.product.device", source_oem_props, oem_dicts and oem_dicts[0], OPTIONS.source_info_dict), "ota-type": "FILE", @@ -1605,17 +1614,25 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): else: vendor_diff = None - target_fp = CalculateFingerprint(oem_props, oem_dicts and oem_dicts[0], + target_fp = CalculateFingerprint(target_oem_props, oem_dicts and oem_dicts[0], OPTIONS.target_info_dict) - source_fp = CalculateFingerprint(oem_props, oem_dicts and oem_dicts[0], + source_fp = CalculateFingerprint(source_oem_props, oem_dicts and oem_dicts[0], OPTIONS.source_info_dict) - if oem_props is None: + if source_oem_props is None and target_oem_props is None: script.AssertSomeFingerprint(source_fp, target_fp) - else: + elif source_oem_props is not None and target_oem_props is not None: script.AssertSomeThumbprint( GetBuildProp("ro.build.thumbprint", OPTIONS.target_info_dict), GetBuildProp("ro.build.thumbprint", OPTIONS.source_info_dict)) + elif source_oem_props is None and target_oem_props is not None: + script.AssertFingerprintOrThumbprint( + source_fp, + GetBuildProp("ro.build.thumbprint", OPTIONS.target_info_dict)) + else: + script.AssertFingerprintOrThumbprint( + target_fp, + GetBuildProp("ro.build.thumbprint", OPTIONS.source_info_dict)) metadata["pre-build"] = source_fp metadata["post-build"] = target_fp