-
def WriteFullOTAPackage(input_zip, output_zip):
-
# TODO: how to determine this? We don't know what version it will
-
# be installed on top of. For now, we expect the API just won't
-
# change very often.
-
script = edify_generator.EdifyGenerator(3, OPTIONS.info_dict)
-
-
metadata = {"post-build": GetBuildProp("ro.build.fingerprint",
-
OPTIONS.info_dict),
-
"pre-device": GetBuildProp("ro.product.device",
-
OPTIONS.info_dict),
-
"post-timestamp": GetBuildProp("ro.build.date.utc",
-
OPTIONS.info_dict),
-
}
-
-
device_specific = common.DeviceSpecificParams(
-
input_zip=input_zip,
-
input_version=OPTIONS.info_dict["recovery_api_version"],
-
output_zip=output_zip,
-
script=script,
-
input_tmp=OPTIONS.input_tmp,
-
metadata=metadata,
-
info_dict=OPTIONS.info_dict)
-
-
if not OPTIONS.omit_prereq:
-
ts = GetBuildProp("ro.build.date.utc", OPTIONS.info_dict)
-
script.AssertOlderBuild(ts)
-
-
AppendAssertions(script, OPTIONS.info_dict)
-
device_specific.FullOTA_Assertions()
-
device_specific.FullOTA_InstallBegin()
-
-
script.ShowProgress(0.5, 0)
-
device_specific.Install_Parameter()
-
-
if OPTIONS.wipe_user_data:
-
script.FormatPartition("/data")
-
-
if "selinux_fc" in OPTIONS.info_dict:
-
WritePolicyConfig(OPTIONS.info_dict["selinux_fc"], output_zip)
-
-
script.FormatPartition("/system")
-
script.Mount("/system")
-
script.UnpackPackageDir("recovery", "/system")
-
script.UnpackPackageDir("system", "/system")
-
-
symlinks = CopySystemFiles(input_zip, output_zip)
-
script.MakeSymlinks(symlinks)
-
-
boot_img = common.GetBootableImage("boot.img", "boot.img",
-
OPTIONS.input_tmp, "BOOT")
-
recovery_img = common.GetBootableImage("recovery.img", "recovery.img",
-
OPTIONS.input_tmp, "RECOVERY")
-
MakeRecoveryPatch(OPTIONS.input_tmp, output_zip, recovery_img, boot_img)
-
-
Item.GetMetadata(input_zip)
-
Item.Get("system").SetPermissions(script)
-
-
common.CheckSize(boot_img.data, "boot.img", OPTIONS.info_dict)
-
common.ZipWriteStr(output_zip, "boot.img", boot_img.data)
-
script.ShowProgress(0.2, 0)
-
-
script.ShowProgress(0.2, 10)
-
script.WriteRawImage("/boot", "boot.img")
-
-
script.ShowProgress(0.1, 0)
-
device_specific.FullOTA_InstallEnd()
-
-
if OPTIONS.extra_script is not None:
-
script.AppendExtra(OPTIONS.extra_script)
-
-
script.UnmountAll()
-
script.AddToZip(input_zip, output_zip)
-
WriteMetadata(metadata, output_zip)
如果想把recovery.img全部烧录而不产生差分包
# MakeRecoveryPatch(OPTIONS.input_tmp, output_zip, recovery_img, boot_img)//
common.CheckSize(recovery_img.data, "recovery.img", OPTIONS.info_dict)
common.ZipWriteStr(output_zip, "recovery.img", recovery_img.data)
script.WriteRawImage("/recovery", "recovery.img")
-
def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
-
source_version = OPTIONS.source_info_dict["recovery_api_version"]
-
target_version = OPTIONS.target_info_dict["recovery_api_version"]
-
-
if source_version == 0:
-
print ("WARNING: generating edify script for a source that "
-
"can't install it.")
-
script = edify_generator.EdifyGenerator(source_version,
-
OPTIONS.target_info_dict)
-
-
metadata = {"pre-device": GetBuildProp("ro.product.device",
-
OPTIONS.source_info_dict),
-
"post-timestamp": GetBuildProp("ro.build.date.utc",
-
OPTIONS.target_info_dict),
-
}
-
-
device_specific = common.DeviceSpecificParams(
-
source_zip=source_zip,
-
source_version=source_version,
-
target_zip=target_zip,
-
target_version=target_version,
-
output_zip=output_zip,
-
script=script,
-
metadata=metadata,
-
info_dict=OPTIONS.info_dict)
-
-
print "Loading target..."
-
target_data = LoadSystemFiles(target_zip)
-
print "Loading source..."
-
source_data = LoadSystemFiles(source_zip)
-
-
verbatim_targets = []
-
patch_list = []
-
diffs = []
-
largest_source_size = 0
-
for fn in sorted(target_data.keys()):
-
tf = target_data[fn]
-
assert fn == tf.name
-
sf = source_data.get(fn, None)
-
-
if sf is None or fn in OPTIONS.require_verbatim:
-
# This file should be included verbatim
-
if fn in OPTIONS.prohibit_verbatim:
-
raise common.ExternalError("\"%s\" must be sent verbatim" % (fn,))
-
print "send", fn, "verbatim"
-
tf.AddToZip(output_zip)
-
verbatim_targets.append((fn, tf.size))
-
elif tf.sha1 != sf.sha1:
-
# File is different; consider sending as a patch
-
diffs.append(common.Difference(tf, sf))
-
else:
-
# Target file identical to source.
-
pass
-
-
common.ComputeDifferences(diffs)
-
-
for diff in diffs:
-
tf, sf, d = diff.GetPatch()
-
if d is None or len(d) > tf.size * OPTIONS.patch_threshold:
-
# patch is almost as big as the file; don't bother patching
-
tf.AddToZip(output_zip)
-
verbatim_targets.append((tf.name, tf.size))
-
else:
-
common.ZipWriteStr(output_zip, "patch/" + tf.name + ".p", d)
-
patch_list.append((tf.name, tf, sf, tf.size, common.sha1(d).hexdigest()))
-
largest_source_size = max(largest_source_size, sf.size)
-
-
source_fp = GetBuildProp("ro.build.fingerprint", OPTIONS.source_info_dict)
-
target_fp = GetBuildProp("ro.build.fingerprint", OPTIONS.target_info_dict)
-
metadata["pre-build"] = source_fp
-
metadata["post-build"] = target_fp
-
-
script.Mount("/system")
-
script.AssertSomeFingerprint(source_fp, target_fp)
-
-
source_boot = common.GetBootableImage(
-
"/tmp/boot.img", "boot.img", OPTIONS.source_tmp, "BOOT",
-
OPTIONS.source_info_dict)
-
target_boot = common.GetBootableImage(
-
"/tmp/boot.img", "boot.img", OPTIONS.target_tmp, "BOOT")
-
updating_boot = (source_boot.data != target_boot.data)
-
-
source_recovery = common.GetBootableImage(
-
"/tmp/recovery.img", "recovery.img", OPTIONS.source_tmp, "RECOVERY",
-
OPTIONS.source_info_dict)
-
target_recovery = common.GetBootableImage(
-
"/tmp/recovery.img", "recovery.img", OPTIONS.target_tmp, "RECOVERY")
-
updating_recovery = (source_recovery.data != target_recovery.data)
-
-
# Here's how we divide up the progress bar:
-
# 0.1 for verifying the start state (PatchCheck calls)
-
# 0.8 for applying patches (ApplyPatch calls)
-
# 0.1 for unpacking verbatim files, symlinking, and doing the
-
# device-specific commands.
-
-
AppendAssertions(script, OPTIONS.target_info_dict)
-
device_specific.IncrementalOTA_Assertions()
-
-
script.Print("Verifying current system...")
-
-
device_specific.IncrementalOTA_VerifyBegin()
-
-
script.ShowProgress(0.1, 0)
-
total_verify_size = float(sum([i[2].size for i in patch_list]) + 1)
-
if updating_boot:
-
total_verify_size += source_boot.size
-
so_far = 0
-
-
for fn, tf, sf, size, patch_sha in patch_list:
-
script.PatchCheck("/"+fn, tf.sha1, sf.sha1)
-
so_far += sf.size
-
script.SetProgress(so_far / total_verify_size)
-
-
if updating_boot:
-
d = common.Difference(target_boot, source_boot)
-
_, _, d = d.ComputePatch()
-
print "boot target: %d source: %d diff: %d" % (
-
target_boot.size, source_boot.size, len(d))
-
-
common.ZipWriteStr(output_zip, "patch/boot.img.p", d)
-
-
boot_type, boot_device = common.GetTypeAndDevice("/boot", OPTIONS.info_dict)
-
-
script.PatchCheck("%s:%s:%d:%s:%d:%s" %
-
(boot_type, boot_device,
-
source_boot.size, source_boot.sha1,
-
target_boot.size, target_boot.sha1))
-
so_far += source_boot.size
-
script.SetProgress(so_far / total_verify_size)
-
-
if patch_list or updating_recovery or updating_boot:
-
script.CacheFreeSpaceCheck(largest_source_size)
-
-
device_specific.IncrementalOTA_VerifyEnd()
-
-
script.Comment("---- start making changes here ----")
-
-
device_specific.IncrementalOTA_InstallBegin()
-
-
if OPTIONS.wipe_user_data:
-
script.Print("Erasing user data...")
-
script.FormatPartition("/data")
-
-
script.Print("Removing unneeded files...")
-
script.DeleteFiles(["/"+i[0] for i in verbatim_targets] +
-
["/"+i for i in sorted(source_data)
-
if i not in target_data] +
-
["/system/recovery.img"])
-
-
script.ShowProgress(0.8, 0)
-
total_patch_size = float(sum([i[1].size for i in patch_list]) + 1)
-
if updating_boot:
-
total_patch_size += target_boot.size
-
so_far = 0
-
-
script.Print("Patching system files...")
-
deferred_patch_list = []
-
for item in patch_list:
-
fn, tf, sf, size, _ = item
-
if tf.name == "system/build.prop":
-
deferred_patch_list.append(item)
-
continue
-
script.ApplyPatch("/"+fn, "-", tf.size, tf.sha1, sf.sha1, "patch/"+fn+".p")
-
so_far += tf.size
-
script.SetProgress(so_far / total_patch_size)
-
-
if updating_boot:
-
# Produce the boot image by applying a patch to the current
-
# contents of the boot partition, and write it back to the
-
# partition.
-
script.Print("Patching boot image...")
-
script.ApplyPatch("%s:%s:%d:%s:%d:%s"
-
% (boot_type, boot_device,
-
source_boot.size, source_boot.sha1,
-
target_boot.size, target_boot.sha1),
-
"-",
-
target_boot.size, target_boot.sha1,
-
source_boot.sha1, "patch/boot.img.p")
-
so_far += target_boot.size
-
script.SetProgress(so_far / total_patch_size)
-
print "boot image changed; including."
-
else:
-
print "boot image unchanged; skipping."
-
-
if updating_recovery:
-
# Recovery is generated as a patch using both the boot image
-
# (which contains the same linux kernel as recovery) and the file
-
# /system/etc/recovery-resource.dat (which contains all the images
-
# used in the recovery UI) as sources. This lets us minimize the
-
# size of the patch, which must be included in every OTA package.
-
#
-
# For older builds where recovery-resource.dat is not present, we
-
# use only the boot image as the source.
-
-
MakeRecoveryPatch(OPTIONS.target_tmp, output_zip,
-
target_recovery, target_boot)
-
script.DeleteFiles(["/system/recovery-from-boot.p",
-
"/system/etc/install-recovery.sh"])
-
print "recovery image changed; including as patch from boot."
-
else:
-
print "recovery image unchanged; skipping."
-
-
script.ShowProgress(0.1, 10)
-
-
target_symlinks = CopySystemFiles(target_zip, None)
-
-
target_symlinks_d = dict([(i[1], i[0]) for i in target_symlinks])
-
temp_script = script.MakeTemporary()
-
Item.GetMetadata(target_zip)
-
Item.Get("system").SetPermissions(temp_script)
-
-
# Note that this call will mess up the tree of Items, so make sure
-
# we're done with it.
-
source_symlinks = CopySystemFiles(source_zip, None)
-
source_symlinks_d = dict([(i[1], i[0]) for i in source_symlinks])
-
-
# Delete all the symlinks in source that aren't in target. This
-
# needs to happen before verbatim files are unpacked, in case a
-
# symlink in the source is replaced by a real file in the target.
-
to_delete = []
-
for dest, link in source_symlinks:
-
if link not in target_symlinks_d:
-
to_delete.append(link)
-
script.DeleteFiles(to_delete)
-
-
if verbatim_targets:
-
script.Print("Unpacking new files...")
-
script.UnpackPackageDir("system", "/system")
-
-
if updating_recovery:
-
script.Print("Unpacking new recovery...")
-
script.UnpackPackageDir("recovery", "/system")
-
-
script.Print("Symlinks and permissions...")
-
-
# Create all the symlinks that don't already exist, or point to
-
# somewhere different than what we want. Delete each symlink before
-
# creating it, since the 'symlink' command won't overwrite.
-
to_create = []
-
for dest, link in target_symlinks:
-
if link in source_symlinks_d:
-
if dest != source_symlinks_d[link]:
-
to_create.append((dest, link))
-
else:
-
to_create.append((dest, link))
-
script.DeleteFiles([i[1] for i in to_create])
-
script.MakeSymlinks(to_create)
-
-
# Now that the symlinks are created, we can set all the
-
# permissions.
-
script.AppendScript(temp_script)
-
-
# Do device-specific installation (eg, write radio image).
-
device_specific.IncrementalOTA_InstallEnd()
-
-
if OPTIONS.extra_script is not None:
-
script.AppendExtra(OPTIONS.extra_script)
-
-
# Patch the build.prop file last, so if something fails but the
-
# device can still come up, it appears to be the old build and will
-
# get set the OTA package again to retry.
-
script.Print("Patching remaining system files...")
-
for item in deferred_patch_list:
-
fn, tf, sf, size, _ = item
-
script.ApplyPatch("/"+fn, "-", tf.size, tf.sha1, sf.sha1, "patch/"+fn+".p")
-
script.SetPermissions("/system/build.prop", 0, 0, 0644)
-
-
script.AddToZip(target_zip, output_zip)
-
WriteMetadata(metadata, output_zip)
差分包把recovery.img完全烧录,而不产生差分,修改地方
-
#if updating_boot:
-
# total_verify_size += source_boot.size
-
# d = common.Difference(target_boot, source_boot)
-
# _, _, d = d.ComputePatch()
-
# print "boot target: %d source: %d diff: %d" % (
-
# target_boot.size, source_boot.size, len(d))
-
# common.ZipWriteStr(output_zip, "patch/boot.img.p", d)
-
# boot_type, boot_device = common.GetTypeAndDevice("/boot", OPTIONS.info_dict)
-
# script.PatchCheck("%s:%s:%d:%s:%d:%s" %
-
# (boot_type, boot_device,
-
# source_boot.size, source_boot.sha1,
-
# target_boot.size, target_boot.sha1))
-
# so_far += source_boot.size
-
# script.SetProgress(so_far / total_verify_size)
-
boot_img = common.GetBootableImage("boot.img", "boot.img",
-
OPTIONS.input_tmp, "BOOT")
-
common.CheckSize(boot_img.data, "boot.img", OPTIONS.info_dict)
-
common.ZipWriteStr(output_zip, "boot.img", boot_img.data)
-
-
if updating_recovery:
-
recovery_img = common.GetBootableImage("recovery.img", "recovery.img",
-
OPTIONS.input_tmp, "RECOVERY")
-
common.CheckSize(recovery_img.data, "recovery.img", OPTIONS.info_dict)
-
common.ZipWriteStr(output_zip, "recovery.img", recovery_img.data)
同理,如果要把boot.img全部烧录而不产生差分包。修改
-
#if updating_boot:
-
# total_patch_size += target_boot.size
-
#script.ApplyPatch("%s:%s:%d:%s:%d:%s"
-
# % (boot_type, boot_device,
-
# source_boot.size, source_boot.sha1,
-
# target_boot.size, target_boot.sha1),
-
# "-",
-
# target_boot.size, target_boot.sha1,
-
# source_boot.sha1, "patch/boot.img.p")
-
#so_far += target_boot.size
-
-
script.WriteRawImage("/boot", "boot.img")
-
#script.SetProgress(so_far / total_patch_size)
-
# MakeRecoveryPatch(OPTIONS.target_tmp, output_zip,
-
# target_recovery, target_boot)
-
# script.DeleteFiles(["/system/recovery-from-boot.p",
-
# "/system/etc/install-recovery.sh"])
-
# print "recovery image changed; including as patch from boot."
-
script.Print("Patching recovery image...")
-
script.WriteRawImage("/recovery", "recovery.img")