forked from openkylin/platform_build
Merge "releasetools: Consolidate the codes that generate metadata dict."
am: 676c20f285
Change-Id: I1b3d233b199efc03d32b9a1d17389982cb95157e
This commit is contained in:
commit
efbd0f881c
|
@ -527,12 +527,7 @@ def WriteFullOTAPackage(input_zip, output_zip):
|
||||||
if target_info.oem_props and not OPTIONS.oem_no_mount:
|
if target_info.oem_props and not OPTIONS.oem_no_mount:
|
||||||
target_info.WriteMountOemScript(script)
|
target_info.WriteMountOemScript(script)
|
||||||
|
|
||||||
metadata = {
|
metadata = GetPackageMetadata(target_info)
|
||||||
"post-build": target_info.fingerprint,
|
|
||||||
"pre-device": target_info.device,
|
|
||||||
"post-timestamp": target_info.GetBuildProp("ro.build.date.utc"),
|
|
||||||
"ota-type" : "BLOCK",
|
|
||||||
}
|
|
||||||
|
|
||||||
device_specific = common.DeviceSpecificParams(
|
device_specific = common.DeviceSpecificParams(
|
||||||
input_zip=input_zip,
|
input_zip=input_zip,
|
||||||
|
@ -711,6 +706,57 @@ def HandleDowngradeMetadata(metadata, target_info, source_info):
|
||||||
metadata["post-timestamp"] = post_timestamp
|
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):
|
def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip):
|
||||||
target_info = BuildInfo(OPTIONS.target_info_dict, OPTIONS.oem_dicts)
|
target_info = BuildInfo(OPTIONS.target_info_dict, OPTIONS.oem_dicts)
|
||||||
source_info = BuildInfo(OPTIONS.source_info_dict, OPTIONS.oem_dicts)
|
source_info = BuildInfo(OPTIONS.source_info_dict, OPTIONS.oem_dicts)
|
||||||
|
@ -728,12 +774,7 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip):
|
||||||
if not OPTIONS.oem_no_mount:
|
if not OPTIONS.oem_no_mount:
|
||||||
source_info.WriteMountOemScript(script)
|
source_info.WriteMountOemScript(script)
|
||||||
|
|
||||||
metadata = {
|
metadata = GetPackageMetadata(target_info, source_info)
|
||||||
"pre-device": source_info.device,
|
|
||||||
"ota-type": "BLOCK",
|
|
||||||
}
|
|
||||||
|
|
||||||
HandleDowngradeMetadata(metadata, target_info, source_info)
|
|
||||||
|
|
||||||
device_specific = common.DeviceSpecificParams(
|
device_specific = common.DeviceSpecificParams(
|
||||||
source_zip=source_zip,
|
source_zip=source_zip,
|
||||||
|
@ -745,13 +786,6 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip):
|
||||||
metadata=metadata,
|
metadata=metadata,
|
||||||
info_dict=source_info)
|
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(
|
source_boot = common.GetBootableImage(
|
||||||
"/tmp/boot.img", "boot.img", OPTIONS.source_tmp, "BOOT", source_info)
|
"/tmp/boot.img", "boot.img", OPTIONS.source_tmp, "BOOT", source_info)
|
||||||
target_boot = common.GetBootableImage(
|
target_boot = common.GetBootableImage(
|
||||||
|
@ -1070,24 +1104,7 @@ def WriteABOTAPackageWithBrilloScript(target_file, output_file,
|
||||||
source_info = None
|
source_info = None
|
||||||
|
|
||||||
# Metadata to comply with Android OTA package format.
|
# Metadata to comply with Android OTA package format.
|
||||||
metadata = {
|
metadata = GetPackageMetadata(target_info, source_info)
|
||||||
"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")
|
|
||||||
|
|
||||||
# 1. Generate payload.
|
# 1. Generate payload.
|
||||||
payload_file = common.MakeTempFile(prefix="payload-", suffix=".bin")
|
payload_file = common.MakeTempFile(prefix="payload-", suffix=".bin")
|
||||||
|
|
|
@ -19,7 +19,7 @@ import unittest
|
||||||
|
|
||||||
import common
|
import common
|
||||||
from ota_from_target_files import (
|
from ota_from_target_files import (
|
||||||
_LoadOemDicts, BuildInfo, WriteFingerprintAssertion)
|
_LoadOemDicts, BuildInfo, GetPackageMetadata, WriteFingerprintAssertion)
|
||||||
|
|
||||||
|
|
||||||
class MockScriptWriter(object):
|
class MockScriptWriter(object):
|
||||||
|
@ -300,3 +300,179 @@ class LoadOemDictsTest(unittest.TestCase):
|
||||||
self.assertEqual('foo', oem_dict['xyz'])
|
self.assertEqual('foo', oem_dict['xyz'])
|
||||||
self.assertEqual('bar', oem_dict['a.b.c'])
|
self.assertEqual('bar', oem_dict['a.b.c'])
|
||||||
self.assertEqual('{}'.format(i), oem_dict['ro.build.index'])
|
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…
Reference in New Issue