aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-08-29 17:06:53 +0000
committerGravatar Klaus Aehlig <aehlig@google.com>2016-08-30 08:32:45 +0000
commit5963ae7407f32cf25ebbe7e046f5bc5d0240aae3 (patch)
tree99a600b92832aaa12d52ee46b05ed1045ff60261 /src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java
parent012b06b0a89ae76e623f8844da3a787841da757c (diff)
Add a lightweight resource merge action.
Part 2 of the 3 new proposed android_library res processing actions. The primary and deps are all assumed to be parsed+summarized in a protobuf. Represent that with a new class (similar to DependencyAndroidData but w/out R.txt). Avoid having "manifest" artifacts as deps input, and instead use "label", since that is only used in a warning. DepAD still uses the manifest for #asSymbolFileProvider, so we keep it there. Move loading the primary out of the merge function so that we can share the merge function with this style of primary data, and the existing style of of primary data (UnvalidatedAndroidData). This produces an R class.jar and a zip file to pass along to a future validation action. Images are stubbed out since they are irrelevant to the validation action. -- MOS_MIGRATED_REVID=131604421
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java')
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java53
1 files changed, 35 insertions, 18 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java b/src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java
index f330b95f9e..d682144ef7 100644
--- a/src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java
+++ b/src/tools/android/java/com/google/devtools/build/android/AndroidDataMerger.java
@@ -52,12 +52,12 @@ public class AndroidDataMerger {
private final AndroidDataSerializer serializer;
- private final DependencyAndroidData dependency;
+ private final SerializedAndroidData dependency;
private final Builder targetBuilder;
private ParseDependencyDataTask(
- AndroidDataSerializer serializer, DependencyAndroidData dependency, Builder targetBuilder) {
+ AndroidDataSerializer serializer, SerializedAndroidData dependency, Builder targetBuilder) {
this.serializer = serializer;
this.dependency = dependency;
this.targetBuilder = targetBuilder;
@@ -72,11 +72,10 @@ public class AndroidDataMerger {
if (!e.isLegacy()) {
throw new MergingException(e);
}
- //TODO(corysmith): List the offending target here.
logger.fine(
String.format(
"\u001B[31mDEPRECATION:\u001B[0m Legacy resources used for %s",
- dependency.getManifest()));
+ dependency.getLabel()));
// Legacy android resources -- treat them as direct dependencies.
dependency.walk(ParsedAndroidDataBuildingPathWalker.create(parsedDataBuilder));
}
@@ -187,15 +186,17 @@ public class AndroidDataMerger {
}
/**
- * Merges a list of {@link DependencyAndroidData} with a {@link UnvalidatedAndroidData}.
+ * Loads a list of dependency {@link SerializedAndroidData} and merge with the primary {@link
+ * ParsedAndroidData}.
*
* @see AndroidDataMerger#merge(ParsedAndroidData, ParsedAndroidData, UnvalidatedAndroidData,
- * boolean) for details.
+ * boolean) for details.
*/
- UnwrittenMergedAndroidData merge(
- List<DependencyAndroidData> transitive,
- List<DependencyAndroidData> direct,
- UnvalidatedAndroidData primary,
+ UnwrittenMergedAndroidData loadAndMerge(
+ List<? extends SerializedAndroidData> transitive,
+ List<? extends SerializedAndroidData> direct,
+ ParsedAndroidData primary,
+ Path primaryManifest,
boolean allowPrimaryOverrideAll)
throws MergingException {
Stopwatch timer = Stopwatch.createStarted();
@@ -204,12 +205,12 @@ public class AndroidDataMerger {
final ParsedAndroidData.Builder transitiveBuilder = ParsedAndroidData.Builder.newBuilder();
final AndroidDataSerializer serializer = AndroidDataSerializer.create();
final List<ListenableFuture<Boolean>> tasks = new ArrayList<>();
- for (final DependencyAndroidData dependency : direct) {
+ for (final SerializedAndroidData dependency : direct) {
tasks.add(
executorService.submit(
new ParseDependencyDataTask(serializer, dependency, directBuilder)));
}
- for (final DependencyAndroidData dependency : transitive) {
+ for (final SerializedAndroidData dependency : transitive) {
tasks.add(
executorService.submit(
new ParseDependencyDataTask(serializer, dependency, transitiveBuilder)));
@@ -222,8 +223,12 @@ public class AndroidDataMerger {
logger.fine(
String.format("Merged dependencies read in %sms", timer.elapsed(TimeUnit.MILLISECONDS)));
timer.reset().start();
- return merge(
- transitiveBuilder.build(), directBuilder.build(), primary, allowPrimaryOverrideAll);
+ return doMerge(
+ transitiveBuilder.build(),
+ directBuilder.build(),
+ primary,
+ primaryManifest,
+ allowPrimaryOverrideAll);
} finally {
logger.fine(String.format("Resources merged in %sms", timer.elapsed(TimeUnit.MILLISECONDS)));
}
@@ -288,7 +293,7 @@ public class AndroidDataMerger {
* @return An UnwrittenMergedAndroidData, containing DataResource objects that can be written to
* disk for aapt processing or serialized for future merge passes.
* @throws MergingException if there are merge conflicts or issues with parsing resources from
- * Primary.
+ * primaryData.
*/
UnwrittenMergedAndroidData merge(
ParsedAndroidData transitive,
@@ -296,18 +301,30 @@ public class AndroidDataMerger {
UnvalidatedAndroidData primaryData,
boolean allowPrimaryOverrideAll)
throws MergingException {
-
try {
// Extract the primary resources.
ParsedAndroidData parsedPrimary = ParsedAndroidData.from(primaryData);
+ return doMerge(
+ transitive, direct, parsedPrimary, primaryData.getManifest(), allowPrimaryOverrideAll);
+ } catch (IOException e) {
+ throw new MergingException(e);
+ }
+ }
+ private UnwrittenMergedAndroidData doMerge(
+ ParsedAndroidData transitive,
+ ParsedAndroidData direct,
+ ParsedAndroidData parsedPrimary,
+ Path primaryManifest,
+ boolean allowPrimaryOverrideAll)
+ throws MergingException {
+ try {
// Create the builders for the final parsed data.
final ParsedAndroidData.Builder primaryBuilder = ParsedAndroidData.Builder.newBuilder();
final ParsedAndroidData.Builder transitiveBuilder = ParsedAndroidData.Builder.newBuilder();
final KeyValueConsumers transitiveConsumers = transitiveBuilder.consumers();
final KeyValueConsumers primaryConsumers = primaryBuilder.consumers();
-
final Set<MergeConflict> conflicts = new HashSet<>();
conflicts.addAll(parsedPrimary.conflicts());
for (MergeConflict conflict : Iterables.concat(direct.conflicts(), transitive.conflicts())) {
@@ -420,7 +437,7 @@ public class AndroidDataMerger {
}
return UnwrittenMergedAndroidData.of(
- primaryData.getManifest(),
+ primaryManifest,
primaryBuilder.build(),
transitiveBuilder.build());
} catch (IOException e) {