Loading tools/releasetools/ota_from_target_files.py +54 −37 Original line number Diff line number Diff line Loading @@ -527,12 +527,7 @@ def WriteFullOTAPackage(input_zip, output_zip): if target_info.oem_props and not OPTIONS.oem_no_mount: target_info.WriteMountOemScript(script) metadata = { "post-build": target_info.fingerprint, "pre-device": target_info.device, "post-timestamp": target_info.GetBuildProp("ro.build.date.utc"), "ota-type" : "BLOCK", } metadata = GetPackageMetadata(target_info) device_specific = common.DeviceSpecificParams( input_zip=input_zip, Loading Loading @@ -711,6 +706,57 @@ def HandleDowngradeMetadata(metadata, target_info, source_info): metadata["post-timestamp"] = post_timestamp def GetPackageMetadata(target_info, source_info=None): """Generates and returns the metadata dict. It generates a dict() that contains the info to be written into an OTA package (META-INF/com/android/metadata). It also handles the detection of downgrade / timestamp override / data wipe based on the global options. Args: target_info: The BuildInfo instance that holds the target build info. source_info: The BuildInfo instance that holds the source build info, or None if generating full OTA. Returns: A dict to be written into package metadata entry. """ assert isinstance(target_info, BuildInfo) assert source_info is None or isinstance(source_info, BuildInfo) metadata = { 'post-build' : target_info.fingerprint, 'post-build-incremental' : target_info.GetBuildProp( 'ro.build.version.incremental'), } if target_info.is_ab: metadata['ota-type'] = 'AB' metadata['ota-required-cache'] = '0' else: metadata['ota-type'] = 'BLOCK' if OPTIONS.wipe_user_data: metadata['ota-wipe'] = 'yes' is_incremental = source_info is not None if is_incremental: metadata['pre-build'] = source_info.fingerprint metadata['pre-build-incremental'] = source_info.GetBuildProp( 'ro.build.version.incremental') metadata['pre-device'] = source_info.device else: metadata['pre-device'] = target_info.device # Detect downgrades, or fill in the post-timestamp. if is_incremental: HandleDowngradeMetadata(metadata, target_info, source_info) else: metadata['post-timestamp'] = target_info.GetBuildProp('ro.build.date.utc') return metadata def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): target_info = BuildInfo(OPTIONS.target_info_dict, OPTIONS.oem_dicts) source_info = BuildInfo(OPTIONS.source_info_dict, OPTIONS.oem_dicts) Loading @@ -728,12 +774,7 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): if not OPTIONS.oem_no_mount: source_info.WriteMountOemScript(script) metadata = { "pre-device": source_info.device, "ota-type": "BLOCK", } HandleDowngradeMetadata(metadata, target_info, source_info) metadata = GetPackageMetadata(target_info, source_info) device_specific = common.DeviceSpecificParams( source_zip=source_zip, Loading @@ -745,13 +786,6 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): metadata=metadata, info_dict=source_info) metadata["pre-build"] = source_info.fingerprint metadata["post-build"] = target_info.fingerprint metadata["pre-build-incremental"] = source_info.GetBuildProp( "ro.build.version.incremental") metadata["post-build-incremental"] = target_info.GetBuildProp( "ro.build.version.incremental") source_boot = common.GetBootableImage( "/tmp/boot.img", "boot.img", OPTIONS.source_tmp, "BOOT", source_info) target_boot = common.GetBootableImage( Loading Loading @@ -1070,24 +1104,7 @@ def WriteABOTAPackageWithBrilloScript(target_file, output_file, source_info = None # Metadata to comply with Android OTA package format. metadata = { "post-build" : target_info.fingerprint, "post-build-incremental" : target_info.GetBuildProp( "ro.build.version.incremental"), "ota-required-cache" : "0", "ota-type" : "AB", } if source_file is not None: metadata["pre-device"] = source_info.device metadata["pre-build"] = source_info.fingerprint metadata["pre-build-incremental"] = source_info.GetBuildProp( "ro.build.version.incremental") HandleDowngradeMetadata(metadata, target_info, source_info) else: metadata["pre-device"] = target_info.device metadata["post-timestamp"] = target_info.GetBuildProp("ro.build.date.utc") metadata = GetPackageMetadata(target_info, source_info) # 1. Generate payload. payload_file = common.MakeTempFile(prefix="payload-", suffix=".bin") Loading tools/releasetools/test_ota_from_target_files.py +177 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ import unittest import common from ota_from_target_files import ( _LoadOemDicts, BuildInfo, WriteFingerprintAssertion) _LoadOemDicts, BuildInfo, GetPackageMetadata, WriteFingerprintAssertion) class MockScriptWriter(object): Loading Loading @@ -300,3 +300,179 @@ class LoadOemDictsTest(unittest.TestCase): self.assertEqual('foo', oem_dict['xyz']) self.assertEqual('bar', oem_dict['a.b.c']) self.assertEqual('{}'.format(i), oem_dict['ro.build.index']) class OtaFromTargetFilesTest(unittest.TestCase): TEST_TARGET_INFO_DICT = { 'build.prop' : { 'ro.product.device' : 'product-device', 'ro.build.fingerprint' : 'build-fingerprint-target', 'ro.build.version.incremental' : 'build-version-incremental-target', 'ro.build.date.utc' : '1500000000', }, } TEST_SOURCE_INFO_DICT = { 'build.prop' : { 'ro.product.device' : 'product-device', 'ro.build.fingerprint' : 'build-fingerprint-source', 'ro.build.version.incremental' : 'build-version-incremental-source', 'ro.build.date.utc' : '1400000000', }, } def setUp(self): # Reset the global options as in ota_from_target_files.py. common.OPTIONS.incremental_source = None common.OPTIONS.downgrade = False common.OPTIONS.timestamp = False common.OPTIONS.wipe_user_data = False def test_GetPackageMetadata_abOta_full(self): target_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT) target_info_dict['ab_update'] = 'true' target_info = BuildInfo(target_info_dict, None) metadata = GetPackageMetadata(target_info) self.assertDictEqual( { 'ota-type' : 'AB', 'ota-required-cache' : '0', 'post-build' : 'build-fingerprint-target', 'post-build-incremental' : 'build-version-incremental-target', 'post-timestamp' : '1500000000', 'pre-device' : 'product-device', }, metadata) def test_GetPackageMetadata_abOta_incremental(self): target_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT) target_info_dict['ab_update'] = 'true' target_info = BuildInfo(target_info_dict, None) source_info = BuildInfo(self.TEST_SOURCE_INFO_DICT, None) common.OPTIONS.incremental_source = '' metadata = GetPackageMetadata(target_info, source_info) self.assertDictEqual( { 'ota-type' : 'AB', 'ota-required-cache' : '0', 'post-build' : 'build-fingerprint-target', 'post-build-incremental' : 'build-version-incremental-target', 'post-timestamp' : '1500000000', 'pre-device' : 'product-device', 'pre-build' : 'build-fingerprint-source', 'pre-build-incremental' : 'build-version-incremental-source', }, metadata) def test_GetPackageMetadata_nonAbOta_full(self): target_info = BuildInfo(self.TEST_TARGET_INFO_DICT, None) metadata = GetPackageMetadata(target_info) self.assertDictEqual( { 'ota-type' : 'BLOCK', 'post-build' : 'build-fingerprint-target', 'post-build-incremental' : 'build-version-incremental-target', 'post-timestamp' : '1500000000', 'pre-device' : 'product-device', }, metadata) def test_GetPackageMetadata_nonAbOta_incremental(self): target_info = BuildInfo(self.TEST_TARGET_INFO_DICT, None) source_info = BuildInfo(self.TEST_SOURCE_INFO_DICT, None) common.OPTIONS.incremental_source = '' metadata = GetPackageMetadata(target_info, source_info) self.assertDictEqual( { 'ota-type' : 'BLOCK', 'post-build' : 'build-fingerprint-target', 'post-build-incremental' : 'build-version-incremental-target', 'post-timestamp' : '1500000000', 'pre-device' : 'product-device', 'pre-build' : 'build-fingerprint-source', 'pre-build-incremental' : 'build-version-incremental-source', }, metadata) def test_GetPackageMetadata_wipe(self): target_info = BuildInfo(self.TEST_TARGET_INFO_DICT, None) common.OPTIONS.wipe_user_data = True metadata = GetPackageMetadata(target_info) self.assertDictEqual( { 'ota-type' : 'BLOCK', 'ota-wipe' : 'yes', 'post-build' : 'build-fingerprint-target', 'post-build-incremental' : 'build-version-incremental-target', 'post-timestamp' : '1500000000', 'pre-device' : 'product-device', }, metadata) @staticmethod def _test_GetPackageMetadata_swapBuildTimestamps(target_info, source_info): (target_info['build.prop']['ro.build.date.utc'], source_info['build.prop']['ro.build.date.utc']) = ( source_info['build.prop']['ro.build.date.utc'], target_info['build.prop']['ro.build.date.utc']) def test_GetPackageMetadata_unintentionalDowngradeDetected(self): target_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT) source_info_dict = copy.deepcopy(self.TEST_SOURCE_INFO_DICT) self._test_GetPackageMetadata_swapBuildTimestamps( target_info_dict, source_info_dict) target_info = BuildInfo(target_info_dict, None) source_info = BuildInfo(source_info_dict, None) common.OPTIONS.incremental_source = '' self.assertRaises(RuntimeError, GetPackageMetadata, target_info, source_info) def test_GetPackageMetadata_downgrade(self): target_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT) source_info_dict = copy.deepcopy(self.TEST_SOURCE_INFO_DICT) self._test_GetPackageMetadata_swapBuildTimestamps( target_info_dict, source_info_dict) target_info = BuildInfo(target_info_dict, None) source_info = BuildInfo(source_info_dict, None) common.OPTIONS.incremental_source = '' common.OPTIONS.downgrade = True common.OPTIONS.wipe_user_data = True metadata = GetPackageMetadata(target_info, source_info) self.assertDictEqual( { 'ota-downgrade' : 'yes', 'ota-type' : 'BLOCK', 'ota-wipe' : 'yes', 'post-build' : 'build-fingerprint-target', 'post-build-incremental' : 'build-version-incremental-target', 'pre-device' : 'product-device', 'pre-build' : 'build-fingerprint-source', 'pre-build-incremental' : 'build-version-incremental-source', }, metadata) def test_GetPackageMetadata_overrideTimestamp(self): target_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT) source_info_dict = copy.deepcopy(self.TEST_SOURCE_INFO_DICT) self._test_GetPackageMetadata_swapBuildTimestamps( target_info_dict, source_info_dict) target_info = BuildInfo(target_info_dict, None) source_info = BuildInfo(source_info_dict, None) common.OPTIONS.incremental_source = '' common.OPTIONS.timestamp = True metadata = GetPackageMetadata(target_info, source_info) self.assertDictEqual( { 'ota-type' : 'BLOCK', 'post-build' : 'build-fingerprint-target', 'post-build-incremental' : 'build-version-incremental-target', 'post-timestamp' : '1500000001', 'pre-device' : 'product-device', 'pre-build' : 'build-fingerprint-source', 'pre-build-incremental' : 'build-version-incremental-source', }, metadata) Loading
tools/releasetools/ota_from_target_files.py +54 −37 Original line number Diff line number Diff line Loading @@ -527,12 +527,7 @@ def WriteFullOTAPackage(input_zip, output_zip): if target_info.oem_props and not OPTIONS.oem_no_mount: target_info.WriteMountOemScript(script) metadata = { "post-build": target_info.fingerprint, "pre-device": target_info.device, "post-timestamp": target_info.GetBuildProp("ro.build.date.utc"), "ota-type" : "BLOCK", } metadata = GetPackageMetadata(target_info) device_specific = common.DeviceSpecificParams( input_zip=input_zip, Loading Loading @@ -711,6 +706,57 @@ def HandleDowngradeMetadata(metadata, target_info, source_info): metadata["post-timestamp"] = post_timestamp def GetPackageMetadata(target_info, source_info=None): """Generates and returns the metadata dict. It generates a dict() that contains the info to be written into an OTA package (META-INF/com/android/metadata). It also handles the detection of downgrade / timestamp override / data wipe based on the global options. Args: target_info: The BuildInfo instance that holds the target build info. source_info: The BuildInfo instance that holds the source build info, or None if generating full OTA. Returns: A dict to be written into package metadata entry. """ assert isinstance(target_info, BuildInfo) assert source_info is None or isinstance(source_info, BuildInfo) metadata = { 'post-build' : target_info.fingerprint, 'post-build-incremental' : target_info.GetBuildProp( 'ro.build.version.incremental'), } if target_info.is_ab: metadata['ota-type'] = 'AB' metadata['ota-required-cache'] = '0' else: metadata['ota-type'] = 'BLOCK' if OPTIONS.wipe_user_data: metadata['ota-wipe'] = 'yes' is_incremental = source_info is not None if is_incremental: metadata['pre-build'] = source_info.fingerprint metadata['pre-build-incremental'] = source_info.GetBuildProp( 'ro.build.version.incremental') metadata['pre-device'] = source_info.device else: metadata['pre-device'] = target_info.device # Detect downgrades, or fill in the post-timestamp. if is_incremental: HandleDowngradeMetadata(metadata, target_info, source_info) else: metadata['post-timestamp'] = target_info.GetBuildProp('ro.build.date.utc') return metadata def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): target_info = BuildInfo(OPTIONS.target_info_dict, OPTIONS.oem_dicts) source_info = BuildInfo(OPTIONS.source_info_dict, OPTIONS.oem_dicts) Loading @@ -728,12 +774,7 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): if not OPTIONS.oem_no_mount: source_info.WriteMountOemScript(script) metadata = { "pre-device": source_info.device, "ota-type": "BLOCK", } HandleDowngradeMetadata(metadata, target_info, source_info) metadata = GetPackageMetadata(target_info, source_info) device_specific = common.DeviceSpecificParams( source_zip=source_zip, Loading @@ -745,13 +786,6 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): metadata=metadata, info_dict=source_info) metadata["pre-build"] = source_info.fingerprint metadata["post-build"] = target_info.fingerprint metadata["pre-build-incremental"] = source_info.GetBuildProp( "ro.build.version.incremental") metadata["post-build-incremental"] = target_info.GetBuildProp( "ro.build.version.incremental") source_boot = common.GetBootableImage( "/tmp/boot.img", "boot.img", OPTIONS.source_tmp, "BOOT", source_info) target_boot = common.GetBootableImage( Loading Loading @@ -1070,24 +1104,7 @@ def WriteABOTAPackageWithBrilloScript(target_file, output_file, source_info = None # Metadata to comply with Android OTA package format. metadata = { "post-build" : target_info.fingerprint, "post-build-incremental" : target_info.GetBuildProp( "ro.build.version.incremental"), "ota-required-cache" : "0", "ota-type" : "AB", } if source_file is not None: metadata["pre-device"] = source_info.device metadata["pre-build"] = source_info.fingerprint metadata["pre-build-incremental"] = source_info.GetBuildProp( "ro.build.version.incremental") HandleDowngradeMetadata(metadata, target_info, source_info) else: metadata["pre-device"] = target_info.device metadata["post-timestamp"] = target_info.GetBuildProp("ro.build.date.utc") metadata = GetPackageMetadata(target_info, source_info) # 1. Generate payload. payload_file = common.MakeTempFile(prefix="payload-", suffix=".bin") Loading
tools/releasetools/test_ota_from_target_files.py +177 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ import unittest import common from ota_from_target_files import ( _LoadOemDicts, BuildInfo, WriteFingerprintAssertion) _LoadOemDicts, BuildInfo, GetPackageMetadata, WriteFingerprintAssertion) class MockScriptWriter(object): Loading Loading @@ -300,3 +300,179 @@ class LoadOemDictsTest(unittest.TestCase): self.assertEqual('foo', oem_dict['xyz']) self.assertEqual('bar', oem_dict['a.b.c']) self.assertEqual('{}'.format(i), oem_dict['ro.build.index']) class OtaFromTargetFilesTest(unittest.TestCase): TEST_TARGET_INFO_DICT = { 'build.prop' : { 'ro.product.device' : 'product-device', 'ro.build.fingerprint' : 'build-fingerprint-target', 'ro.build.version.incremental' : 'build-version-incremental-target', 'ro.build.date.utc' : '1500000000', }, } TEST_SOURCE_INFO_DICT = { 'build.prop' : { 'ro.product.device' : 'product-device', 'ro.build.fingerprint' : 'build-fingerprint-source', 'ro.build.version.incremental' : 'build-version-incremental-source', 'ro.build.date.utc' : '1400000000', }, } def setUp(self): # Reset the global options as in ota_from_target_files.py. common.OPTIONS.incremental_source = None common.OPTIONS.downgrade = False common.OPTIONS.timestamp = False common.OPTIONS.wipe_user_data = False def test_GetPackageMetadata_abOta_full(self): target_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT) target_info_dict['ab_update'] = 'true' target_info = BuildInfo(target_info_dict, None) metadata = GetPackageMetadata(target_info) self.assertDictEqual( { 'ota-type' : 'AB', 'ota-required-cache' : '0', 'post-build' : 'build-fingerprint-target', 'post-build-incremental' : 'build-version-incremental-target', 'post-timestamp' : '1500000000', 'pre-device' : 'product-device', }, metadata) def test_GetPackageMetadata_abOta_incremental(self): target_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT) target_info_dict['ab_update'] = 'true' target_info = BuildInfo(target_info_dict, None) source_info = BuildInfo(self.TEST_SOURCE_INFO_DICT, None) common.OPTIONS.incremental_source = '' metadata = GetPackageMetadata(target_info, source_info) self.assertDictEqual( { 'ota-type' : 'AB', 'ota-required-cache' : '0', 'post-build' : 'build-fingerprint-target', 'post-build-incremental' : 'build-version-incremental-target', 'post-timestamp' : '1500000000', 'pre-device' : 'product-device', 'pre-build' : 'build-fingerprint-source', 'pre-build-incremental' : 'build-version-incremental-source', }, metadata) def test_GetPackageMetadata_nonAbOta_full(self): target_info = BuildInfo(self.TEST_TARGET_INFO_DICT, None) metadata = GetPackageMetadata(target_info) self.assertDictEqual( { 'ota-type' : 'BLOCK', 'post-build' : 'build-fingerprint-target', 'post-build-incremental' : 'build-version-incremental-target', 'post-timestamp' : '1500000000', 'pre-device' : 'product-device', }, metadata) def test_GetPackageMetadata_nonAbOta_incremental(self): target_info = BuildInfo(self.TEST_TARGET_INFO_DICT, None) source_info = BuildInfo(self.TEST_SOURCE_INFO_DICT, None) common.OPTIONS.incremental_source = '' metadata = GetPackageMetadata(target_info, source_info) self.assertDictEqual( { 'ota-type' : 'BLOCK', 'post-build' : 'build-fingerprint-target', 'post-build-incremental' : 'build-version-incremental-target', 'post-timestamp' : '1500000000', 'pre-device' : 'product-device', 'pre-build' : 'build-fingerprint-source', 'pre-build-incremental' : 'build-version-incremental-source', }, metadata) def test_GetPackageMetadata_wipe(self): target_info = BuildInfo(self.TEST_TARGET_INFO_DICT, None) common.OPTIONS.wipe_user_data = True metadata = GetPackageMetadata(target_info) self.assertDictEqual( { 'ota-type' : 'BLOCK', 'ota-wipe' : 'yes', 'post-build' : 'build-fingerprint-target', 'post-build-incremental' : 'build-version-incremental-target', 'post-timestamp' : '1500000000', 'pre-device' : 'product-device', }, metadata) @staticmethod def _test_GetPackageMetadata_swapBuildTimestamps(target_info, source_info): (target_info['build.prop']['ro.build.date.utc'], source_info['build.prop']['ro.build.date.utc']) = ( source_info['build.prop']['ro.build.date.utc'], target_info['build.prop']['ro.build.date.utc']) def test_GetPackageMetadata_unintentionalDowngradeDetected(self): target_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT) source_info_dict = copy.deepcopy(self.TEST_SOURCE_INFO_DICT) self._test_GetPackageMetadata_swapBuildTimestamps( target_info_dict, source_info_dict) target_info = BuildInfo(target_info_dict, None) source_info = BuildInfo(source_info_dict, None) common.OPTIONS.incremental_source = '' self.assertRaises(RuntimeError, GetPackageMetadata, target_info, source_info) def test_GetPackageMetadata_downgrade(self): target_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT) source_info_dict = copy.deepcopy(self.TEST_SOURCE_INFO_DICT) self._test_GetPackageMetadata_swapBuildTimestamps( target_info_dict, source_info_dict) target_info = BuildInfo(target_info_dict, None) source_info = BuildInfo(source_info_dict, None) common.OPTIONS.incremental_source = '' common.OPTIONS.downgrade = True common.OPTIONS.wipe_user_data = True metadata = GetPackageMetadata(target_info, source_info) self.assertDictEqual( { 'ota-downgrade' : 'yes', 'ota-type' : 'BLOCK', 'ota-wipe' : 'yes', 'post-build' : 'build-fingerprint-target', 'post-build-incremental' : 'build-version-incremental-target', 'pre-device' : 'product-device', 'pre-build' : 'build-fingerprint-source', 'pre-build-incremental' : 'build-version-incremental-source', }, metadata) def test_GetPackageMetadata_overrideTimestamp(self): target_info_dict = copy.deepcopy(self.TEST_TARGET_INFO_DICT) source_info_dict = copy.deepcopy(self.TEST_SOURCE_INFO_DICT) self._test_GetPackageMetadata_swapBuildTimestamps( target_info_dict, source_info_dict) target_info = BuildInfo(target_info_dict, None) source_info = BuildInfo(source_info_dict, None) common.OPTIONS.incremental_source = '' common.OPTIONS.timestamp = True metadata = GetPackageMetadata(target_info, source_info) self.assertDictEqual( { 'ota-type' : 'BLOCK', 'post-build' : 'build-fingerprint-target', 'post-build-incremental' : 'build-version-incremental-target', 'post-timestamp' : '1500000001', 'pre-device' : 'product-device', 'pre-build' : 'build-fingerprint-source', 'pre-build-incremental' : 'build-version-incremental-source', }, metadata)