merge 73ef8257ce from donut (resolved conflicts)

This commit is contained in:
Android Git Automerger
2009-07-24 12:46:51 -07:00
2 changed files with 94 additions and 36 deletions

View File

@@ -642,10 +642,24 @@ else
SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT) SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT)
endif endif
$(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(INSTALLED_RECOVERYIMAGE_TARGET) | $(ACP) # The system partition needs room for the recovery image as well. We
# now store the recovery image as a binary patch using the boot image
# as the source (since they are very similar). Generate the patch so
# we can see how big it's going to be, and include that in the system
# image size check calculation.
intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch)
RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p
$(RECOVERY_FROM_BOOT_PATCH): $(INSTALLED_RECOVERYIMAGE_TARGET) \
$(INSTALLED_BOOTIMAGE_TARGET) \
| $(HOST_OUT_EXECUTABLES)/imgdiff
@echo "Construct recovery from boot"
mkdir -p $(dir $@)
$(HOST_OUT_EXECUTABLES)/imgdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@
$(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(RECOVERY_FROM_BOOT_PATCH) | $(ACP)
@echo "Install system fs image: $@" @echo "Install system fs image: $@"
$(copy-file-to-target) $(copy-file-to-target)
$(hide) $(call assert-max-file-size,$@ $(INSTALLED_RECOVERYIMAGE_TARGET),$(BOARD_SYSTEMIMAGE_MAX_SIZE)) $(hide) $(call assert-max-file-size,$@ $(RECOVERY_FROM_BOOT_PATCH),$(BOARD_SYSTEMIMAGE_MAX_SIZE))
systemimage: $(INSTALLED_SYSTEMIMAGE) systemimage: $(INSTALLED_SYSTEMIMAGE)

View File

@@ -277,12 +277,6 @@ def SignOutput(temp_zip_name, output_zip_name):
common.SignFile(temp_zip_name, output_zip_name, OPTIONS.package_key, pw) common.SignFile(temp_zip_name, output_zip_name, OPTIONS.package_key, pw)
def FixPermissions(script):
Item.GetMetadata()
root = Item.Get("system")
root.SetPermissions(script)
def AppendAssertions(script, input_zip): def AppendAssertions(script, input_zip):
device = GetBuildProp("ro.product.device", input_zip) device = GetBuildProp("ro.product.device", input_zip)
script.AssertDevice(device) script.AssertDevice(device)
@@ -295,6 +289,47 @@ def AppendAssertions(script, input_zip):
script.AssertSomeBootloader(*bootloaders) script.AssertSomeBootloader(*bootloaders)
def MakeRecoveryPatch(output_zip, recovery_img, boot_img):
"""Generate a binary patch that creates the recovery image starting
with the boot image. (Most of the space in these images is just the
kernel, which is identical for the two, so the resulting patch
should be efficient.) Add it to the output zip, along with a shell
script that is run from init.rc on first boot to actually do the
patching and install the new recovery image.
recovery_img and boot_img should be File objects for the
corresponding images.
Returns an Item for the shell script, which must be made
executable.
"""
patch = Difference(recovery_img, boot_img, "imgdiff")
common.ZipWriteStr(output_zip, "system/recovery-from-boot.p", patch)
Item.Get("system/recovery-from-boot.p", dir=False)
# Images with different content will have a different first page, so
# we check to see if this recovery has already been installed by
# testing just the first 2k.
HEADER_SIZE = 2048
header_sha1 = sha.sha(recovery_img.data[:HEADER_SIZE]).hexdigest()
sh = """#!/system/bin/sh
if ! applypatch -c MTD:recovery:%(header_size)d:%(header_sha1)s; then
log -t recovery "Installing new recovery image"
applypatch MTD:boot:%(boot_size)d:%(boot_sha1)s MTD:recovery %(recovery_sha1)s %(recovery_size)d %(boot_sha1)s:/system/recovery-from-boot.p
else
log -t recovery "Recovery image already installed"
fi
""" % { 'boot_size': boot_img.size,
'boot_sha1': boot_img.sha1,
'header_size': HEADER_SIZE,
'header_sha1': header_sha1,
'recovery_size': recovery_img.size,
'recovery_sha1': recovery_img.sha1 }
common.ZipWriteStr(output_zip, "system/etc/install-recovery.sh", sh)
return Item.Get("system/etc/install-recovery.sh", dir=False)
def WriteFullOTAPackage(input_zip, output_zip): def WriteFullOTAPackage(input_zip, output_zip):
if OPTIONS.script_mode == "auto": if OPTIONS.script_mode == "auto":
script = both_generator.BothGenerator(2) script = both_generator.BothGenerator(2)
@@ -331,14 +366,25 @@ def WriteFullOTAPackage(input_zip, output_zip):
symlinks = CopySystemFiles(input_zip, output_zip) symlinks = CopySystemFiles(input_zip, output_zip)
script.MakeSymlinks(symlinks) script.MakeSymlinks(symlinks)
if common.BuildAndAddBootableImage( boot_img = File("boot.img", common.BuildBootableImage(
os.path.join(OPTIONS.input_tmp, "RECOVERY"), os.path.join(OPTIONS.input_tmp, "BOOT")))
"system/recovery.img", output_zip): recovery_img = File("recovery.img", common.BuildBootableImage(
Item.Get("system/recovery.img", dir=False) os.path.join(OPTIONS.input_tmp, "RECOVERY")))
i = MakeRecoveryPatch(output_zip, recovery_img, boot_img)
FixPermissions(script) Item.GetMetadata()
common.AddBoot(output_zip) # GetMetadata uses the data in android_filesystem_config.h to assign
# the uid/gid/mode of all files. We want to override that for the
# recovery patching shell script to make it executable.
i.uid = 0
i.gid = 0
i.mode = 0544
Item.Get("system").SetPermissions(script)
common.CheckSize(boot_img.data, "boot.img")
common.ZipWriteStr(output_zip, "boot.img", boot_img.data)
script.ShowProgress(0.2, 0)
script.ShowProgress(0.2, 10) script.ShowProgress(0.2, 10)
script.WriteRawImage("boot", "boot.img") script.WriteRawImage("boot", "boot.img")
@@ -553,17 +599,6 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
script.PatchCheck("/"+fn, tf.sha1, sf.sha1) script.PatchCheck("/"+fn, tf.sha1, sf.sha1)
if updating_recovery:
d = Difference(target_recovery, source_recovery, "imgdiff")
print "recovery target: %d source: %d diff: %d" % (
target_recovery.size, source_recovery.size, len(d))
common.ZipWriteStr(output_zip, "patch/recovery.img.p", d)
script.PatchCheck("MTD:recovery:%d:%s:%d:%s" %
(source_recovery.size, source_recovery.sha1,
target_recovery.size, target_recovery.sha1))
if updating_boot: if updating_boot:
d = Difference(target_boot, source_boot, "imgdiff") d = Difference(target_boot, source_boot, "imgdiff")
print "boot target: %d source: %d diff: %d" % ( print "boot target: %d source: %d diff: %d" % (
@@ -609,16 +644,20 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
print "boot image unchanged; skipping." print "boot image unchanged; skipping."
if updating_recovery: if updating_recovery:
# Produce /system/recovery.img by applying a patch to the current # Is it better to generate recovery as a patch from the current
# contents of the recovery partition. # boot image, or from the previous recovery image? For large
script.Print("Patching recovery image...") # updates with significant kernel changes, probably the former.
script.ApplyPatch("MTD:recovery:%d:%s:%d:%s" # For small updates where the kernel hasn't changed, almost
% (source_recovery.size, source_recovery.sha1, # certainly the latter. We pick the first option. Future
target_recovery.size, target_recovery.sha1), # complicated schemes may let us effectively use both.
"/system/recovery.img", #
target_recovery.size, target_recovery.sha1, # A wacky possibility: as long as there is room in the boot
source_recovery.sha1, "/tmp/patchtmp/recovery.img.p") # partition, include the binaries and image files from recovery in
print "recovery image changed; including." # the boot image (though not in the ramdisk) so they can be used
# as fodder for constructing the recovery image.
recovery_sh_item = MakeRecoveryPatch(output_zip,
target_recovery, target_boot)
print "recovery image changed; including as patch from boot."
else: else:
print "recovery image unchanged; skipping." print "recovery image unchanged; skipping."
@@ -637,7 +676,12 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
target_symlinks_d = dict([(i[1], i[0]) for i in target_symlinks]) target_symlinks_d = dict([(i[1], i[0]) for i in target_symlinks])
temp_script = script.MakeTemporary() temp_script = script.MakeTemporary()
FixPermissions(temp_script) Item.GetMetadata()
if updating_recovery:
recovery_sh_item.uid = 0
recovery_sh_item.gid = 0
recovery_sh_item.mode = 0544
Item.Get("system").SetPermissions(temp_script)
# Note that this call will mess up the tree of Items, so make sure # Note that this call will mess up the tree of Items, so make sure
# we're done with it. # we're done with it.