Java源码示例:com.android.ide.common.res2.ResourceSet
示例1
@NonNull
private List<ResourceSet> getConfiguredResourceSets() {
List<ResourceSet> resourceSets = Lists.newArrayList(getInputResourceSets());
List<ResourceSet> generatedSets = Lists.newArrayListWithCapacity(resourceSets.size());
for (ResourceSet resourceSet : resourceSets) {
resourceSet.setNormalizeResources(normalizeResources);
resourceSet.setPreprocessor(preprocessor);
ResourceSet generatedSet = new GeneratedResourceSet(resourceSet);
resourceSet.setGeneratedSet(generatedSet);
generatedSets.add(generatedSet);
}
// Put all generated sets at the start of the list.
resourceSets.addAll(0, generatedSets);
return resourceSets;
}
示例2
/**
* Discover all sub-folders of all the {@link ResourceSet#getSourceFiles()} which names are
* starting with one of the provided prefixes.
*
* @param resourceSets the list of sources {@link ResourceSet}
* @param prefixes the list of prefixes to look for folders.
* @return a possibly empty list of folders.
*/
@NonNull
private static List<String> getAllFilters(List<ResourceSet> resourceSets, String... prefixes) {
List<String> providedResFolders = new ArrayList<String>();
for (ResourceSet resourceSet : resourceSets) {
for (File resFolder : resourceSet.getSourceFiles()) {
File[] subResFolders = resFolder.listFiles();
if (subResFolders != null) {
for (File subResFolder : subResFolders) {
for (String prefix : prefixes) {
if (subResFolder.getName().startsWith(prefix)) {
providedResFolders
.add(subResFolder.getName().substring(prefix.length()));
}
}
}
}
}
}
return providedResFolders;
}
示例3
/**
* Merges the resources from all of the dependent AAR libraries into the main resource bundle for
* the compiling app.
*
* @param outputDir the output directory to write the R.java files.
* @param mainResDir the resource directory where the resource descriptors for the app reside.
* @param cruncher configured PNG cruncher utility for reducing the size of PNG assets.
* @return true if the merge was successful, otherwise false.
*/
public boolean mergeResources(File outputDir, File mainResDir, PngCruncher cruncher) {
List<ResourceSet> resourceSets = getResourceSets();
ResourceSet mainResSet = new ResourceSet("main");
mainResSet.addSource(mainResDir);
resourceSets.add(mainResSet);
ResourceMerger merger = new ResourceMerger();
try {
for (ResourceSet resourceSet : resourceSets) {
resourceSet.loadFromFiles(LOG);
merger.addDataSet(resourceSet);
}
MergedResourceWriter writer = new MergedResourceWriter(outputDir, cruncher, false, false, null);
writer.setInsertSourceMarkers(true);
merger.mergeData(writer, false);
return true;
} catch(MergingException e) {
e.printStackTrace();
return false;
}
}
示例4
@Override
public StepExecutionResult execute(ExecutionContext context) {
ResourceMerger merger = new ResourceMerger(1);
try {
for (Path resPath : getResPaths()) {
ResourceSet set = new ResourceSet(resPath.toString(), true);
set.setDontNormalizeQualifiers(true);
set.addSource(resPath.toFile());
set.loadFromFiles(new ResourcesSetLoadLogger(context.getBuckEventBus()));
merger.addDataSet(set);
}
MergedResourceWriter writer =
MergedResourceWriter.createWriterWithoutPngCruncher(
getOutFolderPath().toFile(),
null /*publicFile*/,
null /*blameLogFolder*/,
new NoOpResourcePreprocessor(),
getTmpFolderPath().toFile());
merger.mergeData(writer, /* cleanUp */ false);
} catch (MergingException e) {
LOG.error(e, "Failed merging resources.");
return StepExecutionResults.ERROR;
}
return StepExecutionResults.SUCCESS;
}
示例5
private List<ResourceSet> getConfiguredResourceSets(ResourcePreprocessor preprocessor) {
// it is possible that this get called twice in case the incremental run fails and reverts
// back to full task run. Because the cached ResourceList is modified we don't want
// to recompute this twice (plus, why recompute it twice anyway?)
if (processedInputs == null) {
processedInputs = computeResourceSetList();
List<ResourceSet> generatedSets = Lists.newArrayListWithCapacity(processedInputs.size());
for (ResourceSet resourceSet : processedInputs) {
resourceSet.setPreprocessor(preprocessor);
ResourceSet generatedSet = new GeneratedResourceSet(resourceSet);
resourceSet.setGeneratedSet(generatedSet);
generatedSets.add(generatedSet);
}
// We want to keep the order of the inputs. Given inputs:
// (A, B, C, D)
// We want to get:
// (A-generated, A, B-generated, B, C-generated, C, D-generated, D).
// Therefore, when later in {@link DataMerger} we look for sources going through the
// list backwards, B-generated will take priority over A (but not B).
// A real life use-case would be if an app module generated resource overrode a library
// module generated resource (existing not in generated but bundled dir at this stage):
// (lib, app debug, app main)
// We will get:
// (lib generated, lib, app debug generated, app debug, app main generated, app main)
for (int i = 0; i < generatedSets.size(); ++i) {
processedInputs.add(2 * i, generatedSets.get(i));
}
}
return processedInputs;
}
示例6
@Override
protected void doFullTaskAction() throws IOException {
// this is full run, clean the previous output
File destinationDir = getOutputDir();
FileUtils.emptyFolder(destinationDir);
List<ResourceSet> resourceSets = getConfiguredResourceSets();
// create a new merger and populate it with the sets.
ResourceMerger merger = new ResourceMerger();
try {
for (ResourceSet resourceSet : resourceSets) {
resourceSet.loadFromFiles(getILogger());
merger.addDataSet(resourceSet);
}
// get the merged set and write it down.
MergedResourceWriter writer = new MergedResourceWriter(
destinationDir, getCruncher(),
getCrunchPng(), getProcess9Patch(), getPublicFile(), preprocessor);
writer.setInsertSourceMarkers(getInsertSourceMarkers());
merger.mergeData(writer, false /*doCleanUp*/);
// No exception? Write the known state.
merger.writeBlobTo(getIncrementalFolder(), writer);
throw new StopExecutionException("Stop for now.");
} catch (MergingException e) {
System.out.println(e.getMessage());
merger.cleanBlob(getIncrementalFolder());
throw new ResourceException(e.getMessage(), e);
}
}
示例7
/**
* Gets the list of filter values for a filter type either from the user specified build.gradle
* settings or through a discovery mechanism using folders names.
*
* @param resourceSets the list of source folders to discover from.
* @param filterType the filter type
* @param splits the variant's configuration for splits.
* @return a possibly empty list of filter value for this filter type.
*/
@NonNull
private static Set<String> getFilters(
@NonNull List<ResourceSet> resourceSets,
@NonNull DiscoverableFilterType filterType,
@NonNull Splits splits) {
Set<String> filtersList = new HashSet<String>();
if (filterType.isAuto(splits)) {
filtersList.addAll(getAllFilters(resourceSets, filterType.folderPrefix));
} else {
filtersList.addAll(filterType.getConfiguredFilters(splits));
}
return filtersList;
}
示例8
@NonNull
public List<String> discoverListOfResourceConfigs() {
List<String> resFoldersOnDisk = new ArrayList<String>();
List<ResourceSet> resourceSets = variantConfiguration.getResourceSets(
getGeneratedResFolders(), false /* no libraries resources */);
resFoldersOnDisk.addAll(getAllFilters(
resourceSets,
DiscoverableFilterType.LANGUAGE.folderPrefix,
DiscoverableFilterType.DENSITY.folderPrefix));
return resFoldersOnDisk;
}
示例9
/**
* Gets a list of resource sets loaded from the AAR libraries in the collection. Note that this
* is computed on every call (results are not cached), so it is recommended that the caller only
* call this after all AAR libraries of interest have been added.
* @return the list of all resource sets available across the AAR libraries.
*/
private List<ResourceSet> getResourceSets() {
List<ResourceSet> resourceSets = new ArrayList<>();
for (AARLibrary library : this) {
if (library.getResDirectory() != null) {
ResourceSet resourceSet = new ResourceSet(library.getDirectory().getName());
resourceSet.addSource(library.getResDirectory());
resourceSets.add(resourceSet);
}
}
return resourceSets;
}
示例10
@Override
protected void doFullTaskAction() throws IOException {
ResourcePreprocessor preprocessor = getPreprocessor();
// this is full run, clean the previous output
File destinationDir = getOutputDir();
FileUtils.cleanOutputDir(destinationDir);
List<ResourceSet> resourceSets = getConfiguredResourceSets(preprocessor);
// create a new merger and populate it with the sets.
ResourceMerger merger = new ResourceMerger(minSdk);
MergingLog mergingLog =
getBlameLogFolder() != null ? new MergingLog(getBlameLogFolder()) : null;
try (QueueableResourceCompiler resourceCompiler =
processResources
? makeAapt(
buildToolInfo.get(),
aaptGeneration,
getBuilder(),
crunchPng,
mergingLog)
: QueueableResourceCompiler.NONE) {
for (ResourceSet resourceSet : resourceSets) {
resourceSet.loadFromFiles(getILogger());
merger.addDataSet(resourceSet);
}
MergedResourceWriter writer =
new MergedResourceWriter(
workerExecutorFacade,
destinationDir,
getPublicFile(),
mergingLog,
preprocessor,
resourceCompiler,
getIncrementalFolder(),
null,
null,
false,
getCrunchPng());
merger.mergeData(writer, false /*doCleanUp*/);
// No exception? Write the known state.
merger.writeBlobTo(getIncrementalFolder(), writer, false);
} catch (MergingException e) {
System.out.println(e.getMessage());
merger.cleanBlob(getIncrementalFolder());
throw new ResourceException(e.getMessage(), e);
} finally {
cleanup();
}
}
示例11
@Override
protected void doIncrementalTaskAction(Map<File, FileStatus> changedInputs)
throws IOException {
ResourcePreprocessor preprocessor = getPreprocessor();
// create a merger and load the known state.
ResourceMerger merger = new ResourceMerger(minSdk);
try {
if (!merger.loadFromBlob(getIncrementalFolder(), true /*incrementalState*/)) {
doFullTaskAction();
return;
}
for (ResourceSet resourceSet : merger.getDataSets()) {
resourceSet.setPreprocessor(preprocessor);
}
List<ResourceSet> resourceSets = getConfiguredResourceSets(preprocessor);
// compare the known state to the current sets to detect incompatibility.
// This is in case there's a change that's too hard to do incrementally. In this case
// we'll simply revert to full build.
if (!merger.checkValidUpdate(resourceSets)) {
getLogger().info("Changed Resource sets: full task run!");
doFullTaskAction();
return;
}
// The incremental process is the following:
// Loop on all the changed files, find which ResourceSet it belongs to, then ask
// the resource set to update itself with the new file.
for (Map.Entry<File, FileStatus> entry : changedInputs.entrySet()) {
File changedFile = entry.getKey();
merger.findDataSetContaining(changedFile, fileValidity);
if (fileValidity.getStatus() == FileValidity.FileStatus.UNKNOWN_FILE) {
doFullTaskAction();
return;
} else if (fileValidity.getStatus() == FileValidity.FileStatus.VALID_FILE) {
if (!fileValidity.getDataSet().updateWith(
fileValidity.getSourceFile(), changedFile, entry.getValue(),
getILogger())) {
getLogger().info(
String.format("Failed to process %s event! Full task run",
entry.getValue()));
doFullTaskAction();
return;
}
}
}
MergingLog mergingLog =
getBlameLogFolder() != null ? new MergingLog(getBlameLogFolder()) : null;
try (QueueableResourceCompiler resourceCompiler =
processResources
? makeAapt(
buildToolInfo.get(),
aaptGeneration,
getBuilder(),
crunchPng,
mergingLog)
: QueueableResourceCompiler.NONE) {
MergedResourceWriter writer =
new MergedResourceWriter(
workerExecutorFacade,
getOutputDir(),
getPublicFile(),
mergingLog,
preprocessor,
resourceCompiler,
getIncrementalFolder(),
null,
null,
false,
getCrunchPng());
merger.mergeData(writer, false /*doCleanUp*/);
// No exception? Write the known state.
merger.writeBlobTo(getIncrementalFolder(), writer, false);
}
} catch (MergingException e) {
merger.cleanBlob(getIncrementalFolder());
throw new ResourceException(e.getMessage(), e);
} finally {
cleanup();
}
}
示例12
/**
* Compute the list of resource set to be used during execution based all the inputs.
*/
List<ResourceSet> computeResourceSetList() {
List<ResourceSet> sourceFolderSets = resSetSupplier.get();
int size = sourceFolderSets.size() + 4;
if (libraries != null) {
size += libraries.getArtifacts().size();
}
List<ResourceSet> resourceSetList = Lists.newArrayListWithExpectedSize(size);
// add at the beginning since the libraries are less important than the folder based
// resource sets.
// get the dependencies first
if (libraries != null) {
Set<ResolvedArtifactResult> libArtifacts = libraries.getArtifacts();
// the order of the artifact is descending order, so we need to reverse it.
for (ResolvedArtifactResult artifact : libArtifacts) {
ResourceSet resourceSet =
new ResourceSet(
MergeManifests.getArtifactName(artifact),
null,
null,
validateEnabled);
resourceSet.setFromDependency(true);
resourceSet.addSource(artifact.getFile());
// add to 0 always, since we need to reverse the order.
resourceSetList.add(0,resourceSet);
}
}
// add the folder based next
resourceSetList.addAll(sourceFolderSets);
// We add the generated folders to the main set
List<File> generatedResFolders = Lists.newArrayList();
generatedResFolders.addAll(renderscriptResOutputDir.getFiles());
generatedResFolders.addAll(generatedResOutputDir.getFiles());
// add the generated files to the main set.
final ResourceSet mainResourceSet = sourceFolderSets.get(0);
assert mainResourceSet.getConfigName().equals(BuilderConstants.MAIN);
mainResourceSet.addSources(generatedResFolders);
return resourceSetList;
}
示例13
@Override
public void execute(MergeResources mergeResourcesTask) {
final Project project = androidExtension.getProject();
mergeResourcesTask.setMinSdk(Integer.parseInt(androidExtension.getMinSdkVersion()));
mergeResourcesTask.buildToolInfo = () -> BuildToolInfo.fromStandardDirectoryLayout(
androidExtension.getBuildToolsRevision(), androidExtension.getBuildToolsDir());
mergeResourcesTask.aaptGeneration = AaptGeneration.AAPT_V1;
mergeResourcesTask.setAndroidBuilder(androidExtension.getAndroidBuilder());
mergeResourcesTask.fileCache = androidExtension.getBuildCache();
mergeResourcesTask.setVariantName("jfx");
mergeResourcesTask.setIncrementalFolder(androidExtension.getIncrementalDirectory(getName()));
// Libraries use this task twice, once for compilation (with dependencies),
// where blame is useful, and once for packaging where it is not.
if (includeDependencies) {
mergeResourcesTask.setBlameLogFolder(androidExtension.getResourceBlameLogDirectory());
}
mergeResourcesTask.processResources = processResources;
mergeResourcesTask.crunchPng = true;
final boolean validateEnabled = true;
mergeResourcesTask.setValidateEnabled(validateEnabled);
// if (includeDependencies) {
// mergeResourcesTask.libraries = scope.getArtifactCollection(
// RUNTIME_CLASSPATH, ALL, ANDROID_RES);
// }
mergeResourcesTask.resSetSupplier =
() -> {
ResourceSet mainResourceSet = new ResourceSet(BuilderConstants.MAIN, null, null, validateEnabled);
mainResourceSet.addSource(project.file(androidExtension.getResDirectory()));
return Collections.singletonList(mainResourceSet);
};
mergeResourcesTask.sourceFolderInputs =
TaskInputHelper.bypassFileSupplier(
() -> Collections.singletonList(project.file(androidExtension.getResDirectory())));
mergeResourcesTask.renderscriptResOutputDir = project.files(androidExtension.getRenderscriptResOutputDirectory());
mergeResourcesTask.generatedResOutputDir = project.files(androidExtension.getGeneratedResOutputDirectory());
mergeResourcesTask.setOutputDir(outputLocation);
mergeResourcesTask.setGeneratedPngsOutputDir(androidExtension.getGeneratedPngsOutputDirectory());
}
示例14
public List<ResourceSet> getInputResourceSets() {
return inputResourceSets;
}
示例15
public void setInputResourceSets(
List<ResourceSet> inputResourceSets) {
this.inputResourceSets = inputResourceSets;
}
示例16
@Override
public void execute(MergeResources mergeResourcesTask) {
final BaseVariantData<? extends BaseVariantOutputData> variantData =
scope.getVariantData();
final AndroidConfig extension = scope.getGlobalScope().getExtension();
mergeResourcesTask.setAndroidBuilder(scope.getGlobalScope().getAndroidBuilder());
mergeResourcesTask.setVariantName(scope.getVariantConfiguration().getFullName());
mergeResourcesTask.setIncrementalFolder(new File(
scope.getGlobalScope().getBuildDir() + "/" + AndroidProject.FD_INTERMEDIATES +
"/incremental/" + taskNamePrefix + "Resources/" +
variantData.getVariantConfiguration().getDirName()));
mergeResourcesTask.process9Patch = process9Patch;
mergeResourcesTask.crunchPng = extension.getAaptOptions()
.getCruncherEnabled();
mergeResourcesTask.normalizeResources =
extension.getBuildToolsRevision()
.compareTo(NORMALIZE_RESOURCES_BUILD_TOOLS) < 0;
// Only one pre-processor for now. The code will need slight changes when we add more.
mergeResourcesTask.preprocessor = new VectorDrawableRenderer(
scope.getGeneratedPngsOutputDir(),
extension.getPreprocessingOptions().getTypedDensities(),
mergeResourcesTask.getILogger());
ConventionMappingHelper.map(mergeResourcesTask, "useNewCruncher",
new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
return extension.getAaptOptions()
.getUseNewCruncher();
}
});
ConventionMappingHelper.map(mergeResourcesTask, "inputResourceSets",
new Callable<List<ResourceSet>>() {
@Override
public List<ResourceSet> call() throws Exception {
List<File> generatedResFolders = Lists.newArrayList(
scope.getGeneratedResOutputDir());
if (variantData.getExtraGeneratedResFolders() != null) {
generatedResFolders.addAll(
variantData.getExtraGeneratedResFolders());
}
return variantData.getVariantConfiguration()
.getResourceSets(generatedResFolders, includeDependencies);
}
});
ConventionMappingHelper.map(mergeResourcesTask, "outputDir", new Callable<File>() {
@Override
public File call() throws Exception {
return outputLocation != null ? outputLocation
: scope.getDefaultMergeResourcesOutputDir();
}
});
variantData.mergeResourcesTask = mergeResourcesTask;
}
示例17
/**
* Calculates the filters for this variant. The filters can either be manually specified by
* the user within the build.gradle or can be automatically discovered using the variant
* specific folders.
* <p>
* This method must be called before {@link #getFilters(OutputFile.FilterType)}.
*
* @param splits the splits configuration from the build.gradle.
*/
public void calculateFilters(Splits splits) {
List<ResourceSet> resourceSets = variantConfiguration
.getResourceSets(getGeneratedResFolders(), false);
densityFilters = getFilters(resourceSets, DiscoverableFilterType.DENSITY, splits);
languageFilters = getFilters(resourceSets, DiscoverableFilterType.LANGUAGE, splits);
}