summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/releasetools/edify_generator.py11
-rwxr-xr-xtools/releasetools/ota_from_target_files.py40
-rwxr-xr-xtools/releasetools/sign_target_files_apks.py8
3 files changed, 54 insertions, 5 deletions
diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py
index 566e687..a52e328 100644
--- a/tools/releasetools/edify_generator.py
+++ b/tools/releasetools/edify_generator.py
@@ -243,6 +243,15 @@ class EdifyGenerator(object):
cmd = "delete(" + ",\0".join(['"%s"' % (i,) for i in file_list]) + ");"
self.script.append(self.WordWrap(cmd))
+ def DeleteFilesIfNotMatching(self, file_list):
+ """Delete the file in file_list if not matching the checksum."""
+ if not file_list:
+ return
+ for name, sha1 in file_list:
+ cmd = ('sha1_check(read_file("{name}"), "{sha1}") || '
+ 'delete("{name}");'.format(name=name, sha1=sha1))
+ self.script.append(self.WordWrap(cmd))
+
def RenameFile(self, srcfile, tgtfile):
"""Moves a file from one location to another."""
if self.info.get("update_rename_support", False):
@@ -254,7 +263,7 @@ class EdifyGenerator(object):
"""Prepend an action with an apply_patch_check in order to
skip the action if the file exists. Used when a patch
is later renamed."""
- cmd = ('sha1_check(read_file("%s"), %s) || ' % (tgtfile, tgtsha1))
+ cmd = ('sha1_check(read_file("%s"), %s) ||' % (tgtfile, tgtsha1))
self.script.append(self.WordWrap(cmd))
def ApplyPatch(self, srcfile, tgtfile, tgtsize, tgtsha1, *patchpairs):
diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
index 531a728..b148fc1 100755
--- a/tools/releasetools/ota_from_target_files.py
+++ b/tools/releasetools/ota_from_target_files.py
@@ -42,6 +42,11 @@ Usage: ota_from_target_files [flags] input_target_files output_ota_package
radio image. This option is only meaningful when -i is specified,
because a full radio is always included in a full OTA if applicable.
+ --full_bootloader
+ When generating an incremental OTA, always include a full copy of
+ bootloader image. This option is only meaningful when -i is specified,
+ because a full bootloader is always included in a full OTA if applicable.
+
-v (--verify)
Remount and verify the checksums of the files written to the
system and vendor (if used) partitions. Incremental builds only.
@@ -122,6 +127,7 @@ OPTIONS.updater_binary = None
OPTIONS.oem_source = None
OPTIONS.fallback_to_full = True
OPTIONS.full_radio = False
+OPTIONS.full_bootloader = False
def MostPopularKey(d, default):
"""Given a dict, return the key corresponding to the largest
@@ -1384,11 +1390,36 @@ else
# 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 = []
+
+ # If a symlink in the source will be replaced by a regular file, we cannot
+ # delete the symlink/file in case the package gets applied again. For such
+ # a symlink, we prepend a sha1_check() to detect if it has been updated.
+ # (Bug: 23646151)
+ replaced_symlinks = dict()
+ if system_diff:
+ for i in system_diff.verbatim_targets:
+ replaced_symlinks["/%s" % (i[0],)] = i[2]
+ if vendor_diff:
+ for i in vendor_diff.verbatim_targets:
+ replaced_symlinks["/%s" % (i[0],)] = i[2]
+
+ if system_diff:
+ for tf in system_diff.renames.values():
+ replaced_symlinks["/%s" % (tf.name,)] = tf.sha1
+ if vendor_diff:
+ for tf in vendor_diff.renames.values():
+ replaced_symlinks["/%s" % (tf.name,)] = tf.sha1
+
+ always_delete = []
+ may_delete = []
for dest, link in source_symlinks:
if link not in target_symlinks_d:
- to_delete.append(link)
- script.DeleteFiles(to_delete)
+ if link in replaced_symlinks:
+ may_delete.append((link, replaced_symlinks[link]))
+ else:
+ always_delete.append(link)
+ script.DeleteFiles(always_delete)
+ script.DeleteFilesIfNotMatching(may_delete)
if system_diff.verbatim_targets:
script.Print("Unpacking new system files...")
@@ -1474,6 +1505,8 @@ def main(argv):
OPTIONS.incremental_source = a
elif o == "--full_radio":
OPTIONS.full_radio = True
+ elif o == "--full_bootloader":
+ OPTIONS.full_bootloader = True
elif o in ("-w", "--wipe_user_data"):
OPTIONS.wipe_user_data = True
elif o in ("-n", "--no_prereq"):
@@ -1516,6 +1549,7 @@ def main(argv):
"package_key=",
"incremental_from=",
"full_radio",
+ "full_bootloader",
"wipe_user_data",
"no_prereq",
"extra_script=",
diff --git a/tools/releasetools/sign_target_files_apks.py b/tools/releasetools/sign_target_files_apks.py
index ec49112..60d62c2 100755
--- a/tools/releasetools/sign_target_files_apks.py
+++ b/tools/releasetools/sign_target_files_apks.py
@@ -203,11 +203,13 @@ def ProcessTargetFiles(input_tf_zip, output_tf_zip, misc_info,
common.ZipWriteStr(output_tf_zip, out_info, data)
elif info.filename in ("SYSTEM/build.prop",
"VENDOR/build.prop",
+ "BOOT/RAMDISK/default.prop",
"RECOVERY/RAMDISK/default.prop"):
print "rewriting %s:" % (info.filename,)
new_data = RewriteProps(data, misc_info)
common.ZipWriteStr(output_tf_zip, out_info, new_data)
- if info.filename == "RECOVERY/RAMDISK/default.prop":
+ if info.filename in ("BOOT/RAMDISK/default.prop",
+ "RECOVERY/RAMDISK/default.prop"):
write_to_temp(info.filename, info.external_attr, new_data)
elif info.filename.endswith("mac_permissions.xml"):
print "rewriting %s with new keys." % (info.filename,)
@@ -310,6 +312,10 @@ def RewriteProps(data, misc_info):
pieces = value.split("/")
pieces[-1] = EditTags(pieces[-1])
value = "/".join(pieces)
+ elif key == "ro.bootimage.build.fingerprint":
+ pieces = value.split("/")
+ pieces[-1] = EditTags(pieces[-1])
+ value = "/".join(pieces)
elif key == "ro.build.description":
pieces = value.split(" ")
assert len(pieces) == 5