am 918ccff3: Merge "consolidate target_files metadata into one key-value file" into gingerbread

Merge commit '918ccff37260270d0eef3a3a7bfc2410c46d931a' into gingerbread-plus-aosp

* commit '918ccff37260270d0eef3a3a7bfc2410c46d931a':
  consolidate target_files metadata into one key-value file
This commit is contained in:
Doug Zongker
2010-09-16 18:11:59 -07:00
committed by Android Git Automerger
5 changed files with 102 additions and 123 deletions

View File

@@ -1027,9 +1027,9 @@ endif
$(hide) mkdir -p $(zip_root)/META $(hide) mkdir -p $(zip_root)/META
$(hide) $(ACP) $(APKCERTS_FILE) $(zip_root)/META/apkcerts.txt $(hide) $(ACP) $(APKCERTS_FILE) $(zip_root)/META/apkcerts.txt
$(hide) echo "$(PRODUCT_OTA_PUBLIC_KEYS)" > $(zip_root)/META/otakeys.txt $(hide) echo "$(PRODUCT_OTA_PUBLIC_KEYS)" > $(zip_root)/META/otakeys.txt
$(hide) echo "$(PRIVATE_RECOVERY_API_VERSION)" > $(zip_root)/META/recovery-api-version.txt $(hide) echo "recovery_api_version=$(PRIVATE_RECOVERY_API_VERSION)" > $(zip_root)/META/misc_info.txt
ifdef BOARD_FLASH_BLOCK_SIZE ifdef BOARD_FLASH_BLOCK_SIZE
$(hide) echo "blocksize=$(BOARD_FLASH_BLOCK_SIZE)" > $(zip_root)/META/misc_info.txt $(hide) echo "blocksize=$(BOARD_FLASH_BLOCK_SIZE)" >> $(zip_root)/META/misc_info.txt
endif endif
ifdef BOARD_BOOTIMAGE_PARTITION_SIZE ifdef BOARD_BOOTIMAGE_PARTITION_SIZE
$(hide) echo "boot_size=$(BOARD_BOOTIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt $(hide) echo "boot_size=$(BOARD_BOOTIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt
@@ -1052,9 +1052,9 @@ else
$(hide) echo "fs_type=yaffs2" >> $(zip_root)/META/misc_info.txt $(hide) echo "fs_type=yaffs2" >> $(zip_root)/META/misc_info.txt
$(hide) echo "partition_type=MTD" >> $(zip_root)/META/misc_info.txt $(hide) echo "partition_type=MTD" >> $(zip_root)/META/misc_info.txt
endif endif
$(hide) echo "$(tool_extensions)" > $(zip_root)/META/tool-extensions.txt $(hide) echo "tool_extensions=$(tool_extensions)" >> $(zip_root)/META/misc_info.txt
ifdef mkyaffs2_extra_flags ifdef mkyaffs2_extra_flags
$(hide) echo "$(mkyaffs2_extra_flags)" > $(zip_root)/META/mkyaffs2-extra-flags.txt $(hide) echo "mkyaffs2_extra_flags=$(mkyaffs2_extra_flags)" >> $(zip_root)/META/misc_info.txt
endif endif
@# Zip everything up, preserving symlinks @# Zip everything up, preserving symlinks
$(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .) $(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .)

View File

@@ -40,7 +40,6 @@ OPTIONS.verbose = False
OPTIONS.tempfiles = [] OPTIONS.tempfiles = []
OPTIONS.device_specific = None OPTIONS.device_specific = None
OPTIONS.extras = {} OPTIONS.extras = {}
OPTIONS.mkyaffs2_extra_flags = None
OPTIONS.info_dict = None OPTIONS.info_dict = None
@@ -59,68 +58,78 @@ def Run(args, **kwargs):
return subprocess.Popen(args, **kwargs) return subprocess.Popen(args, **kwargs)
def LoadInfoDict(): def LoadInfoDict(zip):
"""Read and parse the META/misc_info.txt key/value pairs from the """Read and parse the META/misc_info.txt key/value pairs from the
input target files and return a dict.""" input target files and return a dict."""
d = {} d = {}
try: try:
for line in open(os.path.join(OPTIONS.input_tmp, "META", "misc_info.txt")): for line in zip.read("META/misc_info.txt").split("\n"):
line = line.strip() line = line.strip()
if not line or line.startswith("#"): continue if not line or line.startswith("#"): continue
k, v = line.split("=", 1) k, v = line.split("=", 1)
d[k] = v d[k] = v
except IOError, e: except KeyError:
if e.errno == errno.ENOENT: # ok if misc_info.txt doesn't exist
# ok if misc_info.txt file doesn't exist pass
pass
else:
raise
if "fs_type" not in d: info["fs_type"] = "yaffs2" if "fs_type" not in d: d["fs_type"] = "yaffs2"
if "partition_type" not in d: info["partition_type"] = "MTD" if "partition_type" not in d: d["partition_type"] = "MTD"
# backwards compatibility: These values used to be in their own
# files. Look for them, in case we're processing an old
# target_files zip.
if "mkyaffs2_extra_flags" not in d:
try:
d["mkyaffs2_extra_flags"] = zip.read("META/mkyaffs2-extra-flags.txt").strip()
except KeyError:
# ok if flags don't exist
pass
if "recovery_api_version" not in d:
try:
d["recovery_api_version"] = zip.read("META/recovery-api-version.txt").strip()
except KeyError:
raise ValueError("can't find recovery API version in input target-files")
if "tool_extensions" not in d:
try:
d["tool_extensions"] = zip.read("META/tool-extensions.txt").strip()
except KeyError:
# ok if extensions don't exist
pass
try:
data = zip.read("META/imagesizes.txt")
for line in data.split("\n"):
if not line: continue
name, value = line.strip().split(None, 1)
if name == "blocksize":
d[name] = value
else:
d[name + "_size"] = value
except KeyError:
pass
def makeint(key):
if key in d:
d[key] = int(d[key], 0)
makeint("recovery_api_version")
makeint("blocksize")
makeint("system_size")
makeint("userdata_size")
makeint("recovery_size")
makeint("boot_size")
return d return d
def DumpInfoDict(d):
for k, v in sorted(d.items()):
print "%-25s = (%s) %s" % (k, type(v).__name__, v)
def LoadMaxSizes(info): def BuildAndAddBootableImage(sourcedir, targetname, output_zip, info_dict):
"""Load the maximum allowable images sizes from the input
target_files. Uses the imagesizes.txt file if it's available
(pre-gingerbread target_files), or the more general info dict (which
must be passed in) if not."""
OPTIONS.max_image_size = {}
try:
for line in open(os.path.join(OPTIONS.input_tmp, "META", "imagesizes.txt")):
pieces = line.split()
if len(pieces) != 2: continue
image = pieces[0]
size = int(pieces[1], 0)
OPTIONS.max_image_size[image + ".img"] = size
except IOError, e:
if e.errno == errno.ENOENT:
def copy(x, y):
if x+y in info: OPTIONS.max_image_size[x+".img"] = int(info[x+y], 0)
copy("blocksize", "")
copy("boot", "_size")
copy("recovery", "_size")
copy("system", "_size")
copy("userdata", "_size")
else:
raise
def LoadMkyaffs2ExtraFlags():
"""Load mkyaffs2 extra flags."""
try:
fn = os.path.join(OPTIONS.input_tmp, "META", "mkyaffs2-extra-flags.txt");
if os.access(fn, os.F_OK):
OPTIONS.mkyaffs2_extra_flags = open(fn).read().rstrip("\n")
except IOError, e:
if e.errno == errno.ENOENT:
pass
def BuildAndAddBootableImage(sourcedir, targetname, output_zip):
"""Take a kernel, cmdline, and ramdisk directory from the input (in """Take a kernel, cmdline, and ramdisk directory from the input (in
'sourcedir'), and turn them into a boot image. Put the boot image 'sourcedir'), and turn them into a boot image. Put the boot image
into the output zip file under the name 'targetname'. Returns into the output zip file under the name 'targetname'. Returns
@@ -133,7 +142,7 @@ def BuildAndAddBootableImage(sourcedir, targetname, output_zip):
if img is None: if img is None:
return None return None
CheckSize(img, targetname) CheckSize(img, targetname, info_dict)
ZipWriteStr(output_zip, targetname, img) ZipWriteStr(output_zip, targetname, img)
return targetname return targetname
@@ -194,13 +203,13 @@ def BuildBootableImage(sourcedir):
return data return data
def AddRecovery(output_zip): def AddRecovery(output_zip, info_dict):
BuildAndAddBootableImage(os.path.join(OPTIONS.input_tmp, "RECOVERY"), BuildAndAddBootableImage(os.path.join(OPTIONS.input_tmp, "RECOVERY"),
"recovery.img", output_zip) "recovery.img", output_zip, info_dict)
def AddBoot(output_zip): def AddBoot(output_zip, info_dict):
BuildAndAddBootableImage(os.path.join(OPTIONS.input_tmp, "BOOT"), BuildAndAddBootableImage(os.path.join(OPTIONS.input_tmp, "BOOT"),
"boot.img", output_zip) "boot.img", output_zip, info_dict)
def UnzipTemp(filename, pattern=None): def UnzipTemp(filename, pattern=None):
"""Unzip the given archive into a temporary directory and return the name.""" """Unzip the given archive into a temporary directory and return the name."""
@@ -294,12 +303,12 @@ def SignFile(input_name, output_name, key, password, align=None,
temp.close() temp.close()
def CheckSize(data, target): def CheckSize(data, target, info_dict):
"""Check the data string passed against the max size limit, if """Check the data string passed against the max size limit, if
any, for the given target. Raise exception if the data is too big. any, for the given target. Raise exception if the data is too big.
Print a warning if the data is nearing the maximum size.""" Print a warning if the data is nearing the maximum size."""
fs_type = OPTIONS.info_dict.get("fs_type", None) fs_type = info_dict.get("fs_type", None)
if not fs_type: return if not fs_type: return
limit = OPTIONS.max_image_size.get(target, None) limit = OPTIONS.max_image_size.get(target, None)

View File

@@ -31,7 +31,7 @@ class EdifyGenerator(object):
"""Make a temporary script object whose commands can latter be """Make a temporary script object whose commands can latter be
appended to the parent script with AppendScript(). Used when the appended to the parent script with AppendScript(). Used when the
caller wants to generate script commands out-of-order.""" caller wants to generate script commands out-of-order."""
x = EdifyGenerator(self.version) x = EdifyGenerator(self.version, self.info)
x.mounts = self.mounts x.mounts = self.mounts
return x return x

View File

@@ -68,8 +68,9 @@ def AddUserdata(output_zip):
build_command.append(str(OPTIONS.max_image_size["userdata.img"])) build_command.append(str(OPTIONS.max_image_size["userdata.img"]))
else: else:
build_command = ["mkyaffs2image", "-f"] build_command = ["mkyaffs2image", "-f"]
if OPTIONS.mkyaffs2_extra_flags is not None: extra = OPTIONS.info_dict.get("mkyaffs2_extra_flags", None)
build_command.append(OPTIONS.mkyaffs2_extra_flags); if extra:
build_command.extend(extra.split())
build_command.append(user_dir) build_command.append(user_dir)
build_command.append(img.name) build_command.append(img.name)
@@ -77,7 +78,7 @@ def AddUserdata(output_zip):
p.communicate() p.communicate()
assert p.returncode == 0, "build userdata.img image failed" assert p.returncode == 0, "build userdata.img image failed"
common.CheckSize(img.name, "userdata.img") common.CheckSize(img.name, "userdata.img", OPTIONS.info_dict)
output_zip.write(img.name, "userdata.img") output_zip.write(img.name, "userdata.img")
img.close() img.close()
os.rmdir(user_dir) os.rmdir(user_dir)
@@ -115,8 +116,9 @@ def AddSystem(output_zip):
build_command.append(str(OPTIONS.max_image_size["system.img"])) build_command.append(str(OPTIONS.max_image_size["system.img"]))
else: else:
build_command = ["mkyaffs2image", "-f"] build_command = ["mkyaffs2image", "-f"]
if OPTIONS.mkyaffs2_extra_flags is not None: extra = OPTIONS.info_dict.get("mkyaffs2_extra_flags", None)
build_command.extend(OPTIONS.mkyaffs2_extra_flags.split()); if extra:
build_command.extend(extra.split())
build_command.append(os.path.join(OPTIONS.input_tmp, "system")) build_command.append(os.path.join(OPTIONS.input_tmp, "system"))
build_command.append(img.name) build_command.append(img.name)
@@ -128,7 +130,7 @@ def AddSystem(output_zip):
data = img.read() data = img.read()
img.close() img.close()
common.CheckSize(data, "system.img") common.CheckSize(data, "system.img", OPTIONS.info_dict)
common.ZipWriteStr(output_zip, "system.img", data) common.ZipWriteStr(output_zip, "system.img", data)
@@ -158,20 +160,13 @@ def main(argv):
OPTIONS.input_tmp = common.UnzipTemp(args[0]) OPTIONS.input_tmp = common.UnzipTemp(args[0])
OPTIONS.info_dict = common.LoadInfoDict() input_zip = zipfile.ZipFile(args[0], "r")
common.LoadMaxSizes(OPTIONS.info_dict) OPTIONS.info_dict = common.LoadInfoDict(input_zip)
if not OPTIONS.max_image_size:
print
print " WARNING: Failed to load max image sizes; will not enforce"
print " image size limits."
print
common.LoadMkyaffs2ExtraFlags()
output_zip = zipfile.ZipFile(args[1], "w", compression=zipfile.ZIP_DEFLATED) output_zip = zipfile.ZipFile(args[1], "w", compression=zipfile.ZIP_DEFLATED)
common.AddBoot(output_zip) common.AddBoot(output_zip, OPTIONS.info_dict)
common.AddRecovery(output_zip) common.AddRecovery(output_zip, OPTIONS.info_dict)
AddSystem(output_zip) AddSystem(output_zip)
AddUserdata(output_zip) AddUserdata(output_zip)
CopyInfo(output_zip) CopyInfo(output_zip)

View File

@@ -347,7 +347,7 @@ def WriteFullOTAPackage(input_zip, output_zip):
device_specific = common.DeviceSpecificParams( device_specific = common.DeviceSpecificParams(
input_zip=input_zip, input_zip=input_zip,
input_version=GetRecoveryAPIVersion(input_zip), input_version=OPTIONS.info_dict["recovery_api_version"],
output_zip=output_zip, output_zip=output_zip,
script=script, script=script,
input_tmp=OPTIONS.input_tmp, input_tmp=OPTIONS.input_tmp,
@@ -382,7 +382,7 @@ def WriteFullOTAPackage(input_zip, output_zip):
Item.GetMetadata(input_zip) Item.GetMetadata(input_zip)
Item.Get("system").SetPermissions(script) Item.Get("system").SetPermissions(script)
common.CheckSize(boot_img.data, "boot.img") common.CheckSize(boot_img.data, "boot.img", OPTIONS.info_dict)
common.ZipWriteStr(output_zip, "boot.img", boot_img.data) common.ZipWriteStr(output_zip, "boot.img", boot_img.data)
script.ShowProgress(0.2, 0) script.ShowProgress(0.2, 0)
@@ -432,25 +432,9 @@ def GetBuildProp(property, z):
return m.group(1).strip() return m.group(1).strip()
def GetRecoveryAPIVersion(zip):
"""Returns the version of the recovery API. Version 0 is the older
amend code (no separate binary)."""
try:
version = zip.read("META/recovery-api-version.txt")
return int(version)
except KeyError:
try:
# version one didn't have the recovery-api-version.txt file, but
# it did include an updater binary.
zip.getinfo("OTA/bin/updater")
return 1
except KeyError:
return 0
def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
source_version = GetRecoveryAPIVersion(source_zip) source_version = OPTIONS.source_info_dict["recovery_api_version"]
target_version = GetRecoveryAPIVersion(target_zip) target_version = OPTIONS.target_info_dict["recovery_api_version"]
if source_version == 0: if source_version == 0:
print ("WARNING: generating edify script for a source that " print ("WARNING: generating edify script for a source that "
@@ -738,33 +722,19 @@ def main(argv):
print "unzipping target target-files..." print "unzipping target target-files..."
OPTIONS.input_tmp = common.UnzipTemp(args[0]) OPTIONS.input_tmp = common.UnzipTemp(args[0])
if OPTIONS.device_specific is None:
# look for the device-specific tools extension location in the input
try:
f = open(os.path.join(OPTIONS.input_tmp, "META", "tool-extensions.txt"))
ds = f.read().strip()
f.close()
if ds:
ds = os.path.normpath(ds)
print "using device-specific extensions in", ds
OPTIONS.device_specific = ds
except IOError, e:
if e.errno == errno.ENOENT:
# nothing specified in the file
pass
else:
raise
OPTIONS.info_dict = common.LoadInfoDict()
common.LoadMaxSizes(OPTIONS.info_dict)
if not OPTIONS.max_image_size:
print
print " WARNING: Failed to load max image sizes; will not enforce"
print " image size limits."
print
OPTIONS.target_tmp = OPTIONS.input_tmp OPTIONS.target_tmp = OPTIONS.input_tmp
input_zip = zipfile.ZipFile(args[0], "r") input_zip = zipfile.ZipFile(args[0], "r")
OPTIONS.info_dict = common.LoadInfoDict(input_zip)
if OPTIONS.verbose:
print "--- target info ---"
common.DumpInfoDict(OPTIONS.info_dict)
if OPTIONS.device_specific is None:
OPTIONS.device_specific = OPTIONS.info_dict.get("tool_extensions", None)
if OPTIONS.device_specific is not None:
OPTIONS.device_specific = os.path.normpath(OPTIONS.device_specific)
print "using device-specific extensions in", OPTIONS.device_specific
if OPTIONS.package_key: if OPTIONS.package_key:
temp_zip_file = tempfile.NamedTemporaryFile() temp_zip_file = tempfile.NamedTemporaryFile()
output_zip = zipfile.ZipFile(temp_zip_file, "w", output_zip = zipfile.ZipFile(temp_zip_file, "w",
@@ -779,6 +749,11 @@ def main(argv):
print "unzipping source target-files..." print "unzipping source target-files..."
OPTIONS.source_tmp = common.UnzipTemp(OPTIONS.incremental_source) OPTIONS.source_tmp = common.UnzipTemp(OPTIONS.incremental_source)
source_zip = zipfile.ZipFile(OPTIONS.incremental_source, "r") source_zip = zipfile.ZipFile(OPTIONS.incremental_source, "r")
OPTIONS.target_info_dict = OPTIONS.info_dict
OPTIONS.source_info_dict = common.LoadInfoDict(source_zip)
if OPTIONS.verbose:
print "--- source info ---"
common.DumpInfoDict(OPTIONS.source_info_dict)
WriteIncrementalOTAPackage(input_zip, source_zip, output_zip) WriteIncrementalOTAPackage(input_zip, source_zip, output_zip)
output_zip.close() output_zip.close()