/** * Resolves a given list of libraries, finds out if they depend on other libraries, and * returns a flat list of all the direct and indirect dependencies in the proper order (first * is higher priority when calling aapt). * @param directDependencies the libraries to resolve * @param outFlatDependencies where to store all the libraries. */ @VisibleForTesting static void resolveIndirectLibraryDependencies(List<LibraryDependency> directDependencies, List<LibraryDependency> outFlatDependencies) { if (directDependencies == null) { return; } // loop in the inverse order to resolve dependencies on the libraries, so that if a library // is required by two higher level libraries it can be inserted in the correct place for (int i = directDependencies.size() - 1 ; i >= 0 ; i--) { LibraryDependency library = directDependencies.get(i); // get its libraries Collection<LibraryDependency> dependencies = library.getDependencies(); List<LibraryDependency> depList = Lists.newArrayList(dependencies); // resolve the dependencies for those libraries resolveIndirectLibraryDependencies(depList, outFlatDependencies); // and add the current one (if needed) in front (higher priority) if (!outFlatDependencies.contains(library)) { outFlatDependencies.add(0, library); } } }
@NonNull public static List<ManifestDependencyImpl> getManifestDependencies( List<LibraryDependency> libraries) { List<ManifestDependencyImpl> list = Lists.newArrayListWithCapacity(libraries.size()); for (LibraryDependency lib : libraries) { // get the dependencies List<ManifestDependencyImpl> children = getManifestDependencies(lib.getDependencies()); list.add(new ManifestDependencyImpl(lib.getName(), lib.getManifest(), children)); } return list; }
@NonNull private static List<ManifestDependencyImpl> getManifestDependencies( List<LibraryDependency> libraries) { List<ManifestDependencyImpl> list = Lists.newArrayListWithCapacity(libraries.size()); for (LibraryDependency lib : libraries) { // get the dependencies List<ManifestDependencyImpl> children = getManifestDependencies(lib.getDependencies()); list.add(new ManifestDependencyImpl(lib.getName(), lib.getManifest(), children)); } return list; }
private void render(final LibraryDependency lib, boolean lastChild) { renderer.visit(new Action<StyledTextOutput>() { @Override public void execute(StyledTextOutput styledTextOutput) { getTextOutput().text(((LibraryBundle)lib).getName()); } }, lastChild); renderChildren(lib.getDependencies(), lib.getLocalDependencies()); }
@NonNull private static AndroidLibrary convertAndroidLibrary( @NonNull LibraryDependency libraryDependency) { List<LibraryDependency> deps = libraryDependency.getDependencies(); List<AndroidLibrary> clonedDeps = Lists.newArrayListWithCapacity(deps.size()); for (LibraryDependency child : deps) { AndroidLibrary clonedLib = sCache.get(child); if (clonedLib != null) { clonedDeps.add(clonedLib); } } // compute local jar even if the bundle isn't exploded. Collection<File> localJarOverride = findLocalJar(libraryDependency); return new AndroidLibraryImpl( libraryDependency, clonedDeps, localJarOverride, libraryDependency.getProject(), libraryDependency.getProjectVariant(), libraryDependency.getRequestedCoordinates(), libraryDependency.getResolvedCoordinates()); }