protected QualifiedContentImpl(@NonNull QualifiedContent qualifiedContent) { this.name = qualifiedContent.getName(); this.file = qualifiedContent.getFile(); this.contentTypes = qualifiedContent.getContentTypes(); this.scopes = qualifiedContent.getScopes(); }
private static void handleQualifiedContent( @NonNull ClassPath classPath, @NonNull QualifiedContent content, @Nullable List<String> baseFilter) { List<String> filter = baseFilter; if (!content.getContentTypes().contains(DefaultContentType.CLASSES)) { // if the content is not meant to contain classes, we ignore them // in case they are present. ImmutableList.Builder<String> builder = ImmutableList.builder(); if (filter != null) { builder.addAll(filter); } builder.add("!**.class"); filter = builder.build(); } else if (!content.getContentTypes().contains(DefaultContentType.RESOURCES)) { // if the content is not meant to contain resources, we ignore them // in case they are present (by accepting only classes.) filter = ImmutableList.of("**.class"); } inputJar(classPath, content.getFile(), filter); }
throw new UnsupportedOperationException("Unknown format readAll input " + input); File f = outputProvider.getContentLocation(input.getName(), input.getContentTypes(), input.getScopes(), format); if (!f.getParentFile().exists()) f.getParentFile().mkdirs(); return f.toPath();
/** * Tries to determine the output class file, for rewriting the given class file. * * <p>This will return {@link Optional#absent()} if the class is not part of the program to * shrink (e.g. comes from a platform JAR). */ @NonNull protected Optional<File> chooseOutputFile( @NonNull T klass, @NonNull File classFile, @NonNull Iterable<TransformInput> inputs, @NonNull TransformOutputProvider output) { String classFilePath = classFile.getAbsolutePath(); for (TransformInput input : inputs) { Iterable<QualifiedContent> directoriesAndJars = Iterables.concat(input.getDirectoryInputs(), input.getJarInputs()); for (QualifiedContent directoryOrJar : directoriesAndJars) { File file = directoryOrJar.getFile(); if (classFilePath.startsWith(file.getAbsolutePath())) { File outputDir = output.getContentLocation( FileUtils.getDirectoryNameForJar(file), directoryOrJar.getContentTypes(), directoryOrJar.getScopes(), Format.DIRECTORY); return Optional.of(new File(outputDir, mGraph.getClassName(klass) + ".class")); } } } return Optional.absent(); }
for (QualifiedContent qualifiedContent : Iterables.concat( input.getJarInputs(), input.getDirectoryInputs())) { if (qualifiedContent.getScopes().contains(Scope.PROJECT)) { QualifiedContent content = mainScope.get(0); if (content instanceof JarInput) { copyJarWithContentFilter(content.getFile(), mainClassLocation, patterns); } else { jarFolderToRootLocation(content.getFile(), patterns);
void addJarInput(@NonNull QualifiedContent jarInput) { jarInputs.put(jarInput.getFile(), jarInput); }
private ClassWalker.Visitor.Factory asFactory(AnnotationCollector collector) { return (incremental, content) -> { if (incremental && content instanceof JarInput) { JarInput j = (JarInput) content; if (j.getStatus() == Status.REMOVED) { graph.onJarRemoved(j.getName()); return null; } else if (j.getStatus() == Status.CHANGED) { graph.onJarRemoved(j.getName()); } } return new NamedVisitor(content.getName(), collector); }; }
@Nullable private static QualifiedContent findUniqueOrProjectContent( @NonNull List<QualifiedContent> contentSourceList) { if (contentSourceList.size() == 1) { return contentSourceList.get(0); } for (QualifiedContent content : contentSourceList) { if (content.getScopes().contains(Scope.PROJECT)) { return content; } } return null; }
@NonNull private File getOutputLocation( @NonNull TransformOutputProvider output, @NonNull QualifiedContent qualifiedContent, @NonNull File file) { // In InstantRun mode, all files are guaranteed to have a unique name due to the slicer // transform. adding sha1 to the name can lead to cleaning issues in device, it's much // easier if the slices always have the same names, irrespective of the current variant, // last version wins. String name = instantRunBuildContext.isInInstantRunMode() && (qualifiedContent.getScopes().contains(Scope.PROJECT) || qualifiedContent.getScopes().contains(Scope.SUB_PROJECTS)) ? getInstantRunFileName(file) : getFilename(file); File contentLocation = output.getContentLocation(name, TransformManager.CONTENT_DEX, qualifiedContent.getScopes(), multiDex ? Format.DIRECTORY : Format.JAR); if (multiDex) { FileUtils.mkdirs(contentLocation); } else { FileUtils.mkdirs(contentLocation.getParentFile()); } return contentLocation; }
@NonNull private File getPreDexFile( @NonNull TransformOutputProvider output, boolean needMerge, @Nullable File outFolder, @NonNull QualifiedContent qualifiedContent) { if (needMerge) { Preconditions.checkNotNull(outFolder); return new File(outFolder, getFilename(qualifiedContent.getFile())); } else { return getOutputLocation(output, qualifiedContent, qualifiedContent.getFile()); } }
private void mergeToRootLocation( @NonNull List<QualifiedContent> qualifiedContentList, @NonNull final List<Pattern> excludes) throws IOException { JarMerger jarMerger = new JarMerger(mainClassLocation); jarMerger.setFilter(archivePath -> checkEntry(excludes, archivePath)); for (QualifiedContent content : qualifiedContentList) { if (content instanceof JarInput) { jarMerger.addJar(content.getFile()); } else { jarMerger.addFolder(content.getFile()); } } jarMerger.close(); }