diff options
author | 2018-05-22 07:51:42 -0700 | |
---|---|---|
committer | 2018-05-22 07:53:08 -0700 | |
commit | 85a6f166cef1231f1e436978171870ce6b10a6d8 (patch) | |
tree | a9f505849e02ee455ff3fe9ca2418a630dd3f72b /src/main/java/com | |
parent | 8b6ddbbbe1c1a2f2b62979ffa4fdfed697258ac0 (diff) |
Pass through AndroidDataContext in more places
As before, actual action builders will be changed in a future CL; this just
starts moving AndroidDataContext in so it's available.
RELNOTES: none
PiperOrigin-RevId: 197561737
Diffstat (limited to 'src/main/java/com')
9 files changed, 256 insertions, 184 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java index d70dbcaf7c..43805cd013 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java @@ -55,6 +55,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.packages.RuleErrorConsumer; import com.google.devtools.build.lib.packages.TriState; import com.google.devtools.build.lib.rules.android.AndroidBinaryMobileInstall.MobileInstallResourceApks; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion; @@ -208,10 +209,11 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { AndroidAaptVersion aaptVersion = AndroidAaptVersion.chooseTargetAaptVersion(ruleContext); resourceApk = ProcessedAndroidData.processBinaryDataFrom( + dataContext, ruleContext, manifest, /* conditionalKeepRules = */ shouldShrinkResourceCycles( - ruleContext, shrinkResources), + dataContext.getAndroidConfig(), ruleContext, shrinkResources), applicationManifest.getManifestValues(), aaptVersion, AndroidResources.from(ruleContext, "resource_files"), @@ -221,8 +223,18 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ResourceFilterFactory.fromRuleContextAndAttrs(ruleContext), ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions"), ruleContext.attributes().get("crunch_png", Type.BOOLEAN), - DataBinding.isEnabled(ruleContext)) - .generateRClass(ruleContext, aaptVersion); + DataBinding.isEnabled(ruleContext), + ruleContext.attributes().isAttributeValueExplicitlySpecified("feature_of") + ? ruleContext + .getPrerequisite("feature_of", Mode.TARGET, ApkInfo.PROVIDER) + .getApk() + : null, + ruleContext.attributes().isAttributeValueExplicitlySpecified("feature_after") + ? ruleContext + .getPrerequisite("feature_after", Mode.TARGET, ApkInfo.PROVIDER) + .getApk() + : null) + .generateRClass(dataContext, aaptVersion); } else { applicationManifest = androidSemantics.getManifestForRule(ruleContext).mergeWith(ruleContext, resourceDeps); @@ -247,7 +259,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ruleContext.attributes().get("crunch_png", Type.BOOLEAN), ProguardHelper.getProguardConfigArtifact(ruleContext, ""), createMainDexProguardSpec(ruleContext), - shouldShrinkResourceCycles(ruleContext, shrinkResources), + shouldShrinkResourceCycles( + dataContext.getAndroidConfig(), ruleContext, shrinkResources), ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST), ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP), DataBinding.isEnabled(ruleContext) @@ -329,6 +342,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { return createAndroidBinary( ruleContext, + dataContext, filesBuilder, deployJar, derivedJarFunction, @@ -351,6 +365,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { public static RuleConfiguredTargetBuilder createAndroidBinary( RuleContext ruleContext, + AndroidDataContext dataContext, NestedSetBuilder<Artifact> filesBuilder, Artifact binaryJar, Function<Artifact, Artifact> derivedJarFunction, @@ -373,7 +388,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ImmutableList<Artifact> proguardSpecs = getProguardSpecs( - ruleContext, + dataContext, androidSemantics, resourceApk.getResourceProguardConfig(), applicationManifest.getManifest(), @@ -407,7 +422,13 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { if (shrinkResources) { resourceApk = - shrinkResources(ruleContext, resourceApk, proguardSpecs, proguardOutput, filesBuilder); + shrinkResources( + ruleContext, + androidSemantics.makeContextForNative(ruleContext), + resourceApk, + proguardSpecs, + proguardOutput, + filesBuilder); } Artifact jarToDex = proguardOutput.getOutputJar(); @@ -771,7 +792,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { } static ImmutableList<Artifact> getProguardSpecs( - RuleContext ruleContext, + AndroidDataContext dataContext, AndroidSemantics androidSemantics, Artifact resourceProguardConfig, Artifact mergedManifest, @@ -781,20 +802,20 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ImmutableList<Artifact> proguardSpecs = ProguardHelper.collectTransitiveProguardSpecs( - ruleContext, - Iterables.concat( - ImmutableList.of(resourceProguardConfig), extraProguardSpecs), + dataContext.getRuleContext(), + Iterables.concat(ImmutableList.of(resourceProguardConfig), extraProguardSpecs), localProguardSpecs, proguardDeps); - boolean assumeMinSdkVersion = - ruleContext.getFragment(AndroidConfiguration.class).assumeMinSdkVersion(); + boolean assumeMinSdkVersion = dataContext.getAndroidConfig().assumeMinSdkVersion(); if (!proguardSpecs.isEmpty() && assumeMinSdkVersion) { // NB: Order here is important. We're including generated Proguard specs before the user's // specs so that they can override values. proguardSpecs = ImmutableList.<Artifact>builder() - .addAll(androidSemantics.getProguardSpecsForManifest(ruleContext, mergedManifest)) + .addAll( + androidSemantics.getProguardSpecsForManifest( + dataContext.getRuleContext(), mergedManifest)) .addAll(proguardSpecs) .build(); } @@ -815,12 +836,12 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { } /** Returns {@code true} if resource shrinking should be performed. */ - static boolean shouldShrinkResourceCycles(RuleContext ruleContext, boolean shrinkResources) + static boolean shouldShrinkResourceCycles( + AndroidConfiguration androidConfig, RuleErrorConsumer errorConsumer, boolean shrinkResources) throws RuleErrorException { - boolean global = - ruleContext.getFragment(AndroidConfiguration.class).useAndroidResourceCycleShrinking(); + boolean global = androidConfig.useAndroidResourceCycleShrinking(); if (global && !shrinkResources) { - throw ruleContext.throwWithRuleError( + throw errorConsumer.throwWithRuleError( "resource cycle shrinking can only be enabled when resource shrinking is enabled"); } return global; @@ -828,6 +849,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { private static ResourceApk shrinkResources( RuleContext ruleContext, + AndroidDataContext dataContext, ResourceApk resourceApk, ImmutableList<Artifact> proguardSpecs, ProguardOutput proguardOutput, @@ -836,7 +858,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { Optional<Artifact> maybeShrunkApk = maybeShrinkResources( - ruleContext, + dataContext, resourceApk.getValidatedResources(), resourceApk.getResourceDependencies(), proguardSpecs, @@ -856,7 +878,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { } static Optional<Artifact> maybeShrinkResources( - RuleContext ruleContext, + AndroidDataContext dataContext, ValidatedAndroidData validatedResources, ResourceDependencies resourceDeps, ImmutableList<Artifact> proguardSpecs, @@ -872,18 +894,15 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { } return Optional.of( - new ResourceShrinkerActionBuilder(ruleContext) + new ResourceShrinkerActionBuilder(dataContext.getRuleContext()) .setResourceApkOut( - ruleContext.getImplicitOutputArtifact( - AndroidRuleClasses.ANDROID_RESOURCES_SHRUNK_APK)) + dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_SHRUNK_APK)) .setShrunkResourcesOut( - ruleContext.getImplicitOutputArtifact( - AndroidRuleClasses.ANDROID_RESOURCES_SHRUNK_ZIP)) + dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_SHRUNK_ZIP)) .setLogOut( - ruleContext.getImplicitOutputArtifact( - AndroidRuleClasses.ANDROID_RESOURCE_SHRINKER_LOG)) + dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCE_SHRINKER_LOG)) .withResourceFiles( - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP)) + dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP)) .withShrunkJar(proguardOutputJar) .withProguardMapping(proguardMapping) .withPrimary(validatedResources) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java index 76687f93dd..0c8d4cf7cb 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java @@ -74,6 +74,7 @@ public final class AndroidBinaryMobileInstall { incrementalResourceApk = ProcessedAndroidData.processIncrementalBinaryDataFrom( ruleContext, + dataContext, manifest.addMobileInstallStubApplication(ruleContext), ruleContext.getImplicitOutputArtifact( AndroidRuleClasses.ANDROID_INCREMENTAL_RESOURCES_APK), @@ -86,6 +87,7 @@ public final class AndroidBinaryMobileInstall { splitResourceApk = ProcessedAndroidData.processIncrementalBinaryDataFrom( ruleContext, + dataContext, manifest.createSplitManifest(ruleContext, "android_resources", false), getMobileInstallArtifact(ruleContext, "android_resources.ap_"), "incremental_split", diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java index 9f9b442b84..53553feadd 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.analysis.skylark.annotations.SkylarkConfigu import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; +import com.google.devtools.build.lib.packages.RuleErrorConsumer; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion.AndroidRobolectricTestDeprecationLevel; import com.google.devtools.build.lib.rules.cpp.CppConfiguration.DynamicMode; import com.google.devtools.build.lib.rules.cpp.CppOptions.DynamicModeConverter; @@ -234,10 +235,20 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { if (ruleContext.getRule().isAttrDefined("aapt_version", STRING)) { // On rules that can choose a version, test attribute then flag choose the aapt version // target. - return chooseTargetAaptVersion( - ruleContext, - ruleContext.getFragment(AndroidConfiguration.class), - ruleContext.attributes().get("aapt_version", STRING)); + AndroidAaptVersion flag = + AndroidCommon.getAndroidConfig(ruleContext).getAndroidAaptVersion(); + + AndroidAaptVersion version = + fromString(ruleContext.attributes().get("aapt_version", STRING)); + // version is null if the value is "auto" + version = version == AndroidAaptVersion.AUTO ? flag : version; + + if (version == AAPT2 && !hasAapt2) { + ruleContext.throwWithRuleError( + "aapt2 processing requested but not available on the android_sdk"); + return null; + } + return version == AndroidAaptVersion.AUTO ? AAPT : version; } else { // On rules can't choose, assume aapt2 if aapt2 is present in the sdk. return hasAapt2 ? AAPT2 : AAPT; @@ -248,18 +259,20 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { @Nullable public static AndroidAaptVersion chooseTargetAaptVersion( - RuleContext ruleContext, AndroidConfiguration androidConfig, @Nullable String versionString) + AndroidDataContext dataContext, + RuleErrorConsumer errorConsumer, + @Nullable String versionString) throws RuleErrorException { - boolean hasAapt2 = AndroidSdkProvider.fromRuleContext(ruleContext).getAapt2() != null; - AndroidAaptVersion flag = androidConfig.getAndroidAaptVersion(); + boolean hasAapt2 = dataContext.getSdk().getAapt2() != null; + AndroidAaptVersion flag = dataContext.getAndroidConfig().getAndroidAaptVersion(); AndroidAaptVersion version = fromString(versionString); // version is null if the value is "auto" version = version == AndroidAaptVersion.AUTO ? flag : version; if (version == AAPT2 && !hasAapt2) { - ruleContext.throwWithRuleError( + errorConsumer.throwWithRuleError( "aapt2 processing requested but not available on the android_sdk"); return null; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java index 937c196ff8..924d3ae911 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java @@ -185,7 +185,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { // Process transitive resources so we can build artifacts needed to export an aar. resourceApk = ResourceApk.processFromTransitiveLibraryData( - ruleContext, + dataContext, resourceDeps, assetDeps, StampedAndroidManifest.createEmpty(ruleContext, /* exported = */ false)); @@ -207,7 +207,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { final Aar aar = Aar.makeAar( - ruleContext, + dataContext, resourceApk, proguardLibrary.collectLocalProguardSpecs(), androidCommon.getClassJar()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarInfo.java index f38b40786e..5e3a6da7bc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarInfo.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarInfo.java @@ -104,13 +104,13 @@ public class AndroidLibraryAarInfo extends NativeInfo { } static Aar makeAar( - RuleContext ruleContext, + AndroidDataContext dataContext, ResourceApk resourceApk, ImmutableList<Artifact> localProguardSpecs, Artifact libraryClassJar) throws InterruptedException { return makeAar( - ruleContext, + dataContext, resourceApk.getPrimaryResources(), resourceApk.getPrimaryAssets(), resourceApk.getProcessedManifest(), @@ -120,7 +120,7 @@ public class AndroidLibraryAarInfo extends NativeInfo { } static Aar makeAar( - RuleContext ruleContext, + AndroidDataContext dataContext, AndroidResources primaryResources, AndroidAssets primaryAssets, ProcessedAndroidManifest manifest, @@ -129,9 +129,9 @@ public class AndroidLibraryAarInfo extends NativeInfo { ImmutableList<Artifact> localProguardSpecs) throws InterruptedException { Artifact aarOut = - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_AAR); + dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_AAR); - new AarGeneratorBuilder(ruleContext) + new AarGeneratorBuilder(dataContext.getRuleContext()) .withPrimaryResources(primaryResources) .withPrimaryAssets(primaryAssets) .withManifest(manifest.getManifest()) @@ -139,9 +139,8 @@ public class AndroidLibraryAarInfo extends NativeInfo { .withClasses(libraryClassJar) .setAAROut(aarOut) .setProguardSpecs(localProguardSpecs) - .setThrowOnResourceConflict( - AndroidCommon.getAndroidConfig(ruleContext).throwOnResourceConflict()) - .build(ruleContext); + .setThrowOnResourceConflict(dataContext.getAndroidConfig().throwOnResourceConflict()) + .build(dataContext.getActionConstructionContext()); return Aar.create(aarOut, manifest.getManifest()); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java index c40940acea..884c89d998 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java @@ -96,7 +96,7 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor if (AndroidResources.decoupleDataProcessing(dataContext)) { resourceApk = buildResourceApk( - ruleContext, + dataContext, AndroidManifest.fromAttributes(ruleContext), AndroidResources.from(ruleContext, "resource_files"), AndroidAssets.from(ruleContext), @@ -541,7 +541,7 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor } static ResourceApk buildResourceApk( - RuleContext ruleContext, + AndroidDataContext dataContext, AndroidManifest manifest, AndroidResources resources, AndroidAssets assets, @@ -553,10 +553,13 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor StampedAndroidManifest stamped = manifest.mergeWithDeps( - ruleContext, resourceDeps, manifestValues, /* useLegacyMerger = */ false); + dataContext.getRuleContext(), + resourceDeps, + manifestValues, + /* useLegacyMerger = */ false); return ProcessedAndroidData.processLocalTestDataFrom( - ruleContext, + dataContext, stamped, manifestValues, aaptVersion, @@ -564,7 +567,7 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor assets, resourceDeps, assetDeps) - .generateRClass(ruleContext, aaptVersion); + .generateRClass(dataContext, aaptVersion); } private static NestedSet<Artifact> getLibraryResourceJars(RuleContext ruleContext) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java index e0fd8a0de9..00094910e3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java @@ -20,6 +20,7 @@ import com.google.devtools.build.lib.actions.Artifact.SpecialArtifact; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; +import com.google.devtools.build.lib.analysis.skylark.SkylarkErrorReporter; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; @@ -138,7 +139,7 @@ public abstract class AndroidSkylarkData { pkg = AndroidManifest.getDefaultPackage(ctx.getRuleContext()); } return ResourceApk.processFromTransitiveLibraryData( - ctx.getRuleContext(), + ctx, ResourceDependencies.fromProviders(deps, /* neverlink = */ neverlink), AssetDependencies.empty(), StampedAndroidManifest.createEmpty(ctx.getRuleContext(), pkg, /* exported = */ false)) @@ -248,6 +249,8 @@ public abstract class AndroidSkylarkData { "Defaults to False. If passed as True, these assets will not be inherited by" + " targets that depend on this one.") }, + useLocation = true, + useEnvironment = true, doc = "Merges this target's assets together with assets inherited from dependencies. Note that," + " by default, actions for validating the merge are created but may not be called." @@ -258,11 +261,14 @@ public abstract class AndroidSkylarkData { Object assets, Object assetsDir, SkylarkList<AndroidAssetsInfo> deps, - boolean neverlink) + boolean neverlink, + Location location, + Environment env) throws EvalException, InterruptedException { - try { + try (SkylarkErrorReporter errorReporter = + SkylarkErrorReporter.from(ctx.getActionConstructionContext(), location, env)) { return AndroidAssets.from( - ctx.getRuleContext(), + errorReporter, listFromNoneable(assets, ConfiguredTarget.class), isNone(assetsDir) ? null : PathFragment.create(fromNoneable(assetsDir, String.class))) .process(ctx, AssetDependencies.fromProviders(deps.getImmutableList(), neverlink)) @@ -313,6 +319,8 @@ public abstract class AndroidSkylarkData { "Defaults to False. If True, processes data binding expressions in layout" + " resources."), }, + useLocation = true, + useEnvironment = true, doc = "Merges this target's resources together with resources inherited from dependencies." + " Returns a dict of provider type to actual info, with elements for" @@ -328,14 +336,16 @@ public abstract class AndroidSkylarkData { SkylarkList<ConfiguredTarget> resources, SkylarkList<AndroidResourcesInfo> deps, boolean neverlink, - boolean enableDataBinding) + boolean enableDataBinding, + Location location, + Environment env) throws EvalException, InterruptedException { - try { - AndroidAaptVersion aaptVersion = - AndroidCommon.getAndroidConfig(ctx.getRuleContext()).getAndroidAaptVersion(); + try (SkylarkErrorReporter errorReporter = + SkylarkErrorReporter.from(ctx.getActionConstructionContext(), location, env)) { + AndroidAaptVersion aaptVersion = ctx.getAndroidConfig().getAndroidAaptVersion(); ValidatedAndroidResources validated = - AndroidResources.from(ctx.getRuleContext(), getFileProviders(resources), "resources") + AndroidResources.from(errorReporter, getFileProviders(resources), "resources") .process( ctx, manifest.asStampedManifest(), @@ -449,7 +459,7 @@ public abstract class AndroidSkylarkData { } return Aar.makeAar( - ctx.getRuleContext(), + ctx, resources, assets, resourcesInfo.getManifest(), @@ -565,6 +575,7 @@ public abstract class AndroidSkylarkData { "Dependency targets. Providers will be extracted from these dependencies for each" + " type of data."), }, + useLocation = true, useEnvironment = true, doc = "Performs full processing of data for android_library or similar rules. Returns a dict" @@ -582,6 +593,7 @@ public abstract class AndroidSkylarkData { boolean enableDataBinding, SkylarkList<ConfiguredTarget> proguardSpecs, SkylarkList<ConfiguredTarget> deps, + Location location, Environment env) throws InterruptedException, EvalException { @@ -621,10 +633,12 @@ public abstract class AndroidSkylarkData { listFromNoneableOrEmpty(resources, ConfiguredTarget.class), resourceDeps, neverlink, - enableDataBinding); + enableDataBinding, + location, + env); resourcesInfo = (AndroidResourcesInfo) resourceOutput.get(AndroidResourcesInfo.PROVIDER); - assetsInfo = mergeAssets(ctx, assets, assetsDir, assetDeps, neverlink); + assetsInfo = mergeAssets(ctx, assets, assetsDir, assetDeps, neverlink, location, env); infoBuilder.putAll(resourceOutput); } @@ -680,8 +694,7 @@ public abstract class AndroidSkylarkData { SkylarkList<ConfiguredTarget> deps) throws InterruptedException { - AndroidAaptVersion aaptVersion = - AndroidCommon.getAndroidConfig(ctx.getRuleContext()).getAndroidAaptVersion(); + AndroidAaptVersion aaptVersion = ctx.getAndroidConfig().getAndroidAaptVersion(); ValidatedAndroidResources validatedResources = AndroidResources.forAarImport(resources) @@ -788,6 +801,8 @@ public abstract class AndroidSkylarkData { "Dependency targets. Providers will be extracted from these dependencies for each" + " type of data."), }, + useLocation = true, + useEnvironment = true, doc = "Processes resources, assets, and manifests for android_local_test and returns a dict" + " from provider type to the appropriate provider.") @@ -800,8 +815,12 @@ public abstract class AndroidSkylarkData { Object customPackage, String aaptVersionString, SkylarkDict<String, String> rawManifestValues, - SkylarkList<ConfiguredTarget> deps) + SkylarkList<ConfiguredTarget> deps, + Location location, + Environment env) throws InterruptedException, EvalException { + try (SkylarkErrorReporter errorReporter = + SkylarkErrorReporter.from(ctx.getActionConstructionContext(), location, env)) { AndroidManifest rawManifest = AndroidManifest.from( @@ -810,15 +829,13 @@ public abstract class AndroidSkylarkData { fromNoneable(customPackage, String.class), /* exportsManifest = */ false); - try { ResourceApk resourceApk = AndroidLocalTestBase.buildResourceApk( - ctx.getRuleContext(), + ctx, rawManifest, - AndroidResources.from( - ctx.getRuleContext(), getFileProviders(resources), "resource_files"), + AndroidResources.from(errorReporter, getFileProviders(resources), "resource_files"), AndroidAssets.from( - ctx.getRuleContext(), + errorReporter, listFromNoneable(assets, ConfiguredTarget.class), isNone(assetsDir) ? null @@ -828,10 +845,7 @@ public abstract class AndroidSkylarkData { AssetDependencies.fromProviders( getProviders(deps, AndroidAssetsInfo.PROVIDER), /* neverlink = */ false), ApplicationManifest.getManifestValues(ctx.getRuleContext(), rawManifestValues), - AndroidAaptVersion.chooseTargetAaptVersion( - ctx.getRuleContext(), - AndroidCommon.getAndroidConfig(ctx.getRuleContext()), - aaptVersionString)); + AndroidAaptVersion.chooseTargetAaptVersion(ctx, errorReporter, aaptVersionString)); return getNativeInfosFrom(resourceApk, ctx.getLabel()); } catch (RuleErrorException e) { @@ -892,6 +906,8 @@ public abstract class AndroidSkylarkData { "The version of aapt to use. Defaults to 'auto'. 'aapt' and 'aapt2' are also" + " supported."), }, + useLocation = true, + useEnvironment = true, doc = "Returns a wrapper object containing various settings shared across multiple methods for" + " processing binary data.") @@ -901,15 +917,16 @@ public abstract class AndroidSkylarkData { SkylarkList<String> resourceConfigurationFilters, SkylarkList<String> densities, SkylarkList<String> rawNoCompressExtensions, - String aaptVersionString) + String aaptVersionString, + Location location, + Environment env) throws EvalException { - AndroidConfiguration androidConfig = AndroidCommon.getAndroidConfig(ctx.getRuleContext()); AndroidAaptVersion aaptVersion; - try { + try (SkylarkErrorReporter errorReporter = + SkylarkErrorReporter.from(ctx.getActionConstructionContext(), location, env)) { aaptVersion = - AndroidAaptVersion.chooseTargetAaptVersion( - ctx.getRuleContext(), androidConfig, aaptVersionString); + AndroidAaptVersion.chooseTargetAaptVersion(ctx, errorReporter, aaptVersionString); } catch (RuleErrorException e) { throw new EvalException(Location.BUILTIN, e); } @@ -917,7 +934,7 @@ public abstract class AndroidSkylarkData { return new BinaryDataSettings( aaptVersion, fromNoneableOrDefault( - shrinkResources, Boolean.class, androidConfig.useAndroidResourceShrinking()), + shrinkResources, Boolean.class, ctx.getAndroidConfig().useAndroidResourceShrinking()), ResourceFilterFactory.from(aaptVersion, resourceConfigurationFilters, densities), ctx.getRuleContext() .getExpander() @@ -929,15 +946,17 @@ public abstract class AndroidSkylarkData { * Helper method to get default {@link * com.google.devtools.build.lib.rules.android.AndroidSkylarkData.BinaryDataSettings}. */ - private BinaryDataSettings defaultBinaryDataSettings(AndroidDataContext ctx) - throws EvalException { + private BinaryDataSettings defaultBinaryDataSettings( + AndroidDataContext ctx, Location location, Environment env) throws EvalException { return makeBinarySettings( ctx, Runtime.NONE, SkylarkList.createImmutable(ImmutableList.of()), SkylarkList.createImmutable(ImmutableList.of()), SkylarkList.createImmutable(ImmutableList.of()), - "auto"); + "auto", + location, + env); } @SkylarkModule( @@ -1070,6 +1089,8 @@ public abstract class AndroidSkylarkData { "Defaults to False. If True, processes data binding expressions in layout" + " resources."), }, + useLocation = true, + useEnvironment = true, doc = "Processes resources, assets, and manifests for android_binary and returns the" + " appropriate providers.") @@ -1085,12 +1106,16 @@ public abstract class AndroidSkylarkData { String manifestMerger, Object maybeSettings, boolean crunchPng, - boolean dataBindingEnabled) - throws InterruptedException, RuleErrorException, EvalException { + boolean dataBindingEnabled, + Location location, + Environment env) + throws InterruptedException, EvalException { + try (SkylarkErrorReporter errorReporter = + SkylarkErrorReporter.from(ctx.getActionConstructionContext(), location, env)) { BinaryDataSettings settings = fromNoneableOrDefault( - maybeSettings, BinaryDataSettings.class, defaultBinaryDataSettings(ctx)); + maybeSettings, BinaryDataSettings.class, defaultBinaryDataSettings(ctx, location, env)); AndroidManifest rawManifest = AndroidManifest.from( @@ -1114,37 +1139,44 @@ public abstract class AndroidSkylarkData { manifestValues, ApplicationManifest.useLegacyMerging(ctx.getRuleContext(), manifestMerger)); - ResourceApk resourceApk = - ProcessedAndroidData.processBinaryDataFrom( - ctx.getRuleContext(), - stampedManifest, - AndroidBinary.shouldShrinkResourceCycles( - ctx.getRuleContext(), settings.shrinkResources), - manifestValues, - settings.aaptVersion, - AndroidResources.from( - ctx.getRuleContext(), getFileProviders(resources), "resource_files"), - AndroidAssets.from( - ctx.getRuleContext(), - listFromNoneable(assets, ConfiguredTarget.class), - isNone(assetsDir) - ? null - : PathFragment.create(fromNoneable(assetsDir, String.class))), - resourceDeps, - AssetDependencies.fromProviders( - getProviders(deps, AndroidAssetsInfo.PROVIDER), /* neverlink = */ false), - settings.resourceFilterFactory, - settings.noCompressExtensions, - crunchPng, - dataBindingEnabled) - .generateRClass(ctx.getRuleContext(), settings.aaptVersion); - - return AndroidBinaryDataInfo.of( - resourceApk.getArtifact(), - resourceApk.getResourceProguardConfig(), - resourceApk.toResourceInfo(ctx.getLabel()), - resourceApk.toAssetsInfo(ctx.getLabel()).get(), - resourceApk.toManifestInfo().get()); + ResourceApk resourceApk = + ProcessedAndroidData.processBinaryDataFrom( + ctx, + errorReporter, + stampedManifest, + AndroidBinary.shouldShrinkResourceCycles( + ctx.getAndroidConfig(), errorReporter, settings.shrinkResources), + manifestValues, + settings.aaptVersion, + AndroidResources.from( + errorReporter, getFileProviders(resources), "resource_files"), + AndroidAssets.from( + errorReporter, + listFromNoneable(assets, ConfiguredTarget.class), + isNone(assetsDir) + ? null + : PathFragment.create(fromNoneable(assetsDir, String.class))), + resourceDeps, + AssetDependencies.fromProviders( + getProviders(deps, AndroidAssetsInfo.PROVIDER), /* neverlink = */ false), + settings.resourceFilterFactory, + settings.noCompressExtensions, + crunchPng, + dataBindingEnabled, + /* featureOf = */ null, + /* featureAfter = */ null) + .generateRClass(ctx, settings.aaptVersion); + + return AndroidBinaryDataInfo.of( + resourceApk.getArtifact(), + resourceApk.getResourceProguardConfig(), + resourceApk.toResourceInfo(ctx.getLabel()), + resourceApk.toAssetsInfo(ctx.getLabel()).get(), + resourceApk.toManifestInfo().get()); + + } catch (RuleErrorException e) { + throw new EvalException(location, e); + } } @SkylarkCallable( @@ -1193,6 +1225,8 @@ public abstract class AndroidSkylarkData { "Additional proguard specs that should be added for top-level targets. This value" + " is controlled by Java configuration."), }, + useLocation = true, + useEnvironment = true, doc = "Possibly shrinks the data APK by removing resources that were marked as unused during" + " proguarding.") @@ -1204,11 +1238,13 @@ public abstract class AndroidSkylarkData { Object maybeSettings, SkylarkList<ConfiguredTarget> deps, SkylarkList<ConfiguredTarget> localProguardSpecs, - SkylarkList<ConfiguredTarget> extraProguardSpecs) + SkylarkList<ConfiguredTarget> extraProguardSpecs, + Location location, + Environment env) throws EvalException, InterruptedException { BinaryDataSettings settings = fromNoneableOrDefault( - maybeSettings, BinaryDataSettings.class, defaultBinaryDataSettings(ctx)); + maybeSettings, BinaryDataSettings.class, defaultBinaryDataSettings(ctx, location, env)); if (!settings.shrinkResources) { return binaryDataInfo; @@ -1216,7 +1252,7 @@ public abstract class AndroidSkylarkData { ImmutableList<Artifact> proguardSpecs = AndroidBinary.getProguardSpecs( - ctx.getRuleContext(), + ctx, getAndroidSemantics(), binaryDataInfo.getResourceProguardConfig(), binaryDataInfo.getManifestInfo().getManifest(), @@ -1235,7 +1271,7 @@ public abstract class AndroidSkylarkData { Optional<Artifact> maybeShrunkApk = AndroidBinary.maybeShrinkResources( - ctx.getRuleContext(), + ctx, binaryDataInfo.getResourcesInfo().getDirectAndroidResources().toList().get(0), ResourceDependencies.fromProviders( getProviders(deps, AndroidResourcesInfo.PROVIDER), /* neverlink = */ false), diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java b/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java index 3cffbf4dd3..7e468823eb 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java @@ -16,8 +16,6 @@ package com.google.devtools.build.lib.rules.android; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleContext; -import com.google.devtools.build.lib.analysis.config.CompilationMode; -import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.RuleErrorConsumer; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion; @@ -55,7 +53,8 @@ public class ProcessedAndroidData { /** Processes Android data (assets, resources, and manifest) for android_binary targets. */ public static ProcessedAndroidData processBinaryDataFrom( - RuleContext ruleContext, + AndroidDataContext dataContext, + RuleErrorConsumer errorConsumer, StampedAndroidManifest manifest, boolean conditionalKeepRules, Map<String, String> manifestValues, @@ -67,41 +66,35 @@ public class ProcessedAndroidData { ResourceFilterFactory resourceFilterFactory, List<String> noCompressExtensions, boolean crunchPng, - boolean dataBindingEnabled) + boolean dataBindingEnabled, + @Nullable Artifact featureOf, + @Nullable Artifact featureAfter) throws RuleErrorException, InterruptedException { if (conditionalKeepRules && aaptVersion != AndroidAaptVersion.AAPT2) { - throw ruleContext.throwWithRuleError( + throw errorConsumer.throwWithRuleError( "resource cycle shrinking can only be enabled for builds with aapt2"); } AndroidResourcesProcessorBuilder builder = - builderForNonIncrementalTopLevelTarget(ruleContext, manifest, manifestValues, aaptVersion) + builderForNonIncrementalTopLevelTarget(dataContext, manifest, manifestValues, aaptVersion) .setUseCompiledResourcesForMerge( aaptVersion == AndroidAaptVersion.AAPT2 - && AndroidCommon.getAndroidConfig(ruleContext).skipParsingAction()) + && dataContext.getAndroidConfig().skipParsingAction()) .setManifestOut( - ruleContext.getImplicitOutputArtifact( - AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST)) + dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST)) .setMergedResourcesOut( - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP)) - .setMainDexProguardOut(AndroidBinary.createMainDexProguardSpec(ruleContext)) + dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP)) + .setMainDexProguardOut( + AndroidBinary.createMainDexProguardSpec(dataContext.getRuleContext())) .conditionalKeepRules(conditionalKeepRules) .setDataBindingInfoZip( - dataBindingEnabled ? DataBinding.getLayoutInfoFile(ruleContext) : null) - .setFeatureOf( - ruleContext.attributes().isAttributeValueExplicitlySpecified("feature_of") - ? ruleContext - .getPrerequisite("feature_of", Mode.TARGET, ApkInfo.PROVIDER) - .getApk() + dataBindingEnabled + ? DataBinding.getLayoutInfoFile(dataContext.getRuleContext()) : null) - .setFeatureAfter( - ruleContext.attributes().isAttributeValueExplicitlySpecified("feature_after") - ? ruleContext - .getPrerequisite("feature_after", Mode.TARGET, ApkInfo.PROVIDER) - .getApk() - : null); + .setFeatureOf(featureOf) + .setFeatureAfter(featureAfter); return buildActionForBinary( - ruleContext, + errorConsumer, builder, manifest, resources, @@ -115,6 +108,7 @@ public class ProcessedAndroidData { public static ProcessedAndroidData processIncrementalBinaryDataFrom( RuleContext ruleContext, + AndroidDataContext dataContext, StampedAndroidManifest manifest, Artifact apkOut, String proguardPrefix, @@ -122,7 +116,7 @@ public class ProcessedAndroidData { throws RuleErrorException { AndroidResourcesProcessorBuilder builder = - builderForTopLevelTarget(ruleContext, manifest, proguardPrefix, manifestValues) + builderForTopLevelTarget(dataContext, manifest, proguardPrefix, manifestValues) .setApkOut(apkOut); return buildActionForBinary( @@ -169,7 +163,7 @@ public class ProcessedAndroidData { /** Processes Android data (assets, resources, and manifest) for android_local_test targets. */ public static ProcessedAndroidData processLocalTestDataFrom( - RuleContext ruleContext, + AndroidDataContext dataContext, StampedAndroidManifest manifest, Map<String, String> manifestValues, AndroidAaptVersion aaptVersion, @@ -180,14 +174,14 @@ public class ProcessedAndroidData { throws InterruptedException { return builderForNonIncrementalTopLevelTarget( - ruleContext, manifest, manifestValues, aaptVersion) + dataContext, manifest, manifestValues, aaptVersion) .setUseCompiledResourcesForMerge( aaptVersion == AndroidAaptVersion.AAPT2 - && AndroidCommon.getAndroidConfig(ruleContext).skipParsingAction()) + && dataContext.getAndroidConfig().skipParsingAction()) .setManifestOut( - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST)) + dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST)) .setMergedResourcesOut( - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP)) + dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP)) .setCrunchPng(false) .withResourceDependencies(resourceDeps) .withAssetDependencies(assetDeps) @@ -196,7 +190,7 @@ public class ProcessedAndroidData { /** Processes Android data (assets, resources, and manifest) for android_test targets. */ public static ProcessedAndroidData processTestDataFrom( - RuleContext ruleContext, + AndroidDataContext dataContext, StampedAndroidManifest manifest, String packageUnderTest, boolean hasLocalResourceFiles, @@ -209,8 +203,9 @@ public class ProcessedAndroidData { AndroidResourcesProcessorBuilder builder = builderForNonIncrementalTopLevelTarget( - ruleContext, manifest, ImmutableMap.of(), aaptVersion) - .setMainDexProguardOut(AndroidBinary.createMainDexProguardSpec(ruleContext)) + dataContext, manifest, ImmutableMap.of(), aaptVersion) + .setMainDexProguardOut( + AndroidBinary.createMainDexProguardSpec(dataContext.getRuleContext())) .setPackageUnderTest(packageUnderTest) .setIsTestWithResources(hasLocalResourceFiles) .withResourceDependencies(resourceDeps) @@ -225,22 +220,21 @@ public class ProcessedAndroidData { * <p>The builder will be populated with commonly-used settings and outputs. */ private static AndroidResourcesProcessorBuilder builderForNonIncrementalTopLevelTarget( - RuleContext ruleContext, + AndroidDataContext dataContext, StampedAndroidManifest manifest, Map<String, String> manifestValues, AndroidAaptVersion aaptVersion) throws InterruptedException { - return builderForTopLevelTarget(ruleContext, manifest, "", manifestValues) + return builderForTopLevelTarget(dataContext, manifest, "", manifestValues) .targetAaptVersion(aaptVersion) // Outputs - .setApkOut(ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_APK)) - .setRTxtOut(ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT)) + .setApkOut(dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_APK)) + .setRTxtOut(dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT)) .setSourceJarOut( - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR)) - .setSymbols( - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_MERGED_SYMBOLS)); + dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR)) + .setSymbols(dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_MERGED_SYMBOLS)); } /** @@ -249,22 +243,22 @@ public class ProcessedAndroidData { * <p>The builder will be populated with commonly-used settings and outputs. */ private static AndroidResourcesProcessorBuilder builderForTopLevelTarget( - RuleContext ruleContext, + AndroidDataContext dataContext, StampedAndroidManifest manifest, String proguardPrefix, Map<String, String> manifestValues) { - return new AndroidResourcesProcessorBuilder(ruleContext) + return new AndroidResourcesProcessorBuilder(dataContext.getRuleContext()) // Settings - .setDebug(ruleContext.getConfiguration().getCompilationMode() != CompilationMode.OPT) + .setDebug(dataContext.useDebug()) .setJavaPackage(manifest.getPackage()) .setApplicationId(manifestValues.get("applicationId")) .setVersionCode(manifestValues.get("versionCode")) .setVersionName(manifestValues.get("versionName")) - .setThrowOnResourceConflict( - AndroidCommon.getAndroidConfig(ruleContext).throwOnResourceConflict()) + .setThrowOnResourceConflict(dataContext.getAndroidConfig().throwOnResourceConflict()) // Output - .setProguardOut(ProguardHelper.getProguardConfigArtifact(ruleContext, proguardPrefix)); + .setProguardOut( + ProguardHelper.getProguardConfigArtifact(dataContext.getRuleContext(), proguardPrefix)); } static ProcessedAndroidData of( @@ -279,8 +273,16 @@ public class ProcessedAndroidData { Artifact resourceProguardConfig, @Nullable Artifact mainDexProguardConfig) { return new ProcessedAndroidData( - resources, assets, manifest, rTxt, sourceJar, apk, dataBindingInfoZip, resourceDeps, - resourceProguardConfig, mainDexProguardConfig); + resources, + assets, + manifest, + rTxt, + sourceJar, + apk, + dataBindingInfoZip, + resourceDeps, + resourceProguardConfig, + mainDexProguardConfig); } private ProcessedAndroidData( @@ -312,13 +314,13 @@ public class ProcessedAndroidData { * <p>Registers an action to run R class generation, the last step needed in resource processing. * Returns the fully processed data, including validated resources, wrapped in a ResourceApk. */ - public ResourceApk generateRClass(RuleContext ruleContext, AndroidAaptVersion aaptVersion) + public ResourceApk generateRClass(AndroidDataContext dataContext, AndroidAaptVersion aaptVersion) throws InterruptedException { - return new RClassGeneratorActionBuilder(ruleContext) + return new RClassGeneratorActionBuilder(dataContext.getRuleContext()) .targetAaptVersion(aaptVersion) .withDependencies(resourceDeps) .setClassJarOut( - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_CLASS_JAR)) + dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_CLASS_JAR)) .build(this); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java index 95e7887873..46048e90a1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java @@ -16,8 +16,6 @@ package com.google.devtools.build.lib.rules.android; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.OutputGroupInfo; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; -import com.google.devtools.build.lib.analysis.RuleContext; -import com.google.devtools.build.lib.analysis.config.CompilationMode; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import java.util.Optional; @@ -270,8 +268,9 @@ public final class ResourceApk { if (assetsInfo.isPresent()) { builder.addNativeDeclaredProvider(assetsInfo.get()); if (assetsInfo.get().getValidationResult() != null) { - // Asset merging output isn't consumed by anything. Require it to be run by top-level targets - // so we can validate there are no asset merging conflicts. + // Asset merging output isn't consumed by anything. Require it to be run by top-level + // targets + // so we can validate there are no asset merging conflicts. builder.addOutputGroup( OutputGroupInfo.HIDDEN_TOP_LEVEL, assetsInfo.get().getValidationResult()); } @@ -299,25 +298,24 @@ public final class ResourceApk { * <p>Any local resources and assets will be ignored. */ public static ResourceApk processFromTransitiveLibraryData( - RuleContext ruleContext, + AndroidDataContext dataContext, ResourceDependencies resourceDeps, AssetDependencies assetDeps, StampedAndroidManifest manifest) throws InterruptedException { - return new AndroidResourcesProcessorBuilder(ruleContext) + return new AndroidResourcesProcessorBuilder(dataContext.getRuleContext()) .setLibrary(true) - .setRTxtOut(ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT)) + .setRTxtOut(dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT)) .setManifestOut( - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST)) + dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST)) .setSourceJarOut( - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR)) + dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR)) .setJavaPackage(manifest.getPackage()) .withResourceDependencies(resourceDeps) .withAssetDependencies(assetDeps) - .setDebug(ruleContext.getConfiguration().getCompilationMode() != CompilationMode.OPT) - .setThrowOnResourceConflict( - AndroidCommon.getAndroidConfig(ruleContext).throwOnResourceConflict()) + .setDebug(dataContext.useDebug()) + .setThrowOnResourceConflict(dataContext.getAndroidConfig().throwOnResourceConflict()) .buildWithoutLocalResources(manifest); } } |