Merge "Build recovery-two-step.img for two-step OTAs." am: 06e14e438f
am: d07f9995b8
am: c180a06b20
Change-Id: Ib37a9c0fe80b6446f441c08ccc40eb85d9cf9e17
This commit is contained in:
commit
8d290959b5
|
@ -419,6 +419,14 @@ def AddImagesToTargetFiles(filename):
|
||||||
if recovery_image:
|
if recovery_image:
|
||||||
recovery_image.AddToZip(output_zip)
|
recovery_image.AddToZip(output_zip)
|
||||||
|
|
||||||
|
banner("recovery (two-step image)")
|
||||||
|
# The special recovery.img for two-step package use.
|
||||||
|
recovery_two_step_image = common.GetBootableImage(
|
||||||
|
"IMAGES/recovery-two-step.img", "recovery-two-step.img",
|
||||||
|
OPTIONS.input_tmp, "RECOVERY", two_step_image=True)
|
||||||
|
if recovery_two_step_image:
|
||||||
|
recovery_two_step_image.AddToZip(output_zip)
|
||||||
|
|
||||||
banner("system")
|
banner("system")
|
||||||
system_img_path = AddSystem(
|
system_img_path = AddSystem(
|
||||||
output_zip, recovery_img=recovery_image, boot_img=boot_image)
|
output_zip, recovery_img=recovery_image, boot_img=boot_image)
|
||||||
|
|
|
@ -403,13 +403,17 @@ def AppendAVBSigningArgs(cmd):
|
||||||
|
|
||||||
|
|
||||||
def _BuildBootableImage(sourcedir, fs_config_file, info_dict=None,
|
def _BuildBootableImage(sourcedir, fs_config_file, info_dict=None,
|
||||||
has_ramdisk=False):
|
has_ramdisk=False, two_step_image=False):
|
||||||
"""Build a bootable image from the specified sourcedir.
|
"""Build a bootable image from the specified sourcedir.
|
||||||
|
|
||||||
Take a kernel, cmdline, and optionally a ramdisk directory from the input (in
|
Take a kernel, cmdline, and optionally a ramdisk directory from the input (in
|
||||||
'sourcedir'), and turn them into a boot image. Return the image data, or
|
'sourcedir'), and turn them into a boot image. 'two_step_image' indicates if
|
||||||
None if sourcedir does not appear to contains files for building the
|
we are building a two-step special image (i.e. building a recovery image to
|
||||||
requested image."""
|
be loaded into /boot in two-step OTAs).
|
||||||
|
|
||||||
|
Return the image data, or None if sourcedir does not appear to contains files
|
||||||
|
for building the requested image.
|
||||||
|
"""
|
||||||
|
|
||||||
def make_ramdisk():
|
def make_ramdisk():
|
||||||
ramdisk_img = tempfile.NamedTemporaryFile()
|
ramdisk_img = tempfile.NamedTemporaryFile()
|
||||||
|
@ -493,7 +497,12 @@ def _BuildBootableImage(sourcedir, fs_config_file, info_dict=None,
|
||||||
|
|
||||||
if (info_dict.get("boot_signer", None) == "true" and
|
if (info_dict.get("boot_signer", None) == "true" and
|
||||||
info_dict.get("verity_key", None)):
|
info_dict.get("verity_key", None)):
|
||||||
path = "/" + os.path.basename(sourcedir).lower()
|
# Hard-code the path as "/boot" for two-step special recovery image (which
|
||||||
|
# will be loaded into /boot during the two-step OTA).
|
||||||
|
if two_step_image:
|
||||||
|
path = "/boot"
|
||||||
|
else:
|
||||||
|
path = "/" + os.path.basename(sourcedir).lower()
|
||||||
cmd = [OPTIONS.boot_signer_path]
|
cmd = [OPTIONS.boot_signer_path]
|
||||||
cmd.extend(OPTIONS.boot_signer_args)
|
cmd.extend(OPTIONS.boot_signer_args)
|
||||||
cmd.extend([path, img.name,
|
cmd.extend([path, img.name,
|
||||||
|
@ -547,7 +556,7 @@ def _BuildBootableImage(sourcedir, fs_config_file, info_dict=None,
|
||||||
|
|
||||||
|
|
||||||
def GetBootableImage(name, prebuilt_name, unpack_dir, tree_subdir,
|
def GetBootableImage(name, prebuilt_name, unpack_dir, tree_subdir,
|
||||||
info_dict=None):
|
info_dict=None, two_step_image=False):
|
||||||
"""Return a File object with the desired bootable image.
|
"""Return a File object with the desired bootable image.
|
||||||
|
|
||||||
Look for it in 'unpack_dir'/BOOTABLE_IMAGES under the name 'prebuilt_name',
|
Look for it in 'unpack_dir'/BOOTABLE_IMAGES under the name 'prebuilt_name',
|
||||||
|
@ -579,7 +588,7 @@ def GetBootableImage(name, prebuilt_name, unpack_dir, tree_subdir,
|
||||||
fs_config = "META/" + tree_subdir.lower() + "_filesystem_config.txt"
|
fs_config = "META/" + tree_subdir.lower() + "_filesystem_config.txt"
|
||||||
data = _BuildBootableImage(os.path.join(unpack_dir, tree_subdir),
|
data = _BuildBootableImage(os.path.join(unpack_dir, tree_subdir),
|
||||||
os.path.join(unpack_dir, fs_config),
|
os.path.join(unpack_dir, fs_config),
|
||||||
info_dict, has_ramdisk)
|
info_dict, has_ramdisk, two_step_image)
|
||||||
if data:
|
if data:
|
||||||
return File(name, data)
|
return File(name, data)
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -86,6 +86,8 @@ def main(argv):
|
||||||
continue
|
continue
|
||||||
if not image.endswith(".img"):
|
if not image.endswith(".img"):
|
||||||
continue
|
continue
|
||||||
|
if image == "recovery-two-step.img":
|
||||||
|
continue
|
||||||
common.ZipWrite(
|
common.ZipWrite(
|
||||||
output_zip, os.path.join(images_path, image), image)
|
output_zip, os.path.join(images_path, image), image)
|
||||||
done = True
|
done = True
|
||||||
|
|
|
@ -461,6 +461,39 @@ def AppendAssertions(script, info_dict, oem_dict=None):
|
||||||
script.AssertOemProperty(prop, oem_dict.get(prop))
|
script.AssertOemProperty(prop, oem_dict.get(prop))
|
||||||
|
|
||||||
|
|
||||||
|
def _WriteRecoveryImageToBoot(script, output_zip):
|
||||||
|
"""Find and write recovery image to /boot in two-step OTA.
|
||||||
|
|
||||||
|
In two-step OTAs, we write recovery image to /boot as the first step so that
|
||||||
|
we can reboot to there and install a new recovery image to /recovery.
|
||||||
|
A special "recovery-two-step.img" will be preferred, which encodes the correct
|
||||||
|
path of "/boot". Otherwise the device may show "device is corrupt" message
|
||||||
|
when booting into /boot.
|
||||||
|
|
||||||
|
Fall back to using the regular recovery.img if the two-step recovery image
|
||||||
|
doesn't exist. Note that rebuilding the special image at this point may be
|
||||||
|
infeasible, because we don't have the desired boot signer and keys when
|
||||||
|
calling ota_from_target_files.py.
|
||||||
|
"""
|
||||||
|
|
||||||
|
recovery_two_step_img_name = "recovery-two-step.img"
|
||||||
|
recovery_two_step_img_path = os.path.join(
|
||||||
|
OPTIONS.input_tmp, "IMAGES", recovery_two_step_img_name)
|
||||||
|
if os.path.exists(recovery_two_step_img_path):
|
||||||
|
recovery_two_step_img = common.GetBootableImage(
|
||||||
|
recovery_two_step_img_name, recovery_two_step_img_name,
|
||||||
|
OPTIONS.input_tmp, "RECOVERY")
|
||||||
|
common.ZipWriteStr(
|
||||||
|
output_zip, recovery_two_step_img_name, recovery_two_step_img.data)
|
||||||
|
print "two-step package: using %s in stage 1/3" % (
|
||||||
|
recovery_two_step_img_name,)
|
||||||
|
script.WriteRawImage("/boot", recovery_two_step_img_name)
|
||||||
|
else:
|
||||||
|
print "two-step package: using recovery.img in stage 1/3"
|
||||||
|
# The "recovery.img" entry has been written into package earlier.
|
||||||
|
script.WriteRawImage("/boot", "recovery.img")
|
||||||
|
|
||||||
|
|
||||||
def HasRecoveryPatch(target_files_zip):
|
def HasRecoveryPatch(target_files_zip):
|
||||||
namelist = [name for name in target_files_zip.namelist()]
|
namelist = [name for name in target_files_zip.namelist()]
|
||||||
return ("SYSTEM/recovery-from-boot.p" in namelist or
|
return ("SYSTEM/recovery-from-boot.p" in namelist or
|
||||||
|
@ -609,6 +642,9 @@ def WriteFullOTAPackage(input_zip, output_zip):
|
||||||
script.AppendExtra("""
|
script.AppendExtra("""
|
||||||
if get_stage("%(bcb_dev)s") == "2/3" then
|
if get_stage("%(bcb_dev)s") == "2/3" then
|
||||||
""" % bcb_dev)
|
""" % bcb_dev)
|
||||||
|
|
||||||
|
# Stage 2/3: Write recovery image to /recovery (currently running /boot).
|
||||||
|
script.Comment("Stage 2/3")
|
||||||
script.WriteRawImage("/recovery", "recovery.img")
|
script.WriteRawImage("/recovery", "recovery.img")
|
||||||
script.AppendExtra("""
|
script.AppendExtra("""
|
||||||
set_stage("%(bcb_dev)s", "3/3");
|
set_stage("%(bcb_dev)s", "3/3");
|
||||||
|
@ -616,6 +652,9 @@ reboot_now("%(bcb_dev)s", "recovery");
|
||||||
else if get_stage("%(bcb_dev)s") == "3/3" then
|
else if get_stage("%(bcb_dev)s") == "3/3" then
|
||||||
""" % bcb_dev)
|
""" % bcb_dev)
|
||||||
|
|
||||||
|
# Stage 3/3: Make changes.
|
||||||
|
script.Comment("Stage 3/3")
|
||||||
|
|
||||||
# Dump fingerprints
|
# Dump fingerprints
|
||||||
script.Print("Target: %s" % target_fp)
|
script.Print("Target: %s" % target_fp)
|
||||||
|
|
||||||
|
@ -714,7 +753,11 @@ else if get_stage("%(bcb_dev)s") == "3/3" then
|
||||||
set_stage("%(bcb_dev)s", "");
|
set_stage("%(bcb_dev)s", "");
|
||||||
""" % bcb_dev)
|
""" % bcb_dev)
|
||||||
script.AppendExtra("else\n")
|
script.AppendExtra("else\n")
|
||||||
script.WriteRawImage("/boot", "recovery.img")
|
|
||||||
|
# Stage 1/3: Nothing to verify for full OTA. Write recovery image to /boot.
|
||||||
|
script.Comment("Stage 1/3")
|
||||||
|
_WriteRecoveryImageToBoot(script, output_zip)
|
||||||
|
|
||||||
script.AppendExtra("""
|
script.AppendExtra("""
|
||||||
set_stage("%(bcb_dev)s", "2/3");
|
set_stage("%(bcb_dev)s", "2/3");
|
||||||
reboot_now("%(bcb_dev)s", "");
|
reboot_now("%(bcb_dev)s", "");
|
||||||
|
@ -938,6 +981,9 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip):
|
||||||
script.AppendExtra("""
|
script.AppendExtra("""
|
||||||
if get_stage("%(bcb_dev)s") == "2/3" then
|
if get_stage("%(bcb_dev)s") == "2/3" then
|
||||||
""" % bcb_dev)
|
""" % bcb_dev)
|
||||||
|
|
||||||
|
# Stage 2/3: Write recovery image to /recovery (currently running /boot).
|
||||||
|
script.Comment("Stage 2/3")
|
||||||
script.AppendExtra("sleep(20);\n")
|
script.AppendExtra("sleep(20);\n")
|
||||||
script.WriteRawImage("/recovery", "recovery.img")
|
script.WriteRawImage("/recovery", "recovery.img")
|
||||||
script.AppendExtra("""
|
script.AppendExtra("""
|
||||||
|
@ -946,6 +992,9 @@ reboot_now("%(bcb_dev)s", "recovery");
|
||||||
else if get_stage("%(bcb_dev)s") != "3/3" then
|
else if get_stage("%(bcb_dev)s") != "3/3" then
|
||||||
""" % bcb_dev)
|
""" % bcb_dev)
|
||||||
|
|
||||||
|
# Stage 1/3: (a) Verify the current system.
|
||||||
|
script.Comment("Stage 1/3")
|
||||||
|
|
||||||
# Dump fingerprints
|
# Dump fingerprints
|
||||||
script.Print(source_fp)
|
script.Print(source_fp)
|
||||||
script.Print(target_fp)
|
script.Print(target_fp)
|
||||||
|
@ -1016,13 +1065,18 @@ else if get_stage("%(bcb_dev)s") != "3/3" then
|
||||||
device_specific.IncrementalOTA_VerifyEnd()
|
device_specific.IncrementalOTA_VerifyEnd()
|
||||||
|
|
||||||
if OPTIONS.two_step:
|
if OPTIONS.two_step:
|
||||||
script.WriteRawImage("/boot", "recovery.img")
|
# Stage 1/3: (b) Write recovery image to /boot.
|
||||||
|
_WriteRecoveryImageToBoot(script, output_zip)
|
||||||
|
|
||||||
script.AppendExtra("""
|
script.AppendExtra("""
|
||||||
set_stage("%(bcb_dev)s", "2/3");
|
set_stage("%(bcb_dev)s", "2/3");
|
||||||
reboot_now("%(bcb_dev)s", "");
|
reboot_now("%(bcb_dev)s", "");
|
||||||
else
|
else
|
||||||
""" % bcb_dev)
|
""" % bcb_dev)
|
||||||
|
|
||||||
|
# Stage 3/3: Make changes.
|
||||||
|
script.Comment("Stage 3/3")
|
||||||
|
|
||||||
# Verify the existing partitions.
|
# Verify the existing partitions.
|
||||||
system_diff.WriteVerifyScript(script, touched_blocks_only=True)
|
system_diff.WriteVerifyScript(script, touched_blocks_only=True)
|
||||||
if vendor_diff:
|
if vendor_diff:
|
||||||
|
@ -1628,6 +1682,9 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
|
||||||
script.AppendExtra("""
|
script.AppendExtra("""
|
||||||
if get_stage("%(bcb_dev)s") == "2/3" then
|
if get_stage("%(bcb_dev)s") == "2/3" then
|
||||||
""" % bcb_dev)
|
""" % bcb_dev)
|
||||||
|
|
||||||
|
# Stage 2/3: Write recovery image to /recovery (currently running /boot).
|
||||||
|
script.Comment("Stage 2/3")
|
||||||
script.AppendExtra("sleep(20);\n")
|
script.AppendExtra("sleep(20);\n")
|
||||||
script.WriteRawImage("/recovery", "recovery.img")
|
script.WriteRawImage("/recovery", "recovery.img")
|
||||||
script.AppendExtra("""
|
script.AppendExtra("""
|
||||||
|
@ -1636,6 +1693,9 @@ reboot_now("%(bcb_dev)s", "recovery");
|
||||||
else if get_stage("%(bcb_dev)s") != "3/3" then
|
else if get_stage("%(bcb_dev)s") != "3/3" then
|
||||||
""" % bcb_dev)
|
""" % bcb_dev)
|
||||||
|
|
||||||
|
# Stage 1/3: (a) Verify the current system.
|
||||||
|
script.Comment("Stage 1/3")
|
||||||
|
|
||||||
# Dump fingerprints
|
# Dump fingerprints
|
||||||
script.Print("Source: %s" % (source_fp,))
|
script.Print("Source: %s" % (source_fp,))
|
||||||
script.Print("Target: %s" % (target_fp,))
|
script.Print("Target: %s" % (target_fp,))
|
||||||
|
@ -1680,13 +1740,18 @@ else if get_stage("%(bcb_dev)s") != "3/3" then
|
||||||
device_specific.IncrementalOTA_VerifyEnd()
|
device_specific.IncrementalOTA_VerifyEnd()
|
||||||
|
|
||||||
if OPTIONS.two_step:
|
if OPTIONS.two_step:
|
||||||
script.WriteRawImage("/boot", "recovery.img")
|
# Stage 1/3: (b) Write recovery image to /boot.
|
||||||
|
_WriteRecoveryImageToBoot(script, output_zip)
|
||||||
|
|
||||||
script.AppendExtra("""
|
script.AppendExtra("""
|
||||||
set_stage("%(bcb_dev)s", "2/3");
|
set_stage("%(bcb_dev)s", "2/3");
|
||||||
reboot_now("%(bcb_dev)s", "");
|
reboot_now("%(bcb_dev)s", "");
|
||||||
else
|
else
|
||||||
""" % bcb_dev)
|
""" % bcb_dev)
|
||||||
|
|
||||||
|
# Stage 3/3: Make changes.
|
||||||
|
script.Comment("Stage 3/3")
|
||||||
|
|
||||||
script.Comment("---- start making changes here ----")
|
script.Comment("---- start making changes here ----")
|
||||||
|
|
||||||
device_specific.IncrementalOTA_InstallBegin()
|
device_specific.IncrementalOTA_InstallBegin()
|
||||||
|
|
Loading…
Reference in New Issue