From f9e7529908149e0511cc666c8fed879a50dbaea8 Mon Sep 17 00:00:00 2001 From: asteinb Date: Thu, 10 May 2018 10:28:10 -0700 Subject: Create top-level android data provider This provider wraps the other android data providers, as well as artifacts that should only be made available for top-level Android targets. This provider is required for some output (such as final data APK) to be exposed to Skylark, and also makes it easy to pass information from android_binary data processing to postprocessing actions, most notably resource shrinking (next reviews). RELNOTES: none PiperOrigin-RevId: 196135042 --- .../build/lib/rules/android/AarImport.java | 5 +- .../build/lib/rules/android/AndroidBinary.java | 3 +- .../lib/rules/android/AndroidBinaryDataInfo.java | 82 ++++++++++++++++++++++ .../build/lib/rules/android/AndroidCommon.java | 5 +- .../build/lib/rules/android/AndroidLibrary.java | 3 +- .../lib/rules/android/ProcessedAndroidData.java | 6 +- .../build/lib/rules/android/ResourceApk.java | 15 +++- 7 files changed, 110 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryDataInfo.java (limited to 'src/main/java/com/google/devtools') diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java index b28fd4559f..9cacebfc08 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java @@ -217,7 +217,10 @@ public class AarImport implements RuleConfiguredTargetFactory { ruleBuilder, javaInfoBuilder, filesToBuild, /*classJar=*/ null); resourceApk.addToConfiguredTargetBuilder( - ruleBuilder, ruleContext.getLabel(), /* includeSkylarkApiProvider = */ false); + ruleBuilder, + ruleContext.getLabel(), + /* includeSkylarkApiProvider = */ false, + /* isLibrary = */ true); ruleBuilder .setFilesToBuild(filesToBuild) 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 049a7dd305..835a2f61a7 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 @@ -569,7 +569,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { zipAlignedApk, apksUnderTest, nativeLibs, - androidCommon.isNeverLink()); + androidCommon.isNeverLink(), + /* isLibrary = */ false); if (dexPostprocessingOutput.proguardMap() != null) { builder.addProvider( diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryDataInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryDataInfo.java new file mode 100644 index 0000000000..e17ddefbc9 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryDataInfo.java @@ -0,0 +1,82 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.rules.android; + +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.packages.BuiltinProvider; +import com.google.devtools.build.lib.packages.NativeInfo; + +/** + * Provides information on Android resource, asset, and manifest information specific to binaries. + * + *

This includes both android_binary targets and other top-level targets (such as + * android_local_test) + */ +public class AndroidBinaryDataInfo extends NativeInfo { + public static final String SKYLARK_NAME = "AndroidBinaryData"; + + public static final BuiltinProvider PROVIDER = + new BuiltinProvider(SKYLARK_NAME, AndroidBinaryDataInfo.class) {}; + + private final Artifact dataApk; + private final Artifact resourceProguardConfig; + + private final AndroidResourcesInfo resourcesInfo; + private final AndroidAssetsInfo assetsInfo; + private final AndroidManifestInfo manifestInfo; + + public static AndroidBinaryDataInfo of( + Artifact dataApk, + Artifact resourceProguardConfig, + AndroidResourcesInfo resourcesInfo, + AndroidAssetsInfo assetsInfo, + AndroidManifestInfo manifestInfo) { + return new AndroidBinaryDataInfo( + dataApk, resourceProguardConfig, resourcesInfo, assetsInfo, manifestInfo); + } + + private AndroidBinaryDataInfo( + Artifact dataApk, + Artifact resourceProguardConfig, + AndroidResourcesInfo resourcesInfo, + AndroidAssetsInfo assetsInfo, + AndroidManifestInfo manifestInfo) { + super(PROVIDER); + this.dataApk = dataApk; + this.resourceProguardConfig = resourceProguardConfig; + this.resourcesInfo = resourcesInfo; + this.assetsInfo = assetsInfo; + this.manifestInfo = manifestInfo; + } + + public Artifact getApk() { + return dataApk; + } + + public Artifact getResourceProguardConfig() { + return resourceProguardConfig; + } + + public AndroidResourcesInfo getResourcesInfo() { + return resourcesInfo; + } + + public AndroidAssetsInfo getAssetsInfo() { + return assetsInfo; + } + + public AndroidManifestInfo getManifestInfo() { + return manifestInfo; + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java index fe539531ea..42147be658 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java @@ -662,7 +662,8 @@ public class AndroidCommon { Artifact zipAlignedApk, Iterable apksUnderTest, NativeLibs nativeLibs, - boolean isNeverlink) { + boolean isNeverlink, + boolean isLibrary) { idlHelper.addTransitiveInfoProviders(builder, classJar, manifestProtoOutput); @@ -708,7 +709,7 @@ public class AndroidCommon { .build(); resourceApk.addToConfiguredTargetBuilder( - builder, ruleContext.getLabel(), /* includeSkylarkApiProvider = */ true); + builder, ruleContext.getLabel(), /* includeSkylarkApiProvider = */ true, isLibrary); return builder .setFilesToBuild(filesToBuild) 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 3d557a4b00..3518cb8ce3 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 @@ -220,7 +220,8 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { ImmutableList.of(), NativeLibs.EMPTY, // TODO(elenairina): Use JavaCommon.isNeverlink(ruleContext) for consistency among rules. - androidCommon.isNeverLink()); + androidCommon.isNeverLink(), + /* isLibrary = */ true); NestedSetBuilder transitiveResourcesJars = collectTransitiveResourceJars(ruleContext); if (resourceApk.getResourceJavaClassJar() != null) { 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 041e8c9ab1..6cbaa5ee23 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 @@ -48,7 +48,7 @@ public class ProcessedAndroidData { private final Artifact apk; @Nullable private final Artifact dataBindingInfoZip; private final ResourceDependencies resourceDeps; - @Nullable private final Artifact resourceProguardConfig; + private final Artifact resourceProguardConfig; @Nullable private final Artifact mainDexProguardConfig; /** Processes Android data (assets, resources, and manifest) for android_binary targets. */ @@ -249,7 +249,7 @@ public class ProcessedAndroidData { Artifact apk, @Nullable Artifact dataBindingInfoZip, ResourceDependencies resourceDeps, - @Nullable Artifact resourceProguardConfig, + Artifact resourceProguardConfig, @Nullable Artifact mainDexProguardConfig) { return new ProcessedAndroidData( resources, assets, manifest, rTxt, sourceJar, apk, dataBindingInfoZip, resourceDeps, @@ -265,7 +265,7 @@ public class ProcessedAndroidData { Artifact apk, @Nullable Artifact dataBindingInfoZip, ResourceDependencies resourceDeps, - @Nullable Artifact resourceProguardConfig, + Artifact resourceProguardConfig, @Nullable Artifact mainDexProguardConfig) { this.resources = resources; this.assets = assets; 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 7b128596eb..95e7887873 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 @@ -256,7 +256,10 @@ public final class ResourceApk { } public void addToConfiguredTargetBuilder( - RuleConfiguredTargetBuilder builder, Label label, boolean includeSkylarkApiProvider) { + RuleConfiguredTargetBuilder builder, + Label label, + boolean includeSkylarkApiProvider, + boolean isLibrary) { AndroidResourcesInfo resourceInfo = toResourceInfo(label); builder.addNativeDeclaredProvider(resourceInfo); @@ -274,6 +277,16 @@ public final class ResourceApk { } } + if (manifestInfo.isPresent() && assetsInfo.isPresent() && !isLibrary) { + builder.addNativeDeclaredProvider( + AndroidBinaryDataInfo.of( + resourceApk, + resourceProguardConfig, + resourceInfo, + assetsInfo.get(), + manifestInfo.get())); + } + if (includeSkylarkApiProvider) { builder.addSkylarkTransitiveInfo( AndroidSkylarkApiProvider.NAME, new AndroidSkylarkApiProvider(resourceInfo)); -- cgit v1.2.3