diff options
Diffstat (limited to 'src/tools/android/java/com/google')
4 files changed, 67 insertions, 30 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/AndroidManifestProcessor.java b/src/tools/android/java/com/google/devtools/build/android/AndroidManifestProcessor.java index 49020a4563..93364a6fd7 100644 --- a/src/tools/android/java/com/google/devtools/build/android/AndroidManifestProcessor.java +++ b/src/tools/android/java/com/google/devtools/build/android/AndroidManifestProcessor.java @@ -71,6 +71,20 @@ public class AndroidManifestProcessor { } }); + /** Exception encapsulating the error report of a manifest merge operation. */ + public static final class MergeErrorException extends Exception { + private final MergingReport report; + + private MergeErrorException(MergingReport report) { + super(report.getReportString()); + this.report = report; + } + + public MergingReport getMergingReport() { + return report; + } + } + /** Creates a new processor with the appropriate logger. */ public static AndroidManifestProcessor with(StdLogger stdLogger) { return new AndroidManifestProcessor(stdLogger); @@ -95,7 +109,7 @@ public class AndroidManifestProcessor { * @param logFile The path to write the merger log to. * @return The path of the resultant manifest, either {@code output}, or {@code manifest} if no * merging was required. - * @throws IOException if there was a problem writing the merged manifest. + * @throws MergeErrorException if a merge error was encountered during merging. */ // TODO(corysmith): Extract manifest processing. public Path mergeManifest( @@ -104,8 +118,7 @@ public class AndroidManifestProcessor { MergeType mergeType, Map<String, String> values, Path output, - Path logFile) - throws IOException { + Path logFile) throws MergeErrorException { if (mergeeManifests.isEmpty() && values.isEmpty()) { return manifest; } @@ -168,17 +181,31 @@ public class AndroidManifestProcessor { break; case ERROR: mergingReport.log(stdLogger); - throw new RuntimeException(mergingReport.getReportString()); + throw new MergeErrorException(mergingReport); default: throw new RuntimeException("Unhandled result type : " + mergingReport.getResult()); } - } catch (MergeFailureException e) { + } catch (IOException | MergeFailureException e) { throw new RuntimeException(e); } return output; } + /** + * Stamp specific properties into the manifest tag of the given manifest. + * + * @param variantType The type of rule the manifest belongs to, determining the stamping behavior. + * @param customPackageForR The package attribute to stamp if not a binary manifest. + * @param applicationId The package attribute for a binary manifest. + * @param versionCode The android:versionCode attribute to stamp. + * @param versionName The android:versionName attribute to stamp. + * @param primaryData The {@link MergedAndroidData} that contains the manifest to modify. + * @param processedManifest The path to write the modified manifest. + * @return A {@link MergedAndroidData} containing the modified manifest, or {@code primaryData} if + * no modification was required. + * @throws MergeErrorException if a merge error was encountered during merging. + */ public MergedAndroidData processManifest( VariantType variantType, String customPackageForR, @@ -187,7 +214,7 @@ public class AndroidManifestProcessor { String versionName, MergedAndroidData primaryData, Path processedManifest) - throws IOException { + throws MergeErrorException { ManifestMerger2.MergeType mergeType = variantType == VariantType.DEFAULT @@ -198,30 +225,31 @@ public class AndroidManifestProcessor { variantType == VariantType.DEFAULT ? applicationId : customPackageForR; if (versionCode != -1 || versionName != null || newManifestPackage != null) { - Files.createDirectories(processedManifest.getParent()); + try { + Files.createDirectories(processedManifest.getParent()); - // The generics on Invoker don't make sense, so ignore them. - @SuppressWarnings("unchecked") - Invoker<?> manifestMergerInvoker = - ManifestMerger2.newMerger(primaryData.getManifest().toFile(), stdLogger, mergeType); - // Stamp new package - if (newManifestPackage != null) { - manifestMergerInvoker.setOverride(SystemProperty.PACKAGE, newManifestPackage); - } - // Stamp version and applicationId (if provided) into the manifest - if (versionCode > 0) { - manifestMergerInvoker.setOverride(SystemProperty.VERSION_CODE, String.valueOf(versionCode)); - } - if (versionName != null) { - manifestMergerInvoker.setOverride(SystemProperty.VERSION_NAME, versionName); - } + // The generics on Invoker don't make sense, so ignore them. + @SuppressWarnings("unchecked") + Invoker<?> manifestMergerInvoker = + ManifestMerger2.newMerger(primaryData.getManifest().toFile(), stdLogger, mergeType); + // Stamp new package + if (newManifestPackage != null) { + manifestMergerInvoker.setOverride(SystemProperty.PACKAGE, newManifestPackage); + } + // Stamp version and applicationId (if provided) into the manifest + if (versionCode > 0) { + manifestMergerInvoker.setOverride( + SystemProperty.VERSION_CODE, String.valueOf(versionCode)); + } + if (versionName != null) { + manifestMergerInvoker.setOverride(SystemProperty.VERSION_NAME, versionName); + } - MergedManifestKind mergedManifestKind = MergedManifestKind.MERGED; - if (mergeType == ManifestMerger2.MergeType.APPLICATION) { - manifestMergerInvoker.withFeatures(Invoker.Feature.REMOVE_TOOLS_DECLARATIONS); - } + MergedManifestKind mergedManifestKind = MergedManifestKind.MERGED; + if (mergeType == ManifestMerger2.MergeType.APPLICATION) { + manifestMergerInvoker.withFeatures(Invoker.Feature.REMOVE_TOOLS_DECLARATIONS); + } - try { MergingReport mergingReport = manifestMergerInvoker.merge(); switch (mergingReport.getResult()) { case WARNING: @@ -233,7 +261,7 @@ public class AndroidManifestProcessor { break; case ERROR: mergingReport.log(stdLogger); - throw new RuntimeException(mergingReport.getReportString()); + throw new MergeErrorException(mergingReport); default: throw new RuntimeException("Unhandled result type : " + mergingReport.getResult()); } @@ -301,7 +329,7 @@ public class AndroidManifestProcessor { return output; } - public void writeMergedManifest( + private void writeMergedManifest( MergedManifestKind mergedManifestKind, MergingReport mergingReport, Path manifestOut) throws IOException { String manifestContents = mergingReport.getMergedDocument(mergedManifestKind); diff --git a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceMergingAction.java b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceMergingAction.java index 49cda6f0d0..935ffa0f3a 100644 --- a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceMergingAction.java +++ b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceMergingAction.java @@ -22,6 +22,7 @@ import com.google.common.base.Stopwatch; import com.google.common.base.Strings; import com.google.common.io.Files; import com.google.devtools.build.android.AndroidDataMerger.MergeConflictException; +import com.google.devtools.build.android.AndroidManifestProcessor.MergeErrorException; import com.google.devtools.build.android.AndroidResourceMerger.MergingException; import com.google.devtools.build.android.AndroidResourceProcessor.AaptConfigOptions; import com.google.devtools.build.android.Converters.ExistingPathConverter; @@ -284,6 +285,8 @@ public class AndroidResourceMergingAction { } catch (MergingException e) { logger.log(Level.SEVERE, "Error during merging resources", e); throw e; + } catch (MergeErrorException e) { + System.exit(1); } catch (Exception e) { logger.log(Level.SEVERE, "Unexpected", e); throw e; diff --git a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessingAction.java b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessingAction.java index 1af6a5e3bd..18b89c998d 100644 --- a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessingAction.java +++ b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessingAction.java @@ -23,6 +23,7 @@ import com.android.utils.StdLogger; import com.google.common.base.Stopwatch; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.android.AndroidDataMerger.MergeConflictException; +import com.google.devtools.build.android.AndroidManifestProcessor.MergeErrorException; import com.google.devtools.build.android.AndroidResourceMerger.MergingException; import com.google.devtools.build.android.AndroidResourceProcessor.AaptConfigOptions; import com.google.devtools.build.android.AndroidResourceProcessor.FlagAaptOptions; @@ -451,6 +452,8 @@ public class AndroidResourceProcessingAction { | UnrecognizedSplitsException e) { logger.log(java.util.logging.Level.SEVERE, "Error during processing resources", e); throw e; + } catch (MergeErrorException e) { + System.exit(1); } catch (Exception e) { logger.log(java.util.logging.Level.SEVERE, "Unexpected", e); throw e; diff --git a/src/tools/android/java/com/google/devtools/build/android/ManifestMergerAction.java b/src/tools/android/java/com/google/devtools/build/android/ManifestMergerAction.java index 1862fc238f..2bd9a7756b 100644 --- a/src/tools/android/java/com/google/devtools/build/android/ManifestMergerAction.java +++ b/src/tools/android/java/com/google/devtools/build/android/ManifestMergerAction.java @@ -18,6 +18,7 @@ import static java.util.logging.Level.SEVERE; import com.android.manifmerger.ManifestMerger2.MergeType; import com.android.utils.StdLogger; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.android.AndroidManifestProcessor.MergeErrorException; import com.google.devtools.build.android.Converters.ExistingPathConverter; import com.google.devtools.build.android.Converters.ExistingPathStringDictionaryConverter; import com.google.devtools.build.android.Converters.MergeTypeConverter; @@ -223,7 +224,9 @@ public class ManifestMergerAction { // Set to the epoch for caching purposes. Files.setLastModifiedTime(options.manifestOutput, FileTime.fromMillis(0L)); - } catch (IOException e) { + } catch (MergeErrorException e) { + System.exit(1); + } catch (Exception e) { logger.log(SEVERE, "Error during merging manifests", e); throw e; } |