diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build')
7 files changed, 125 insertions, 67 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java index 1fd72c0450..7b290df5a9 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java @@ -82,6 +82,7 @@ import com.google.devtools.build.lib.rules.android.AndroidConfiguration; import com.google.devtools.build.lib.rules.android.AndroidDeviceRule; import com.google.devtools.build.lib.rules.android.AndroidDeviceScriptFixtureRule; import com.google.devtools.build.lib.rules.android.AndroidHostServiceFixtureRule; +import com.google.devtools.build.lib.rules.android.AndroidInstrumentationInfo; import com.google.devtools.build.lib.rules.android.AndroidInstrumentationTestRule; import com.google.devtools.build.lib.rules.android.AndroidLibraryBaseRule; import com.google.devtools.build.lib.rules.android.AndroidLocalTestBaseRule; @@ -89,6 +90,7 @@ import com.google.devtools.build.lib.rules.android.AndroidNeverlinkAspect; import com.google.devtools.build.lib.rules.android.AndroidRuleClasses; import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.AndroidToolsDefaultsJarRule; import com.google.devtools.build.lib.rules.android.AndroidSkylarkCommon; +import com.google.devtools.build.lib.rules.android.ApkInfo; import com.google.devtools.build.lib.rules.android.DexArchiveAspect; import com.google.devtools.build.lib.rules.apple.AppleCommandLineOptions; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; @@ -478,6 +480,9 @@ public class BazelRuleClassProvider { builder.addRuleDefinition(new AndroidHostServiceFixtureRule()); builder.addSkylarkAccessibleTopLevels("android_common", new AndroidSkylarkCommon()); + builder.addSkylarkAccessibleTopLevels(ApkInfo.PROVIDER.getName(), ApkInfo.PROVIDER); + builder.addSkylarkAccessibleTopLevels( + AndroidInstrumentationInfo.PROVIDER.getName(), AndroidInstrumentationInfo.PROVIDER); try { builder.addWorkspaceFilePrefix( 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 00e8210c66..8792e18faf 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 @@ -180,12 +180,12 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { Artifact featureOfArtifact = ruleContext.attributes().isAttributeValueExplicitlySpecified("feature_of") - ? ruleContext.getPrerequisite("feature_of", Mode.TARGET, ApkProvider.class).getApk() + ? ruleContext.getPrerequisite("feature_of", Mode.TARGET, ApkInfo.PROVIDER).getApk() : null; Artifact featureAfterArtifact = ruleContext.attributes().isAttributeValueExplicitlySpecified("feature_after") ? ruleContext - .getPrerequisite("feature_after", Mode.TARGET, ApkProvider.class) + .getPrerequisite("feature_after", Mode.TARGET, ApkInfo.PROVIDER) .getApk() : null; @@ -424,8 +424,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { // If this is an instrumentation APK, create the provider for android_instrumentation_test. if (isInstrumentation(ruleContext)) { - ApkProvider targetApkProvider = - ruleContext.getPrerequisite("instruments", Mode.TARGET, ApkProvider.class); + ApkInfo targetApkProvider = + ruleContext.getPrerequisite("instruments", Mode.TARGET, ApkInfo.PROVIDER); Artifact targetApk = targetApkProvider.getApk(); Artifact instrumentationApk = zipAlignedApk; @@ -517,9 +517,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { .addProvider( JavaSourceInfoProvider.class, JavaSourceInfoProvider.fromJavaTargetAttributes(resourceClasses, javaSemantics)) - .addProvider( - ApkProvider.class, - ApkProvider.create( + .addNativeDeclaredProvider( + new ApkInfo( zipAlignedApk, unsignedApk, androidCommon.getInstrumentedJar(), 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 6c8e0401e4..e9064e9400 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 @@ -940,9 +940,9 @@ public class AndroidCommon { static NestedSet<Artifact> getSupportApks(RuleContext ruleContext) { NestedSetBuilder<Artifact> supportApks = NestedSetBuilder.stableOrder(); for (TransitiveInfoCollection dep : ruleContext.getPrerequisites("support_apks", Mode.TARGET)) { - ApkProvider apkProvider = dep.getProvider(ApkProvider.class); + ApkInfo apkProvider = dep.get(ApkInfo.PROVIDER); FileProvider fileProvider = dep.getProvider(FileProvider.class); - // If ApkProvider is present, do not check FileProvider for .apk files. For example, + // If ApkInfo is present, do not check FileProvider for .apk files. For example, // android_binary creates a FileProvider containing both the signed and unsigned APKs. if (apkProvider != null) { supportApks.add(apkProvider.getApk()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java index d7e53f79ee..b588861ab5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java @@ -17,32 +17,49 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.NativeInfo; import com.google.devtools.build.lib.packages.NativeProvider; +import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; /** - * A provider for targets that create Android instrumentations. Consumed by {@link - * AndroidInstrumentationTest}. + * A provider for targets that create Android instrumentations. Consumed by Android testing rules. */ + @SkylarkModule( + name = "AndroidInstrumentationInfo", + doc = "Android instrumentation and target APKs to run in a test", + category = SkylarkModuleCategory.PROVIDER +) @Immutable public class AndroidInstrumentationInfo extends NativeInfo { private static final String SKYLARK_NAME = "AndroidInstrumentationInfo"; - static final NativeProvider<AndroidInstrumentationInfo> PROVIDER = + public static final NativeProvider<AndroidInstrumentationInfo> PROVIDER = new NativeProvider<AndroidInstrumentationInfo>( AndroidInstrumentationInfo.class, SKYLARK_NAME) {}; private final Artifact targetApk; private final Artifact instrumentationApk; - public AndroidInstrumentationInfo(Artifact targetApk, Artifact instrumentationApk) { + AndroidInstrumentationInfo(Artifact targetApk, Artifact instrumentationApk) { super(PROVIDER); this.targetApk = targetApk; this.instrumentationApk = instrumentationApk; } + @SkylarkCallable( + name = "target_apk", + doc = "Returns the target APK of the instrumentation test.", + structField = true + ) public Artifact getTargetApk() { return targetApk; } + @SkylarkCallable( + name = "instrumentation_apk", + doc = "Returns the instrumentation APK that should be executed.", + structField = true + ) public Artifact getInstrumentationApk() { return instrumentationApk; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java index b084e0f60f..937dee2664 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java @@ -1033,7 +1033,7 @@ public final class AndroidRuleClasses { .exec() .value(env.getToolsLabel("//tools/android:zip_filter"))) .removeAttribute("data") - .advertiseProvider(ApkProvider.class) + .advertiseSkylarkProvider(ApkInfo.PROVIDER.id()) .advertiseSkylarkProvider(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey())) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApkInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApkInfo.java new file mode 100644 index 0000000000..0e2556f672 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApkInfo.java @@ -0,0 +1,90 @@ +// Copyright 2015 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.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.packages.NativeInfo; +import com.google.devtools.build.lib.packages.NativeProvider; +import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; +import javax.annotation.Nullable; + +/** A provider for targets that produce an apk file. */ +@SkylarkModule( + name = "ApkInfo", + doc = "APKs provided by a rule", + category = SkylarkModuleCategory.PROVIDER +) +@Immutable +public class ApkInfo extends NativeInfo { + + private static final String SKYLARK_NAME = "ApkInfo"; + public static final NativeProvider<ApkInfo> PROVIDER = + new NativeProvider<ApkInfo>(ApkInfo.class, SKYLARK_NAME) {}; + + private final Artifact apk; + private final Artifact unsignedApk; + @Nullable + private final Artifact coverageMetadata; + private final Artifact mergedManifest; + private final Artifact keystore; + + ApkInfo( + Artifact apk, + Artifact unsignedApk, + @Nullable Artifact coverageMetadata, + Artifact mergedManifest, + Artifact keystore) { + super(PROVIDER); + this.apk = apk; + this.unsignedApk = unsignedApk; + this.coverageMetadata = coverageMetadata; + this.mergedManifest = mergedManifest; + this.keystore = keystore; + } + + /** Returns the APK file built in the transitive closure. */ + @SkylarkCallable( + name = "signed_apk", + doc = "Returns a signed APK built from the target.", + structField = true + + ) + public Artifact getApk() { + return apk; + } + + /** Returns the unsigned APK file built in the transitive closure. */ + public Artifact getUnsignedApk() { + return unsignedApk; + } + + /** Returns the coverage metadata artifacts generated in the transitive closure. */ + @Nullable + public Artifact getCoverageMetadata() { + return coverageMetadata; + } + + /** Returns the merged manifest. */ + public Artifact getMergedManifest() { + return mergedManifest; + } + + /* The keystore that was used to sign the apk returned from {@see getApk() */ + public Artifact getKeystore() { + return keystore; + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApkProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApkProvider.java deleted file mode 100644 index 534e24ad3e..0000000000 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ApkProvider.java +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2015 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.auto.value.AutoValue; -import com.google.devtools.build.lib.actions.Artifact; -import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; -import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; -import javax.annotation.Nullable; - -/** A provider for targets that produce an apk file. */ -@AutoValue -@Immutable -public abstract class ApkProvider implements TransitiveInfoProvider { - - public static ApkProvider create( - Artifact apk, - Artifact unsignedApk, - @Nullable Artifact coverageMetadata, - Artifact mergedManifest, - Artifact keystore) { - return new AutoValue_ApkProvider(apk, unsignedApk, coverageMetadata, mergedManifest, keystore); - } - - /** Returns the APK file built in the transitive closure. */ - public abstract Artifact getApk(); - - /** Returns the unsigned APK file built in the transitive closure. */ - public abstract Artifact getUnsignedApk(); - - /** Returns the coverage metadata artifacts generated in the transitive closure. */ - @Nullable - public abstract Artifact getCoverageMetadata(); - - /** Returns the merged manifest. */ - public abstract Artifact getMergedManifest(); - - /* The keystore that was used to sign the apk returned from {@see getApk() */ - public abstract Artifact getKeystore(); - - ApkProvider() {} -} |