forked from openkylin/platform_build
Merge "Fix lint errors in ota_from_target_files script" am: c8b4784cb9
am: 36b5ebb1cf
Original change: https://android-review.googlesource.com/c/platform/build/+/1348022 Change-Id: Ie3dc11187c2207fbeeae178d41204a6f5858be51
This commit is contained in:
commit
36b904f9c7
|
@ -17,6 +17,7 @@ from __future__ import print_function
|
||||||
import base64
|
import base64
|
||||||
import collections
|
import collections
|
||||||
import copy
|
import copy
|
||||||
|
import datetime
|
||||||
import errno
|
import errno
|
||||||
import fnmatch
|
import fnmatch
|
||||||
import getopt
|
import getopt
|
||||||
|
@ -53,16 +54,17 @@ class Options(object):
|
||||||
# running this function, user-supplied search path (`--path`) hasn't been
|
# running this function, user-supplied search path (`--path`) hasn't been
|
||||||
# available. So the value set here is the default, which might be overridden
|
# available. So the value set here is the default, which might be overridden
|
||||||
# by commandline flag later.
|
# by commandline flag later.
|
||||||
exec_path = sys.argv[0]
|
exec_path = os.path.realpath(sys.argv[0])
|
||||||
if exec_path.endswith('.py'):
|
if exec_path.endswith('.py'):
|
||||||
script_name = os.path.basename(exec_path)
|
script_name = os.path.basename(exec_path)
|
||||||
# logger hasn't been initialized yet at this point. Use print to output
|
# logger hasn't been initialized yet at this point. Use print to output
|
||||||
# warnings.
|
# warnings.
|
||||||
print(
|
print(
|
||||||
'Warning: releasetools script should be invoked as hermetic Python '
|
'Warning: releasetools script should be invoked as hermetic Python '
|
||||||
'executable -- build and run `{}` directly.'.format(script_name[:-3]),
|
'executable -- build and run `{}` directly.'.format(
|
||||||
|
script_name[:-3]),
|
||||||
file=sys.stderr)
|
file=sys.stderr)
|
||||||
self.search_path = os.path.realpath(os.path.join(os.path.dirname(exec_path), '..'))
|
self.search_path = os.path.dirname(os.path.dirname(exec_path))
|
||||||
|
|
||||||
self.signapk_path = "framework/signapk.jar" # Relative to search_path
|
self.signapk_path = "framework/signapk.jar" # Relative to search_path
|
||||||
self.signapk_shared_library_path = "lib64" # Relative to search_path
|
self.signapk_shared_library_path = "lib64" # Relative to search_path
|
||||||
|
@ -191,11 +193,11 @@ def InitLogging():
|
||||||
if OPTIONS.logfile:
|
if OPTIONS.logfile:
|
||||||
config = copy.deepcopy(config)
|
config = copy.deepcopy(config)
|
||||||
config['handlers']['logfile'] = {
|
config['handlers']['logfile'] = {
|
||||||
'class': 'logging.FileHandler',
|
'class': 'logging.FileHandler',
|
||||||
'formatter': 'standard',
|
'formatter': 'standard',
|
||||||
'level': 'INFO',
|
'level': 'INFO',
|
||||||
'mode': 'w',
|
'mode': 'w',
|
||||||
'filename': OPTIONS.logfile,
|
'filename': OPTIONS.logfile,
|
||||||
}
|
}
|
||||||
config['loggers']['']['handlers'].append('logfile')
|
config['loggers']['']['handlers'].append('logfile')
|
||||||
|
|
||||||
|
@ -224,7 +226,7 @@ def Run(args, verbose=None, **kwargs):
|
||||||
if 'universal_newlines' not in kwargs:
|
if 'universal_newlines' not in kwargs:
|
||||||
kwargs['universal_newlines'] = True
|
kwargs['universal_newlines'] = True
|
||||||
# Don't log any if caller explicitly says so.
|
# Don't log any if caller explicitly says so.
|
||||||
if verbose != False:
|
if verbose:
|
||||||
logger.info(" Running: \"%s\"", " ".join(args))
|
logger.info(" Running: \"%s\"", " ".join(args))
|
||||||
return subprocess.Popen(args, **kwargs)
|
return subprocess.Popen(args, **kwargs)
|
||||||
|
|
||||||
|
@ -274,7 +276,7 @@ def RunAndCheckOutput(args, verbose=None, **kwargs):
|
||||||
if output is None:
|
if output is None:
|
||||||
output = ""
|
output = ""
|
||||||
# Don't log any if caller explicitly says so.
|
# Don't log any if caller explicitly says so.
|
||||||
if verbose != False:
|
if verbose:
|
||||||
logger.info("%s", output.rstrip())
|
logger.info("%s", output.rstrip())
|
||||||
if proc.returncode != 0:
|
if proc.returncode != 0:
|
||||||
raise ExternalError(
|
raise ExternalError(
|
||||||
|
@ -375,7 +377,6 @@ class BuildInfo(object):
|
||||||
'Invalid build fingerprint: "{}". See the requirement in Android CDD '
|
'Invalid build fingerprint: "{}". See the requirement in Android CDD '
|
||||||
"3.2.2. Build Parameters.".format(fingerprint))
|
"3.2.2. Build Parameters.".format(fingerprint))
|
||||||
|
|
||||||
|
|
||||||
self._partition_fingerprints = {}
|
self._partition_fingerprints = {}
|
||||||
for partition in PARTITIONS_WITH_CARE_MAP:
|
for partition in PARTITIONS_WITH_CARE_MAP:
|
||||||
try:
|
try:
|
||||||
|
@ -522,7 +523,8 @@ class BuildInfo(object):
|
||||||
self.GetPartitionBuildProp("ro.product.device", partition),
|
self.GetPartitionBuildProp("ro.product.device", partition),
|
||||||
self.GetPartitionBuildProp("ro.build.version.release", partition),
|
self.GetPartitionBuildProp("ro.build.version.release", partition),
|
||||||
self.GetPartitionBuildProp("ro.build.id", partition),
|
self.GetPartitionBuildProp("ro.build.id", partition),
|
||||||
self.GetPartitionBuildProp("ro.build.version.incremental", partition),
|
self.GetPartitionBuildProp(
|
||||||
|
"ro.build.version.incremental", partition),
|
||||||
self.GetPartitionBuildProp("ro.build.type", partition),
|
self.GetPartitionBuildProp("ro.build.type", partition),
|
||||||
self.GetPartitionBuildProp("ro.build.tags", partition))
|
self.GetPartitionBuildProp("ro.build.tags", partition))
|
||||||
|
|
||||||
|
@ -683,7 +685,7 @@ def LoadInfoDict(input_file, repacking=False):
|
||||||
if "boot_images" in d:
|
if "boot_images" in d:
|
||||||
boot_images = d["boot_images"]
|
boot_images = d["boot_images"]
|
||||||
for b in boot_images.split():
|
for b in boot_images.split():
|
||||||
makeint(b.replace(".img","_size"))
|
makeint(b.replace(".img", "_size"))
|
||||||
|
|
||||||
# Load recovery fstab if applicable.
|
# Load recovery fstab if applicable.
|
||||||
d["fstab"] = _FindAndLoadRecoveryFstab(d, input_file, read_helper)
|
d["fstab"] = _FindAndLoadRecoveryFstab(d, input_file, read_helper)
|
||||||
|
@ -703,7 +705,7 @@ def LoadInfoDict(input_file, repacking=False):
|
||||||
for partition in PARTITIONS_WITH_CARE_MAP:
|
for partition in PARTITIONS_WITH_CARE_MAP:
|
||||||
fingerprint = build_info.GetPartitionFingerprint(partition)
|
fingerprint = build_info.GetPartitionFingerprint(partition)
|
||||||
if fingerprint:
|
if fingerprint:
|
||||||
d["avb_{}_salt".format(partition)] = sha256(fingerprint).hexdigest()
|
d["avb_{}_salt".format(partition)] = sha256(fingerprint.encode()).hexdigest()
|
||||||
|
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
@ -749,6 +751,7 @@ class PartitionBuildProps(object):
|
||||||
placeholders in the build.prop file. We expect exactly one value for
|
placeholders in the build.prop file. We expect exactly one value for
|
||||||
each of the variables.
|
each of the variables.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, input_file, name, placeholder_values=None):
|
def __init__(self, input_file, name, placeholder_values=None):
|
||||||
self.input_file = input_file
|
self.input_file = input_file
|
||||||
self.partition = name
|
self.partition = name
|
||||||
|
@ -808,7 +811,7 @@ class PartitionBuildProps(object):
|
||||||
"""Parses the build prop in a given import statement."""
|
"""Parses the build prop in a given import statement."""
|
||||||
|
|
||||||
tokens = line.split()
|
tokens = line.split()
|
||||||
if tokens[0] != 'import' or (len(tokens) != 2 and len(tokens) != 3) :
|
if tokens[0] != 'import' or (len(tokens) != 2 and len(tokens) != 3):
|
||||||
raise ValueError('Unrecognized import statement {}'.format(line))
|
raise ValueError('Unrecognized import statement {}'.format(line))
|
||||||
|
|
||||||
if len(tokens) == 3:
|
if len(tokens) == 3:
|
||||||
|
@ -998,9 +1001,9 @@ def MergeDynamicPartitionInfoDicts(framework_dict, vendor_dict):
|
||||||
|
|
||||||
# Pick virtual ab related flags from vendor dict, if defined.
|
# Pick virtual ab related flags from vendor dict, if defined.
|
||||||
if "virtual_ab" in vendor_dict.keys():
|
if "virtual_ab" in vendor_dict.keys():
|
||||||
merged_dict["virtual_ab"] = vendor_dict["virtual_ab"]
|
merged_dict["virtual_ab"] = vendor_dict["virtual_ab"]
|
||||||
if "virtual_ab_retrofit" in vendor_dict.keys():
|
if "virtual_ab_retrofit" in vendor_dict.keys():
|
||||||
merged_dict["virtual_ab_retrofit"] = vendor_dict["virtual_ab_retrofit"]
|
merged_dict["virtual_ab_retrofit"] = vendor_dict["virtual_ab_retrofit"]
|
||||||
return merged_dict
|
return merged_dict
|
||||||
|
|
||||||
|
|
||||||
|
@ -1234,7 +1237,7 @@ def _BuildBootableImage(image_name, sourcedir, fs_config_file, info_dict=None,
|
||||||
kernel = "kernel"
|
kernel = "kernel"
|
||||||
else:
|
else:
|
||||||
kernel = image_name.replace("boot", "kernel")
|
kernel = image_name.replace("boot", "kernel")
|
||||||
kernel = kernel.replace(".img","")
|
kernel = kernel.replace(".img", "")
|
||||||
if not os.access(os.path.join(sourcedir, kernel), os.F_OK):
|
if not os.access(os.path.join(sourcedir, kernel), os.F_OK):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -1358,7 +1361,7 @@ def _BuildBootableImage(image_name, sourcedir, fs_config_file, info_dict=None,
|
||||||
if partition_name == "recovery":
|
if partition_name == "recovery":
|
||||||
part_size = info_dict["recovery_size"]
|
part_size = info_dict["recovery_size"]
|
||||||
else:
|
else:
|
||||||
part_size = info_dict[image_name.replace(".img","_size")]
|
part_size = info_dict[image_name.replace(".img", "_size")]
|
||||||
cmd = [avbtool, "add_hash_footer", "--image", img.name,
|
cmd = [avbtool, "add_hash_footer", "--image", img.name,
|
||||||
"--partition_size", str(part_size), "--partition_name",
|
"--partition_size", str(part_size), "--partition_name",
|
||||||
partition_name]
|
partition_name]
|
||||||
|
@ -1511,7 +1514,8 @@ def GetVendorBootImage(name, prebuilt_name, unpack_dir, tree_subdir,
|
||||||
if info_dict is None:
|
if info_dict is None:
|
||||||
info_dict = OPTIONS.info_dict
|
info_dict = OPTIONS.info_dict
|
||||||
|
|
||||||
data = _BuildVendorBootImage(os.path.join(unpack_dir, tree_subdir), info_dict)
|
data = _BuildVendorBootImage(
|
||||||
|
os.path.join(unpack_dir, tree_subdir), info_dict)
|
||||||
if data:
|
if data:
|
||||||
return File(name, data)
|
return File(name, data)
|
||||||
return None
|
return None
|
||||||
|
@ -1520,7 +1524,7 @@ def GetVendorBootImage(name, prebuilt_name, unpack_dir, tree_subdir,
|
||||||
def Gunzip(in_filename, out_filename):
|
def Gunzip(in_filename, out_filename):
|
||||||
"""Gunzips the given gzip compressed file to a given output file."""
|
"""Gunzips the given gzip compressed file to a given output file."""
|
||||||
with gzip.open(in_filename, "rb") as in_file, \
|
with gzip.open(in_filename, "rb") as in_file, \
|
||||||
open(out_filename, "wb") as out_file:
|
open(out_filename, "wb") as out_file:
|
||||||
shutil.copyfileobj(in_file, out_file)
|
shutil.copyfileobj(in_file, out_file)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1622,8 +1626,7 @@ def GetUserImage(which, tmpdir, input_zip,
|
||||||
if reset_file_map:
|
if reset_file_map:
|
||||||
img.ResetFileMap()
|
img.ResetFileMap()
|
||||||
return img
|
return img
|
||||||
else:
|
return GetNonSparseImage(which, tmpdir, hashtree_info_generator)
|
||||||
return GetNonSparseImage(which, tmpdir, hashtree_info_generator)
|
|
||||||
|
|
||||||
|
|
||||||
def GetNonSparseImage(which, tmpdir, hashtree_info_generator=None):
|
def GetNonSparseImage(which, tmpdir, hashtree_info_generator=None):
|
||||||
|
@ -1822,10 +1825,9 @@ def GetMinSdkVersionInt(apk_name, codename_to_api_level_map):
|
||||||
# Not a decimal number. Codename?
|
# Not a decimal number. Codename?
|
||||||
if version in codename_to_api_level_map:
|
if version in codename_to_api_level_map:
|
||||||
return codename_to_api_level_map[version]
|
return codename_to_api_level_map[version]
|
||||||
else:
|
raise ExternalError(
|
||||||
raise ExternalError(
|
"Unknown minSdkVersion: '{}'. Known codenames: {}".format(
|
||||||
"Unknown minSdkVersion: '{}'. Known codenames: {}".format(
|
version, codename_to_api_level_map))
|
||||||
version, codename_to_api_level_map))
|
|
||||||
|
|
||||||
|
|
||||||
def SignFile(input_name, output_name, key, password, min_api_level=None,
|
def SignFile(input_name, output_name, key, password, min_api_level=None,
|
||||||
|
@ -1930,7 +1932,8 @@ def CheckSize(data, target, info_dict):
|
||||||
msg = "%s size (%d) is %.2f%% of limit (%d)" % (target, size, pct, limit)
|
msg = "%s size (%d) is %.2f%% of limit (%d)" % (target, size, pct, limit)
|
||||||
if pct >= 99.0:
|
if pct >= 99.0:
|
||||||
raise ExternalError(msg)
|
raise ExternalError(msg)
|
||||||
elif pct >= 95.0:
|
|
||||||
|
if pct >= 95.0:
|
||||||
logger.warning("\n WARNING: %s\n", msg)
|
logger.warning("\n WARNING: %s\n", msg)
|
||||||
else:
|
else:
|
||||||
logger.info(" %s", msg)
|
logger.info(" %s", msg)
|
||||||
|
@ -2040,6 +2043,7 @@ Global options
|
||||||
Put verbose logs to specified file (regardless of --verbose option.)
|
Put verbose logs to specified file (regardless of --verbose option.)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
def Usage(docstring):
|
def Usage(docstring):
|
||||||
print(docstring.rstrip("\n"))
|
print(docstring.rstrip("\n"))
|
||||||
print(COMMON_DOCSTRING)
|
print(COMMON_DOCSTRING)
|
||||||
|
@ -2202,7 +2206,7 @@ class PasswordManager(object):
|
||||||
|
|
||||||
current = self.UpdateAndReadFile(current)
|
current = self.UpdateAndReadFile(current)
|
||||||
|
|
||||||
def PromptResult(self, current): # pylint: disable=no-self-use
|
def PromptResult(self, current): # pylint: disable=no-self-use
|
||||||
"""Prompt the user to enter a value (password) for each key in
|
"""Prompt the user to enter a value (password) for each key in
|
||||||
'current' whose value is fales. Returns a new dict with all the
|
'current' whose value is fales. Returns a new dict with all the
|
||||||
values.
|
values.
|
||||||
|
@ -2265,7 +2269,6 @@ class PasswordManager(object):
|
||||||
|
|
||||||
def ZipWrite(zip_file, filename, arcname=None, perms=0o644,
|
def ZipWrite(zip_file, filename, arcname=None, perms=0o644,
|
||||||
compress_type=None):
|
compress_type=None):
|
||||||
import datetime
|
|
||||||
|
|
||||||
# http://b/18015246
|
# http://b/18015246
|
||||||
# Python 2.7's zipfile implementation wrongly thinks that zip64 is required
|
# Python 2.7's zipfile implementation wrongly thinks that zip64 is required
|
||||||
|
@ -2391,6 +2394,7 @@ def ZipClose(zip_file):
|
||||||
|
|
||||||
class DeviceSpecificParams(object):
|
class DeviceSpecificParams(object):
|
||||||
module = None
|
module = None
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
"""Keyword arguments to the constructor become attributes of this
|
"""Keyword arguments to the constructor become attributes of this
|
||||||
object, which is passed to all functions in the device-specific
|
object, which is passed to all functions in the device-specific
|
||||||
|
@ -2519,12 +2523,12 @@ class File(object):
|
||||||
|
|
||||||
|
|
||||||
DIFF_PROGRAM_BY_EXT = {
|
DIFF_PROGRAM_BY_EXT = {
|
||||||
".gz" : "imgdiff",
|
".gz": "imgdiff",
|
||||||
".zip" : ["imgdiff", "-z"],
|
".zip": ["imgdiff", "-z"],
|
||||||
".jar" : ["imgdiff", "-z"],
|
".jar": ["imgdiff", "-z"],
|
||||||
".apk" : ["imgdiff", "-z"],
|
".apk": ["imgdiff", "-z"],
|
||||||
".img" : "imgdiff",
|
".img": "imgdiff",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Difference(object):
|
class Difference(object):
|
||||||
|
@ -2563,6 +2567,7 @@ class Difference(object):
|
||||||
cmd.append(ptemp.name)
|
cmd.append(ptemp.name)
|
||||||
p = Run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
p = Run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
err = []
|
err = []
|
||||||
|
|
||||||
def run():
|
def run():
|
||||||
_, e = p.communicate()
|
_, e = p.communicate()
|
||||||
if e:
|
if e:
|
||||||
|
@ -2591,7 +2596,6 @@ class Difference(object):
|
||||||
self.patch = diff
|
self.patch = diff
|
||||||
return self.tf, self.sf, self.patch
|
return self.tf, self.sf, self.patch
|
||||||
|
|
||||||
|
|
||||||
def GetPatch(self):
|
def GetPatch(self):
|
||||||
"""Returns a tuple of (target_file, source_file, patch_data).
|
"""Returns a tuple of (target_file, source_file, patch_data).
|
||||||
|
|
||||||
|
@ -2902,7 +2906,7 @@ class BlockDifference(object):
|
||||||
new_data_name=new_data_name, code=code))
|
new_data_name=new_data_name, code=code))
|
||||||
script.AppendExtra(script.WordWrap(call))
|
script.AppendExtra(script.WordWrap(call))
|
||||||
|
|
||||||
def _HashBlocks(self, source, ranges): # pylint: disable=no-self-use
|
def _HashBlocks(self, source, ranges): # pylint: disable=no-self-use
|
||||||
data = source.ReadRangeSet(ranges)
|
data = source.ReadRangeSet(ranges)
|
||||||
ctx = sha1()
|
ctx = sha1()
|
||||||
|
|
||||||
|
@ -2911,7 +2915,7 @@ class BlockDifference(object):
|
||||||
|
|
||||||
return ctx.hexdigest()
|
return ctx.hexdigest()
|
||||||
|
|
||||||
def _HashZeroBlocks(self, num_blocks): # pylint: disable=no-self-use
|
def _HashZeroBlocks(self, num_blocks): # pylint: disable=no-self-use
|
||||||
"""Return the hash value for all zero blocks."""
|
"""Return the hash value for all zero blocks."""
|
||||||
zero_block = '\x00' * 4096
|
zero_block = '\x00' * 4096
|
||||||
ctx = sha1()
|
ctx = sha1()
|
||||||
|
@ -2934,6 +2938,7 @@ PARTITION_TYPES = {
|
||||||
"squashfs": "EMMC"
|
"squashfs": "EMMC"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def GetTypeAndDevice(mount_point, info, check_no_slot=True):
|
def GetTypeAndDevice(mount_point, info, check_no_slot=True):
|
||||||
"""
|
"""
|
||||||
Use GetTypeAndDeviceExpr whenever possible. This function is kept for
|
Use GetTypeAndDeviceExpr whenever possible. This function is kept for
|
||||||
|
@ -2944,11 +2949,10 @@ def GetTypeAndDevice(mount_point, info, check_no_slot=True):
|
||||||
if fstab:
|
if fstab:
|
||||||
if check_no_slot:
|
if check_no_slot:
|
||||||
assert not fstab[mount_point].slotselect, \
|
assert not fstab[mount_point].slotselect, \
|
||||||
"Use GetTypeAndDeviceExpr instead"
|
"Use GetTypeAndDeviceExpr instead"
|
||||||
return (PARTITION_TYPES[fstab[mount_point].fs_type],
|
return (PARTITION_TYPES[fstab[mount_point].fs_type],
|
||||||
fstab[mount_point].device)
|
fstab[mount_point].device)
|
||||||
else:
|
raise KeyError
|
||||||
raise KeyError
|
|
||||||
|
|
||||||
|
|
||||||
def GetTypeAndDeviceExpr(mount_point, info):
|
def GetTypeAndDeviceExpr(mount_point, info):
|
||||||
|
@ -2963,8 +2967,7 @@ def GetTypeAndDeviceExpr(mount_point, info):
|
||||||
if p.slotselect:
|
if p.slotselect:
|
||||||
device_expr = 'add_slot_suffix(%s)' % device_expr
|
device_expr = 'add_slot_suffix(%s)' % device_expr
|
||||||
return (PARTITION_TYPES[fstab[mount_point].fs_type], device_expr)
|
return (PARTITION_TYPES[fstab[mount_point].fs_type], device_expr)
|
||||||
else:
|
raise KeyError
|
||||||
raise KeyError
|
|
||||||
|
|
||||||
|
|
||||||
def GetEntryForDevice(fstab, device):
|
def GetEntryForDevice(fstab, device):
|
||||||
|
@ -2979,6 +2982,7 @@ def GetEntryForDevice(fstab, device):
|
||||||
return fstab[mount_point]
|
return fstab[mount_point]
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def ParseCertificate(data):
|
def ParseCertificate(data):
|
||||||
"""Parses and converts a PEM-encoded certificate into DER-encoded.
|
"""Parses and converts a PEM-encoded certificate into DER-encoded.
|
||||||
|
|
||||||
|
@ -3305,7 +3309,7 @@ class DynamicPartitionsDifference(object):
|
||||||
for p, u in self._partition_updates.items():
|
for p, u in self._partition_updates.items():
|
||||||
if u.src_size and u.tgt_size and u.src_size > u.tgt_size:
|
if u.src_size and u.tgt_size and u.src_size > u.tgt_size:
|
||||||
u.block_difference.WritePostInstallVerifyScript(script)
|
u.block_difference.WritePostInstallVerifyScript(script)
|
||||||
script.AppendExtra('unmap_partition("%s");' % p) # ignore errors
|
script.AppendExtra('unmap_partition("%s");' % p) # ignore errors
|
||||||
|
|
||||||
for p, u in self._partition_updates.items():
|
for p, u in self._partition_updates.items():
|
||||||
if u.tgt_size and u.src_size <= u.tgt_size:
|
if u.tgt_size and u.src_size <= u.tgt_size:
|
||||||
|
@ -3313,7 +3317,7 @@ class DynamicPartitionsDifference(object):
|
||||||
u.block_difference.WriteScript(script, output_zip, progress=u.progress,
|
u.block_difference.WriteScript(script, output_zip, progress=u.progress,
|
||||||
write_verify_script=write_verify_script)
|
write_verify_script=write_verify_script)
|
||||||
if write_verify_script:
|
if write_verify_script:
|
||||||
script.AppendExtra('unmap_partition("%s");' % p) # ignore errors
|
script.AppendExtra('unmap_partition("%s");' % p) # ignore errors
|
||||||
|
|
||||||
script.Comment('--- End patching dynamic partitions ---')
|
script.Comment('--- End patching dynamic partitions ---')
|
||||||
|
|
||||||
|
@ -3370,7 +3374,8 @@ class DynamicPartitionsDifference(object):
|
||||||
|
|
||||||
for p, u in self._partition_updates.items():
|
for p, u in self._partition_updates.items():
|
||||||
if u.tgt_size and u.src_size < u.tgt_size:
|
if u.tgt_size and u.src_size < u.tgt_size:
|
||||||
comment('Grow partition %s from %d to %d' % (p, u.src_size, u.tgt_size))
|
comment('Grow partition %s from %d to %d' %
|
||||||
|
(p, u.src_size, u.tgt_size))
|
||||||
append('resize %s %d' % (p, u.tgt_size))
|
append('resize %s %d' % (p, u.tgt_size))
|
||||||
|
|
||||||
for p, u in self._partition_updates.items():
|
for p, u in self._partition_updates.items():
|
||||||
|
|
|
@ -221,8 +221,10 @@ import zipfile
|
||||||
import check_target_files_vintf
|
import check_target_files_vintf
|
||||||
import common
|
import common
|
||||||
import edify_generator
|
import edify_generator
|
||||||
|
import target_files_diff
|
||||||
import verity_utils
|
import verity_utils
|
||||||
|
|
||||||
|
|
||||||
if sys.hexversion < 0x02070000:
|
if sys.hexversion < 0x02070000:
|
||||||
print("Python 2.7 or newer is required.", file=sys.stderr)
|
print("Python 2.7 or newer is required.", file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
@ -545,10 +547,10 @@ def HasRecoveryPatch(target_files_zip, info_dict):
|
||||||
target_files_dir = "SYSTEM/vendor"
|
target_files_dir = "SYSTEM/vendor"
|
||||||
|
|
||||||
patch = "%s/recovery-from-boot.p" % target_files_dir
|
patch = "%s/recovery-from-boot.p" % target_files_dir
|
||||||
img = "%s/etc/recovery.img" %target_files_dir
|
img = "%s/etc/recovery.img" % target_files_dir
|
||||||
|
|
||||||
namelist = [name for name in target_files_zip.namelist()]
|
namelist = target_files_zip.namelist()
|
||||||
return (patch in namelist or img in namelist)
|
return patch in namelist or img in namelist
|
||||||
|
|
||||||
|
|
||||||
def HasPartition(target_files_zip, partition):
|
def HasPartition(target_files_zip, partition):
|
||||||
|
@ -626,7 +628,8 @@ def GetBlockDifferences(target_zip, source_zip, target_info, source_info,
|
||||||
|
|
||||||
def GetIncrementalBlockDifferenceForPartition(name):
|
def GetIncrementalBlockDifferenceForPartition(name):
|
||||||
if not HasPartition(source_zip, name):
|
if not HasPartition(source_zip, name):
|
||||||
raise RuntimeError("can't generate incremental that adds {}".format(name))
|
raise RuntimeError(
|
||||||
|
"can't generate incremental that adds {}".format(name))
|
||||||
|
|
||||||
partition_src = common.GetUserImage(name, OPTIONS.source_tmp, source_zip,
|
partition_src = common.GetUserImage(name, OPTIONS.source_tmp, source_zip,
|
||||||
info_dict=source_info,
|
info_dict=source_info,
|
||||||
|
@ -637,8 +640,7 @@ def GetBlockDifferences(target_zip, source_zip, target_info, source_info,
|
||||||
partition_tgt = common.GetUserImage(name, OPTIONS.target_tmp, target_zip,
|
partition_tgt = common.GetUserImage(name, OPTIONS.target_tmp, target_zip,
|
||||||
info_dict=target_info,
|
info_dict=target_info,
|
||||||
allow_shared_blocks=allow_shared_blocks,
|
allow_shared_blocks=allow_shared_blocks,
|
||||||
hashtree_info_generator=
|
hashtree_info_generator=hashtree_info_generator)
|
||||||
hashtree_info_generator)
|
|
||||||
|
|
||||||
# Check the first block of the source system partition for remount R/W only
|
# Check the first block of the source system partition for remount R/W only
|
||||||
# if the filesystem is ext4.
|
# if the filesystem is ext4.
|
||||||
|
@ -1450,7 +1452,7 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_file):
|
||||||
fs = source_info["fstab"]["/misc"]
|
fs = source_info["fstab"]["/misc"]
|
||||||
assert fs.fs_type.upper() == "EMMC", \
|
assert fs.fs_type.upper() == "EMMC", \
|
||||||
"two-step packages only supported on devices with EMMC /misc partitions"
|
"two-step packages only supported on devices with EMMC /misc partitions"
|
||||||
bcb_dev = {"bcb_dev" : fs.device}
|
bcb_dev = {"bcb_dev": fs.device}
|
||||||
common.ZipWriteStr(output_zip, "recovery.img", target_recovery.data)
|
common.ZipWriteStr(output_zip, "recovery.img", target_recovery.data)
|
||||||
script.AppendExtra("""
|
script.AppendExtra("""
|
||||||
if get_stage("%(bcb_dev)s") == "2/3" then
|
if get_stage("%(bcb_dev)s") == "2/3" then
|
||||||
|
@ -1668,7 +1670,7 @@ def GetTargetFilesZipForSecondaryImages(input_file, skip_postinstall=False):
|
||||||
partitions = [partition for partition in partitions if partition
|
partitions = [partition for partition in partitions if partition
|
||||||
not in SECONDARY_PAYLOAD_SKIPPED_IMAGES]
|
not in SECONDARY_PAYLOAD_SKIPPED_IMAGES]
|
||||||
output_list.append('{}={}'.format(key, ' '.join(partitions)))
|
output_list.append('{}={}'.format(key, ' '.join(partitions)))
|
||||||
elif key == 'virtual_ab' or key == "virtual_ab_retrofit":
|
elif key in ['virtual_ab', "virtual_ab_retrofit"]:
|
||||||
# Remove virtual_ab flag from secondary payload so that OTA client
|
# Remove virtual_ab flag from secondary payload so that OTA client
|
||||||
# don't use snapshots for secondary update
|
# don't use snapshots for secondary update
|
||||||
pass
|
pass
|
||||||
|
@ -1712,7 +1714,8 @@ def GetTargetFilesZipForSecondaryImages(input_file, skip_postinstall=False):
|
||||||
partition_list = f.read().splitlines()
|
partition_list = f.read().splitlines()
|
||||||
partition_list = [partition for partition in partition_list if partition
|
partition_list = [partition for partition in partition_list if partition
|
||||||
and partition not in SECONDARY_PAYLOAD_SKIPPED_IMAGES]
|
and partition not in SECONDARY_PAYLOAD_SKIPPED_IMAGES]
|
||||||
common.ZipWriteStr(target_zip, info.filename, '\n'.join(partition_list))
|
common.ZipWriteStr(target_zip, info.filename,
|
||||||
|
'\n'.join(partition_list))
|
||||||
# Remove the unnecessary partitions from the dynamic partitions list.
|
# Remove the unnecessary partitions from the dynamic partitions list.
|
||||||
elif (info.filename == 'META/misc_info.txt' or
|
elif (info.filename == 'META/misc_info.txt' or
|
||||||
info.filename == DYNAMIC_PARTITION_INFO):
|
info.filename == DYNAMIC_PARTITION_INFO):
|
||||||
|
@ -1795,7 +1798,8 @@ def GetTargetFilesZipForRetrofitDynamicPartitions(input_file,
|
||||||
"{} is in super_block_devices but not in {}".format(
|
"{} is in super_block_devices but not in {}".format(
|
||||||
super_device_not_updated, AB_PARTITIONS)
|
super_device_not_updated, AB_PARTITIONS)
|
||||||
# ab_partitions -= (dynamic_partition_list - super_block_devices)
|
# ab_partitions -= (dynamic_partition_list - super_block_devices)
|
||||||
new_ab_partitions = common.MakeTempFile(prefix="ab_partitions", suffix=".txt")
|
new_ab_partitions = common.MakeTempFile(
|
||||||
|
prefix="ab_partitions", suffix=".txt")
|
||||||
with open(new_ab_partitions, 'w') as f:
|
with open(new_ab_partitions, 'w') as f:
|
||||||
for partition in ab_partitions:
|
for partition in ab_partitions:
|
||||||
if (partition in dynamic_partition_list and
|
if (partition in dynamic_partition_list and
|
||||||
|
@ -1985,7 +1989,7 @@ def GenerateNonAbOtaPackage(target_file, output_file, source_file=None):
|
||||||
OPTIONS.source_tmp = common.UnzipTemp(
|
OPTIONS.source_tmp = common.UnzipTemp(
|
||||||
OPTIONS.incremental_source, UNZIP_PATTERN)
|
OPTIONS.incremental_source, UNZIP_PATTERN)
|
||||||
with zipfile.ZipFile(target_file) as input_zip, \
|
with zipfile.ZipFile(target_file) as input_zip, \
|
||||||
zipfile.ZipFile(source_file) as source_zip:
|
zipfile.ZipFile(source_file) as source_zip:
|
||||||
WriteBlockIncrementalOTAPackage(
|
WriteBlockIncrementalOTAPackage(
|
||||||
input_zip,
|
input_zip,
|
||||||
source_zip,
|
source_zip,
|
||||||
|
@ -2245,7 +2249,6 @@ def main(argv):
|
||||||
OPTIONS.incremental_source, TARGET_DIFFING_UNZIP_PATTERN)
|
OPTIONS.incremental_source, TARGET_DIFFING_UNZIP_PATTERN)
|
||||||
|
|
||||||
with open(OPTIONS.log_diff, 'w') as out_file:
|
with open(OPTIONS.log_diff, 'w') as out_file:
|
||||||
import target_files_diff
|
|
||||||
target_files_diff.recursiveDiff(
|
target_files_diff.recursiveDiff(
|
||||||
'', source_dir, target_dir, out_file)
|
'', source_dir, target_dir, out_file)
|
||||||
|
|
||||||
|
|
|
@ -608,22 +608,22 @@ def ProcessTargetFiles(input_tf_zip, output_tf_zip, misc_info,
|
||||||
elif (OPTIONS.remove_avb_public_keys and
|
elif (OPTIONS.remove_avb_public_keys and
|
||||||
(filename.startswith("BOOT/RAMDISK/avb/") or
|
(filename.startswith("BOOT/RAMDISK/avb/") or
|
||||||
filename.startswith("BOOT/RAMDISK/first_stage_ramdisk/avb/"))):
|
filename.startswith("BOOT/RAMDISK/first_stage_ramdisk/avb/"))):
|
||||||
matched_removal = False
|
matched_removal = False
|
||||||
for key_to_remove in OPTIONS.remove_avb_public_keys:
|
for key_to_remove in OPTIONS.remove_avb_public_keys:
|
||||||
if filename.endswith(key_to_remove):
|
if filename.endswith(key_to_remove):
|
||||||
matched_removal = True
|
matched_removal = True
|
||||||
print("Removing AVB public key from ramdisk: %s" % filename)
|
print("Removing AVB public key from ramdisk: %s" % filename)
|
||||||
break
|
break
|
||||||
if not matched_removal:
|
if not matched_removal:
|
||||||
# Copy it verbatim if we don't want to remove it.
|
# Copy it verbatim if we don't want to remove it.
|
||||||
common.ZipWriteStr(output_tf_zip, out_info, data)
|
common.ZipWriteStr(output_tf_zip, out_info, data)
|
||||||
|
|
||||||
# Skip verity keyid (for system_root_image use) if we will replace it.
|
# Skip verity keyid (for system_root_image use) if we will replace it.
|
||||||
elif OPTIONS.replace_verity_keyid and filename == "BOOT/cmdline":
|
elif OPTIONS.replace_verity_keyid and filename == "BOOT/cmdline":
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Skip the care_map as we will regenerate the system/vendor images.
|
# Skip the care_map as we will regenerate the system/vendor images.
|
||||||
elif filename == "META/care_map.pb" or filename == "META/care_map.txt":
|
elif filename in ["META/care_map.pb", "META/care_map.txt"]:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Updates system_other.avbpubkey in /product/etc/.
|
# Updates system_other.avbpubkey in /product/etc/.
|
||||||
|
@ -967,11 +967,10 @@ def ReplaceAvbSigningKeys(misc_info):
|
||||||
if extra_args:
|
if extra_args:
|
||||||
print('Setting extra AVB signing args for %s to "%s"' % (
|
print('Setting extra AVB signing args for %s to "%s"' % (
|
||||||
partition, extra_args))
|
partition, extra_args))
|
||||||
if partition in AVB_FOOTER_ARGS_BY_PARTITION:
|
args_key = AVB_FOOTER_ARGS_BY_PARTITION.get(
|
||||||
args_key = AVB_FOOTER_ARGS_BY_PARTITION[partition]
|
partition,
|
||||||
else:
|
# custom partition
|
||||||
# custom partition
|
"avb_{}_add_hashtree_footer_args".format(partition))
|
||||||
args_key = "avb_{}_add_hashtree_footer_args".format(partition)
|
|
||||||
misc_info[args_key] = (misc_info.get(args_key, '') + ' ' + extra_args)
|
misc_info[args_key] = (misc_info.get(args_key, '') + ' ' + extra_args)
|
||||||
|
|
||||||
for partition in AVB_FOOTER_ARGS_BY_PARTITION:
|
for partition in AVB_FOOTER_ARGS_BY_PARTITION:
|
||||||
|
|
Loading…
Reference in New Issue