예제 #1
0
def main(argv):
    bootable_only = [False]

    def option_handler(o, a):
        if o in ("-z", "--bootable_zip"):
            bootable_only[0] = True
        else:
            return False
        return True

    args = common.ParseOptions(argv,
                               __doc__,
                               extra_opts="z",
                               extra_long_opts=["bootable_zip"],
                               extra_option_handler=option_handler)

    bootable_only = bootable_only[0]

    if len(args) != 2:
        common.Usage(__doc__)
        sys.exit(1)

    OPTIONS.input_tmp, input_zip = common.UnzipTemp(args[0])
    output_zip = zipfile.ZipFile(args[1],
                                 "w",
                                 compression=zipfile.ZIP_DEFLATED,
                                 allowZip64=True)
    CopyInfo(output_zip)

    try:
        done = False
        images_path = os.path.join(OPTIONS.input_tmp, "IMAGES")
        if os.path.exists(images_path):
            # If this is a new target-files, it already contains the images,
            # and all we have to do is copy them to the output zip.
            images = os.listdir(images_path)
            if images:
                for i in images:
                    if bootable_only and i not in ("boot.img", "recovery.img"):
                        continue
                    if not i.endswith(".img"): continue
                    with open(os.path.join(images_path, i), "r") as f:
                        common.ZipWriteStr(output_zip, i, f.read())
                done = True

        if not done:
            # We have an old target-files that doesn't already contain the
            # images, so build them.
            import add_img_to_target_files

            OPTIONS.info_dict = common.LoadInfoDict(input_zip)

            # If this image was originally labelled with SELinux contexts,
            # make sure we also apply the labels in our new image. During
            # building, the "file_contexts" is in the out/ directory tree,
            # but for repacking from target-files.zip it's in the root
            # directory of the ramdisk.
            if "selinux_fc" in OPTIONS.info_dict:
                OPTIONS.info_dict["selinux_fc"] = os.path.join(
                    OPTIONS.input_tmp, "BOOT", "RAMDISK", "file_contexts")

            boot_image = common.GetBootableImage("boot.img", "boot.img",
                                                 OPTIONS.input_tmp, "BOOT")
            if boot_image:
                boot_image.AddToZip(output_zip)
            recovery_image = common.GetBootableImage("recovery.img",
                                                     "recovery.img",
                                                     OPTIONS.input_tmp,
                                                     "RECOVERY")
            if recovery_image:
                recovery_image.AddToZip(output_zip)

            def banner(s):
                print "\n\n++++ " + s + " ++++\n\n"

            if not bootable_only:
                banner("AddSystem")
                add_img_to_target_files.AddSystem(output_zip, prefix="")
                try:
                    input_zip.getinfo("VENDOR/")
                    banner("AddVendor")
                    add_img_to_target_files.AddVendor(output_zip, prefix="")
                except KeyError:
                    pass  # no vendor partition for this device
                try:
                    input_zip.getinfo("CUSTOM/")
                    banner("AddCustom")
                    add_img_to_target_files.AddCustom(output_zip, prefix="")
                except KeyError:
                    pass  # no custom partition for this device
                banner("AddUserdata")
                add_img_to_target_files.AddUserdata(output_zip, prefix="")
                banner("AddCache")
                add_img_to_target_files.AddCache(output_zip, prefix="")

    finally:
        print "cleaning up..."
        output_zip.close()
        shutil.rmtree(OPTIONS.input_tmp)

    print "done."
예제 #2
0
def main(argv):
    bootable_only = [False]

    def option_handler(o, _):
        if o in ("-z", "--bootable_zip"):
            bootable_only[0] = True
        else:
            return False
        return True

    args = common.ParseOptions(argv,
                               __doc__,
                               extra_opts="z",
                               extra_long_opts=["bootable_zip"],
                               extra_option_handler=option_handler)

    bootable_only = bootable_only[0]

    if len(args) != 2:
        common.Usage(__doc__)
        sys.exit(1)

    OPTIONS.input_tmp, input_zip = common.UnzipTemp(args[0])
    output_zip = zipfile.ZipFile(args[1],
                                 "w",
                                 compression=zipfile.ZIP_DEFLATED)
    CopyInfo(output_zip)
    AddRadio(output_zip)

    try:
        done = False
        images_path = os.path.join(OPTIONS.input_tmp, "IMAGES")
        if os.path.exists(images_path):
            # If this is a new target-files, it already contains the images,
            # and all we have to do is copy them to the output zip.
            # Skip oem.img files since they are not needed in fastboot images.
            images = os.listdir(images_path)
            if images:
                for image in images:
                    if bootable_only and image not in ("boot.img",
                                                       "recovery.img"):
                        continue
                    if not image.endswith(".img"):
                        continue
                    if image == "oem.img" or image == "recovery-two-step.img":
                        continue
                    common.ZipWrite(output_zip,
                                    os.path.join(images_path, image), image)
                done = True

        if not done:
            # We have an old target-files that doesn't already contain the
            # images, so build them.
            import add_img_to_target_files

            OPTIONS.info_dict = common.LoadInfoDict(input_zip,
                                                    OPTIONS.input_tmp)

            boot_image = common.GetBootableImage("boot.img", "boot.img",
                                                 OPTIONS.input_tmp, "BOOT")
            if boot_image:
                boot_image.AddToZip(output_zip)

            if OPTIONS.info_dict.get("no_recovery") != "true":
                recovery_image = common.GetBootableImage(
                    "recovery.img", "recovery.img", OPTIONS.input_tmp,
                    "RECOVERY")
                if recovery_image:
                    recovery_image.AddToZip(output_zip)

            def banner(s):
                print("\n\n++++ " + s + " ++++\n\n")

            if not bootable_only:
                banner("AddSystem")
                add_img_to_target_files.AddSystem(output_zip, prefix="")
                try:
                    input_zip.getinfo("VENDOR/")
                    banner("AddVendor")
                    add_img_to_target_files.AddVendor(output_zip, prefix="")
                except KeyError:
                    pass  # no vendor partition for this device
                banner("AddUserdata")
                add_img_to_target_files.AddUserdata(output_zip, prefix="")
                banner("AddUserdataExtra")
                add_img_to_target_files.AddUserdataExtra(output_zip, prefix="")
                banner("AddCache")
                add_img_to_target_files.AddCache(output_zip, prefix="")

    finally:
        print("cleaning up...")
        common.ZipClose(output_zip)
        shutil.rmtree(OPTIONS.input_tmp)

    print("done.")
예제 #3
0
      if not bootable_only:
        banner("AddSystem")
        add_img_to_target_files.AddSystem(output_zip, prefix="")
        try:
          input_zip.getinfo("VENDOR/")
          banner("AddVendor")
          add_img_to_target_files.AddVendor(output_zip, prefix="")
        except KeyError:
          pass   # no vendor partition for this device
        banner("AddUserdata")
        add_img_to_target_files.AddUserdata(output_zip, prefix="")
        banner("AddUserdataExtra")
        add_img_to_target_files.AddUserdataExtra(output_zip, prefix="")
        banner("AddCache")
        add_img_to_target_files.AddCache(output_zip, prefix="")

  finally:
    print("cleaning up...")
    common.ZipClose(output_zip)
    shutil.rmtree(OPTIONS.input_tmp)

  print("done.")


if __name__ == '__main__':
  try:
    common.CloseInheritedPipes()
    main(sys.argv[1:])
  except common.ExternalError as e:
    print()