Beispiel #1
0
  def _filter_unpacked_dir(self, target, unpacked_dir, class_files):
    # The Dx tool returns failure if more than one copy of a class is packed into the dex file and
    # it is easy to fetch duplicate libraries (as well as conflicting versions) from the SDK repos.
    # This filters the contents of the unpacked_dir against the include/exclude patterns of the
    # target, then compares the filtered files against previously gathered class_files to
    # dedupe and detect version conflicts.

    file_filter = UnpackJars.get_unpack_filter(target)
    for root, _, file_names in os.walk(unpacked_dir):
      for filename in file_names:
        # Calculate the filename relative to the unpacked_dir and then filter.
        relative_dir = os.path.relpath(root, unpacked_dir)
        class_file = os.path.join(relative_dir, filename)
        if file_filter(class_file):
          class_location = os.path.join(root, filename)

          # If the class_file (e.g. 'a/b/c/Hello.class') has already been added, then compare the
          # full path. If the full path is identical then we can ignore it as a duplicate. If
          # the path is different, that means that there is probably conflicting version
          # numbers amongst the library deps and so we raise an exception.
          if class_file in class_files:
            if class_files[class_file] != class_location:
              raise TaskError("Dependency:\n{}\n\nConflicts\n1: {} "
                              "\n2: {}".format(target, class_location, class_files[class_file]))
          class_files[class_file] = class_location
    return class_files.values()