예제 #1
0
def BuildVBMeta():
    logger.info("Building vbmeta.img.")

    framework_dict = common.LoadDictionaryFromFile(
        os.path.join(OPTIONS.product_out_framework, "misc_info.txt"))
    vendor_dict = common.LoadDictionaryFromFile(
        os.path.join(OPTIONS.product_out_vendor, "misc_info.txt"))
    merged_dict = dict(vendor_dict)
    if OPTIONS.framework_misc_info_keys:
        for key in common.LoadListFromFile(OPTIONS.framework_misc_info_keys):
            merged_dict[key] = framework_dict[key]

    # Build vbmeta.img using partitions in product_out_vendor.
    partitions = {}
    for partition in common.AVB_PARTITIONS:
        partition_path = os.path.join(OPTIONS.product_out_vendor,
                                      "%s.img" % partition)
        if os.path.exists(partition_path):
            partitions[partition] = partition_path

    # vbmeta_partitions includes the partitions that should be included into
    # top-level vbmeta.img, which are the ones that are not included in any
    # chained VBMeta image plus the chained VBMeta images themselves.
    vbmeta_partitions = common.AVB_PARTITIONS[:]
    for partition in common.AVB_VBMETA_PARTITIONS:
        chained_partitions = merged_dict.get("avb_%s" % partition, "").strip()
        if chained_partitions:
            partitions[partition] = os.path.join(OPTIONS.product_out_vendor,
                                                 "%s.img" % partition)
            vbmeta_partitions = [
                item for item in vbmeta_partitions
                if item not in chained_partitions.split()
            ]
            vbmeta_partitions.append(partition)

    output_vbmeta_path = os.path.join(OPTIONS.product_out_vendor, "vbmeta.img")
    OPTIONS.info_dict = merged_dict
    common.BuildVBMeta(output_vbmeta_path, partitions, "vbmeta",
                       vbmeta_partitions)
def main():
    """The main function.

  Process command line arguments, then call merge_target_files to
  perform the heavy lifting.
  """

    common.InitLogging()

    def option_handler(o, a):
        if o == '--system-target-files':
            logger.warning(
                '--system-target-files has been renamed to --framework-target-files'
            )
            OPTIONS.framework_target_files = a
        elif o == '--framework-target-files':
            OPTIONS.framework_target_files = a
        elif o == '--system-item-list':
            logger.warning(
                '--system-item-list has been renamed to --framework-item-list')
            OPTIONS.framework_item_list = a
        elif o == '--framework-item-list':
            OPTIONS.framework_item_list = a
        elif o == '--system-misc-info-keys':
            logger.warning('--system-misc-info-keys has been renamed to '
                           '--framework-misc-info-keys')
            OPTIONS.framework_misc_info_keys = a
        elif o == '--framework-misc-info-keys':
            OPTIONS.framework_misc_info_keys = a
        elif o == '--other-target-files':
            logger.warning(
                '--other-target-files has been renamed to --vendor-target-files'
            )
            OPTIONS.vendor_target_files = a
        elif o == '--vendor-target-files':
            OPTIONS.vendor_target_files = a
        elif o == '--other-item-list':
            logger.warning(
                '--other-item-list has been renamed to --vendor-item-list')
            OPTIONS.vendor_item_list = a
        elif o == '--vendor-item-list':
            OPTIONS.vendor_item_list = a
        elif o == '--output-target-files':
            OPTIONS.output_target_files = a
        elif o == '--output-dir':
            OPTIONS.output_dir = a
        elif o == '--output-item-list':
            OPTIONS.output_item_list = a
        elif o == '--output-ota':
            OPTIONS.output_ota = a
        elif o == '--output-img':
            OPTIONS.output_img = a
        elif o == '--output-super-empty':
            OPTIONS.output_super_empty = a
        elif o == '--rebuild_recovery':
            OPTIONS.rebuild_recovery = True
        elif o == '--keep-tmp':
            OPTIONS.keep_tmp = True
        else:
            return False
        return True

    args = common.ParseOptions(sys.argv[1:],
                               __doc__,
                               extra_long_opts=[
                                   'system-target-files=',
                                   'framework-target-files=',
                                   'system-item-list=',
                                   'framework-item-list=',
                                   'system-misc-info-keys=',
                                   'framework-misc-info-keys=',
                                   'other-target-files=',
                                   'vendor-target-files=',
                                   'other-item-list=',
                                   'vendor-item-list=',
                                   'output-target-files=',
                                   'output-dir=',
                                   'output-item-list=',
                                   'output-ota=',
                                   'output-img=',
                                   'output-super-empty=',
                                   'rebuild_recovery',
                                   'keep-tmp',
                               ],
                               extra_option_handler=option_handler)

    # pylint: disable=too-many-boolean-expressions
    if (args or OPTIONS.framework_target_files is None
            or OPTIONS.vendor_target_files is None or
        (OPTIONS.output_target_files is None and OPTIONS.output_dir is None) or
        (OPTIONS.output_dir is not None and OPTIONS.output_item_list is None)):
        common.Usage(__doc__)
        sys.exit(1)

    # Always turn on verbose logging.
    OPTIONS.verbose = True

    if OPTIONS.framework_item_list:
        framework_item_list = common.LoadListFromFile(
            OPTIONS.framework_item_list)
    else:
        framework_item_list = DEFAULT_FRAMEWORK_ITEM_LIST

    if OPTIONS.framework_misc_info_keys:
        framework_misc_info_keys = common.LoadListFromFile(
            OPTIONS.framework_misc_info_keys)
    else:
        framework_misc_info_keys = DEFAULT_FRAMEWORK_MISC_INFO_KEYS

    if OPTIONS.vendor_item_list:
        vendor_item_list = common.LoadListFromFile(OPTIONS.vendor_item_list)
    else:
        vendor_item_list = DEFAULT_VENDOR_ITEM_LIST

    if OPTIONS.output_item_list:
        output_item_list = common.LoadListFromFile(OPTIONS.output_item_list)
    else:
        output_item_list = None

    if not validate_config_lists(
            framework_item_list=framework_item_list,
            framework_misc_info_keys=framework_misc_info_keys,
            vendor_item_list=vendor_item_list):
        sys.exit(1)

    call_func_with_temp_dir(
        lambda temp_dir: merge_target_files(
            temp_dir=temp_dir,
            framework_target_files=OPTIONS.framework_target_files,
            framework_item_list=framework_item_list,
            framework_misc_info_keys=framework_misc_info_keys,
            vendor_target_files=OPTIONS.vendor_target_files,
            vendor_item_list=vendor_item_list,
            output_target_files=OPTIONS.output_target_files,
            output_dir=OPTIONS.output_dir,
            output_item_list=output_item_list,
            output_ota=OPTIONS.output_ota,
            output_img=OPTIONS.output_img,
            output_super_empty=OPTIONS.output_super_empty,
            rebuild_recovery=OPTIONS.rebuild_recovery), OPTIONS.keep_tmp)