diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/releasetools/edify_generator.py | 11 | ||||
-rwxr-xr-x | tools/releasetools/ota_from_target_files.py | 40 | ||||
-rwxr-xr-x | tools/releasetools/sign_target_files_apks.py | 8 |
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 |