aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar asteinb <asteinb@google.com>2018-05-31 13:52:03 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-05-31 13:53:18 -0700
commitd3c3ea70845389168428f04d544c9441df96c6da (patch)
tree449c53baab38bb96e4e58da9a000f04c05136108
parent8d772dd9f9cb18ff3457d47d4714bce27da1684f (diff)
Migrate remaining Android Skylark API to skylarkbuildapi
I don't know much about most of this code, but there should be no functional changes. RELNOTES: none PiperOrigin-RevId: 198773657
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidDeviceBrokerInfo.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidDex2OatInfo.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java26
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidNativeLibsInfo.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidProguardInfo.java33
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java153
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java127
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkCommon.java38
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApkInfo.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidConfigurationApi.java24
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDeviceBrokerInfoApi.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDex2OatInfoApi.java24
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidInstrumentationInfoApi.java42
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidNativeLibsInfoApi.java34
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidProguardInfoApi.java40
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkApiProviderApi.java153
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkCommonApi.java51
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSplitTransititionApi.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ApkInfoApi.java34
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/BUILD3
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/BUILD2
22 files changed, 599 insertions, 290 deletions
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 77e2a87ec9..2d41d78d29 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
@@ -37,8 +37,7 @@ import com.google.devtools.build.lib.rules.cpp.CppConfiguration.DynamicMode;
import com.google.devtools.build.lib.rules.cpp.CppOptions.DynamicModeConverter;
import com.google.devtools.build.lib.rules.cpp.CppOptions.LibcTopLabelConverter;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidConfigurationApi;
import com.google.devtools.common.options.Converters;
import com.google.devtools.common.options.EnumConverter;
import com.google.devtools.common.options.Option;
@@ -50,13 +49,9 @@ import javax.annotation.Nullable;
/** Configuration fragment for Android rules. */
@AutoCodec
-@SkylarkModule(
- name = "android",
- doc = "A configuration fragment for Android.",
- category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT
-)
@Immutable
-public class AndroidConfiguration extends BuildConfiguration.Fragment {
+public class AndroidConfiguration extends BuildConfiguration.Fragment
+ implements AndroidConfigurationApi {
/**
* Converter for {@link
* com.google.devtools.build.lib.rules.android.AndroidConfiguration.ConfigurationDistinguisher}
@@ -1069,11 +1064,10 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
}
@SkylarkConfigurationField(
- name = "android_sdk_label",
- doc = "Returns the target denoted by the value of the --android_sdk flag",
- defaultLabel = AndroidRuleClasses.DEFAULT_SDK,
- defaultInToolRepository = true
- )
+ name = "android_sdk_label",
+ doc = "Returns the target denoted by the value of the --android_sdk flag",
+ defaultLabel = AndroidRuleClasses.DEFAULT_SDK,
+ defaultInToolRepository = true)
public Label getSdk() {
return sdk;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDeviceBrokerInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDeviceBrokerInfo.java
index 840d5026d0..ac8c3c9714 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDeviceBrokerInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDeviceBrokerInfo.java
@@ -18,15 +18,15 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.packages.NativeInfo;
import com.google.devtools.build.lib.packages.NativeProvider;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidDeviceBrokerInfoApi;
import com.google.devtools.build.lib.syntax.Environment;
import com.google.devtools.build.lib.syntax.FunctionSignature;
import com.google.devtools.build.lib.syntax.SkylarkType;
/** Supplies the device broker type string, passed to the Android test runtime. */
-@SkylarkModule(name = "AndroidDeviceBrokerInfo", doc = "", documented = false)
@Immutable
-public final class AndroidDeviceBrokerInfo extends NativeInfo {
+public final class AndroidDeviceBrokerInfo extends NativeInfo
+ implements AndroidDeviceBrokerInfoApi {
private static final String SKYLARK_NAME = "AndroidDeviceBrokerInfo";
private static final FunctionSignature.WithValues<Object, SkylarkType> SIGNATURE =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDex2OatInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDex2OatInfo.java
index 357be65a8b..4ebb089da1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDex2OatInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDex2OatInfo.java
@@ -18,7 +18,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.packages.NativeInfo;
import com.google.devtools.build.lib.packages.NativeProvider;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidDex2OatInfoApi;
import com.google.devtools.build.lib.syntax.Environment;
import com.google.devtools.build.lib.syntax.FunctionSignature;
import com.google.devtools.build.lib.syntax.SkylarkType;
@@ -27,9 +27,8 @@ import com.google.devtools.build.lib.syntax.SkylarkType;
* Supplies the pregenerate_oat_files_for_tests attribute of type boolean provided by android_device
* rule.
*/
-@SkylarkModule(name = "AndroidDex2OatInfo", doc = "", documented = false)
@Immutable
-public final class AndroidDex2OatInfo extends NativeInfo {
+public final class AndroidDex2OatInfo extends NativeInfo implements AndroidDex2OatInfoApi {
private static final String SKYLARK_NAME = "AndroidDex2OatInfo";
private static final FunctionSignature.WithValues<Object, SkylarkType> SIGNATURE =
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 9dfe2ef2b7..00c3ed9b98 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
@@ -19,9 +19,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.events.Location;
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 com.google.devtools.build.lib.skylarkbuildapi.android.AndroidInstrumentationInfoApi;
import com.google.devtools.build.lib.syntax.Environment;
import com.google.devtools.build.lib.syntax.FunctionSignature;
import com.google.devtools.build.lib.syntax.SkylarkType;
@@ -29,13 +27,9 @@ import com.google.devtools.build.lib.syntax.SkylarkType;
/**
* 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 {
+public class AndroidInstrumentationInfo extends NativeInfo
+ implements AndroidInstrumentationInfoApi<Artifact> {
private static final String SKYLARK_NAME = "AndroidInstrumentationInfo";
private static final FunctionSignature.WithValues<Object, SkylarkType> SIGNATURE =
@@ -50,7 +44,7 @@ public class AndroidInstrumentationInfo extends NativeInfo {
"instrumentation_apk"),
/*defaultValues=*/ null,
/*types=*/ ImmutableList.of(
- SkylarkType.of(Artifact.class), // target_apk
+ SkylarkType.of(Artifact.class), // target_apk
SkylarkType.of(Artifact.class))); // instrumentation_apk
public static final NativeProvider<AndroidInstrumentationInfo> PROVIDER =
new NativeProvider<AndroidInstrumentationInfo>(
@@ -72,20 +66,12 @@ public class AndroidInstrumentationInfo extends NativeInfo {
this.instrumentationApk = instrumentationApk;
}
- @SkylarkCallable(
- name = "target_apk",
- doc = "Returns the target APK of the instrumentation test.",
- structField = true
- )
+ @Override
public Artifact getTargetApk() {
return targetApk;
}
- @SkylarkCallable(
- name = "instrumentation_apk",
- doc = "Returns the instrumentation APK that should be executed.",
- structField = true
- )
+ @Override
public Artifact getInstrumentationApk() {
return instrumentationApk;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNativeLibsInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNativeLibsInfo.java
index e6804eee39..d73d302dcc 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNativeLibsInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNativeLibsInfo.java
@@ -20,8 +20,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.events.Location;
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.skylarkbuildapi.android.AndroidNativeLibsInfoApi;
import com.google.devtools.build.lib.syntax.Environment;
import com.google.devtools.build.lib.syntax.FunctionSignature;
import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
@@ -31,9 +30,9 @@ import com.google.devtools.build.lib.syntax.SkylarkType;
* Provider of transitively available ZIPs of native libs that should be directly copied into the
* APK.
*/
-@SkylarkModule(name = "AndroidNativeLibsInfo", doc = "", documented = false)
@Immutable
-public final class AndroidNativeLibsInfo extends NativeInfo {
+public final class AndroidNativeLibsInfo extends NativeInfo
+ implements AndroidNativeLibsInfoApi<Artifact> {
private static final String SKYLARK_NAME = "AndroidNativeLibsInfo";
private static final FunctionSignature.WithValues<Object, SkylarkType> SIGNATURE =
@@ -65,11 +64,7 @@ public final class AndroidNativeLibsInfo extends NativeInfo {
this.nativeLibs = nativeLibs;
}
- @SkylarkCallable(
- name = "native_libs",
- doc = "Returns the native libraries produced by the rule.",
- structField = true
- )
+ @Override
public NestedSet<Artifact> getNativeLibs() {
return nativeLibs;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidProguardInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidProguardInfo.java
index 186002296d..ed0e67da49 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidProguardInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidProguardInfo.java
@@ -20,19 +20,18 @@ import com.google.devtools.build.lib.packages.BuiltinProvider;
import com.google.devtools.build.lib.packages.NativeInfo;
import com.google.devtools.build.lib.rules.java.ProguardLibrary;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkConstructor;
+import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidProguardInfoApi;
/**
- * A target that can provide local proguard specifications, returned by the
- * {@link ProguardLibrary#collectLocalProguardSpecs()} method.
- * <p> This class provides additional data, not available in the pure native
- * {@link com.google.devtools.build.lib.rules.java.ProguardSpecProvider} provider.
+ * A target that can provide local proguard specifications, returned by the {@link
+ * ProguardLibrary#collectLocalProguardSpecs()} method.
+ *
+ * <p>This class provides additional data, not available in the pure native {@link
+ * com.google.devtools.build.lib.rules.java.ProguardSpecProvider} provider.
*/
@AutoCodec
@Immutable
-public class AndroidProguardInfo extends NativeInfo {
- public static final String PROVIDER_NAME = "AndroidProguardInfo";
+public class AndroidProguardInfo extends NativeInfo implements AndroidProguardInfoApi<Artifact> {
public static final Provider PROVIDER = new Provider();
private final ImmutableList<Artifact> localProguardSpecs;
@@ -42,11 +41,7 @@ public class AndroidProguardInfo extends NativeInfo {
this.localProguardSpecs = localProguardSpecs;
}
- @SkylarkCallable(
- name = "local_proguard_specs",
- structField = true,
- doc = "Returns the local proguard specs defined by this target."
- )
+ @Override
public ImmutableList<Artifact> getLocalProguardSpecs() {
return localProguardSpecs;
}
@@ -58,14 +53,10 @@ public class AndroidProguardInfo extends NativeInfo {
private Provider() {
super(PROVIDER_NAME, AndroidProguardInfo.class);
}
+ }
- @SkylarkCallable(
- name = PROVIDER_NAME,
- doc = "The <code>AndroidProguardInfo</code> constructor.",
- selfCall = true)
- @SkylarkConstructor(objectType = AndroidProguardInfo.class)
- public AndroidProguardInfo androidProguardInfo(ImmutableList<Artifact> localProguardSpecs) {
- return new AndroidProguardInfo(localProguardSpecs);
- }
+ @Override
+ public AndroidProguardInfo androidProguardInfo(ImmutableList<Artifact> localProguardSpecs) {
+ return new AndroidProguardInfo(localProguardSpecs);
}
}
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 3ed06c9807..cd39c8b33b 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
@@ -60,8 +60,8 @@ import com.google.devtools.build.lib.rules.java.JavaRuleClasses;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
import com.google.devtools.build.lib.rules.java.ProguardHelper;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidSplitTransititionApi;
import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.FileType;
import com.google.devtools.build.lib.util.FileTypeSet;
@@ -206,9 +206,12 @@ public final class AndroidRuleClasses {
}
@AutoCodec
- public static final SplitTransition ANDROID_SPLIT_TRANSITION = new AndroidSplitTransition();
+ public static final AndroidSplitTransition ANDROID_SPLIT_TRANSITION =
+ new AndroidSplitTransition();
- private static final class AndroidSplitTransition implements SplitTransition, SkylarkValue {
+ /** Android Split configuration transition for properly handling native dependencies */
+ public static final class AndroidSplitTransition
+ implements SplitTransition, AndroidSplitTransititionApi {
private static void setCrosstoolToAndroid(BuildOptions output, BuildOptions input) {
AndroidConfiguration.Options inputAndroidOptions =
input.get(AndroidConfiguration.Options.class);
@@ -375,79 +378,97 @@ public final class AndroidRuleClasses {
// build_tools_version is assumed to be the latest version if omitted.
.add(attr("build_tools_version", STRING))
// This is the Proguard that comes from the --proguard_top attribute.
- .add(attr(":proguard", LABEL)
- .cfg(HostTransition.INSTANCE)
- .value(JavaSemantics.PROGUARD).exec())
+ .add(
+ attr(":proguard", LABEL)
+ .cfg(HostTransition.INSTANCE)
+ .value(JavaSemantics.PROGUARD)
+ .exec())
// This is the Proguard in the BUILD file that contains the android_sdk rule. Used when
// --proguard_top is not specified.
- .add(attr("proguard", LABEL).mandatory()
- .cfg(HostTransition.INSTANCE)
- .allowedFileTypes(ANY_FILE)
- .exec())
- .add(attr("aapt", LABEL).mandatory()
- .cfg(HostTransition.INSTANCE)
- .allowedFileTypes(ANY_FILE)
- .exec())
- .add(attr("aapt2", LABEL)
- .cfg(HostTransition.INSTANCE)
- .allowedFileTypes(ANY_FILE)
- .exec())
- .add(attr("dx", LABEL).mandatory()
- .cfg(HostTransition.INSTANCE)
- .allowedFileTypes(ANY_FILE)
- .exec())
+ .add(
+ attr("proguard", LABEL)
+ .mandatory()
+ .cfg(HostTransition.INSTANCE)
+ .allowedFileTypes(ANY_FILE)
+ .exec())
+ .add(
+ attr("aapt", LABEL)
+ .mandatory()
+ .cfg(HostTransition.INSTANCE)
+ .allowedFileTypes(ANY_FILE)
+ .exec())
+ .add(attr("aapt2", LABEL).cfg(HostTransition.INSTANCE).allowedFileTypes(ANY_FILE).exec())
+ .add(
+ attr("dx", LABEL)
+ .mandatory()
+ .cfg(HostTransition.INSTANCE)
+ .allowedFileTypes(ANY_FILE)
+ .exec())
.add(
attr("main_dex_list_creator", LABEL)
.mandatory()
.cfg(HostTransition.INSTANCE)
.allowedFileTypes(ANY_FILE)
.exec())
- .add(attr("adb", LABEL)
- .mandatory()
- .cfg(HostTransition.INSTANCE)
- .allowedFileTypes(ANY_FILE)
- .exec())
- .add(attr("framework_aidl", LABEL)
- .mandatory()
- .cfg(HostTransition.INSTANCE)
- .allowedFileTypes(ANY_FILE))
- .add(attr("aidl", LABEL)
- .mandatory()
- .cfg(HostTransition.INSTANCE)
- .allowedFileTypes(ANY_FILE)
- .exec())
+ .add(
+ attr("adb", LABEL)
+ .mandatory()
+ .cfg(HostTransition.INSTANCE)
+ .allowedFileTypes(ANY_FILE)
+ .exec())
+ .add(
+ attr("framework_aidl", LABEL)
+ .mandatory()
+ .cfg(HostTransition.INSTANCE)
+ .allowedFileTypes(ANY_FILE))
+ .add(
+ attr("aidl", LABEL)
+ .mandatory()
+ .cfg(HostTransition.INSTANCE)
+ .allowedFileTypes(ANY_FILE)
+ .exec())
.add(attr("aidl_lib", LABEL).allowedFileTypes(JavaSemantics.JAR))
- .add(attr("android_jar", LABEL)
- .mandatory()
- .cfg(HostTransition.INSTANCE)
- .allowedFileTypes(JavaSemantics.JAR))
+ .add(
+ attr("android_jar", LABEL)
+ .mandatory()
+ .cfg(HostTransition.INSTANCE)
+ .allowedFileTypes(JavaSemantics.JAR))
// TODO(b/67903726): Make this attribute mandatory after updating all android_sdk rules.
- .add(attr("source_properties", LABEL)
- .cfg(HostTransition.INSTANCE)
- .allowedFileTypes(ANY_FILE))
- .add(attr("shrinked_android_jar", LABEL)
- .mandatory()
- .cfg(HostTransition.INSTANCE)
- .allowedFileTypes(ANY_FILE))
- .add(attr("annotations_jar", LABEL)
- .cfg(HostTransition.INSTANCE)
- .allowedFileTypes(ANY_FILE))
- .add(attr("main_dex_classes", LABEL)
- .mandatory().cfg(HostTransition.INSTANCE)
- .allowedFileTypes(ANY_FILE))
- .add(attr("apkbuilder", LABEL)
- .cfg(HostTransition.INSTANCE)
- .allowedFileTypes(ANY_FILE)
- .exec())
- .add(attr("apksigner", LABEL)
- .mandatory()
- .cfg(HostTransition.INSTANCE)
- .allowedFileTypes(ANY_FILE)
- .exec())
- .add(attr("zipalign", LABEL)
- .mandatory()
- .cfg(HostTransition.INSTANCE)
- .allowedFileTypes(ANY_FILE).exec())
+ .add(
+ attr("source_properties", LABEL)
+ .cfg(HostTransition.INSTANCE)
+ .allowedFileTypes(ANY_FILE))
+ .add(
+ attr("shrinked_android_jar", LABEL)
+ .mandatory()
+ .cfg(HostTransition.INSTANCE)
+ .allowedFileTypes(ANY_FILE))
+ .add(
+ attr("annotations_jar", LABEL)
+ .cfg(HostTransition.INSTANCE)
+ .allowedFileTypes(ANY_FILE))
+ .add(
+ attr("main_dex_classes", LABEL)
+ .mandatory()
+ .cfg(HostTransition.INSTANCE)
+ .allowedFileTypes(ANY_FILE))
+ .add(
+ attr("apkbuilder", LABEL)
+ .cfg(HostTransition.INSTANCE)
+ .allowedFileTypes(ANY_FILE)
+ .exec())
+ .add(
+ attr("apksigner", LABEL)
+ .mandatory()
+ .cfg(HostTransition.INSTANCE)
+ .allowedFileTypes(ANY_FILE)
+ .exec())
+ .add(
+ attr("zipalign", LABEL)
+ .mandatory()
+ .cfg(HostTransition.INSTANCE)
+ .allowedFileTypes(ANY_FILE)
+ .exec())
.add(
attr(":java_toolchain", LABEL)
.useOutputLicenses()
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java
index c69902f324..c4b010385e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java
@@ -25,9 +25,7 @@ import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar;
-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 com.google.devtools.build.lib.skylarkbuildapi.android.AndroidSkylarkApiProviderApi;
import java.util.function.Function;
import javax.annotation.Nullable;
@@ -35,17 +33,9 @@ import javax.annotation.Nullable;
* A class that exposes the Android providers to Skylark. It is intended to provide a simple and
* stable interface for Skylark users.
*/
-@SkylarkModule(
- name = "AndroidSkylarkApiProvider",
- title = "android",
- category = SkylarkModuleCategory.PROVIDER,
- doc =
- "Provides access to information about Android rules. Every Android-related target provides "
- + "this struct, accessible as a <code>android</code> field on a "
- + "<a href=\"Target.html\">target</a>."
-)
@Immutable
-public class AndroidSkylarkApiProvider extends SkylarkApiProvider {
+public class AndroidSkylarkApiProvider extends SkylarkApiProvider
+ implements AndroidSkylarkApiProviderApi<Artifact> {
/** The name of the field in Skylark used to access this class. */
public static final String NAME = "android";
@@ -56,12 +46,7 @@ public class AndroidSkylarkApiProvider extends SkylarkApiProvider {
this.resourceInfo = resourceInfo;
}
- @SkylarkCallable(
- name = "apk",
- structField = true,
- allowReturnNones = true,
- doc = "Returns an APK produced by this target."
- )
+ @Override
public Artifact getApk() {
return getIdeInfoProvider().getSignedApk();
}
@@ -70,111 +55,58 @@ public class AndroidSkylarkApiProvider extends SkylarkApiProvider {
return getInfo().getProvider(AndroidIdeInfoProvider.class);
}
- @SkylarkCallable(
- name = "java_package",
- structField = true,
- allowReturnNones = true,
- doc = "Returns a java package for this target."
- )
+ @Override
public String getJavaPackage() {
return getIdeInfoProvider().getJavaPackage();
}
- @SkylarkCallable(
- name = "manifest",
- structField = true,
- allowReturnNones = true,
- doc = "Returns a manifest file for this target."
- )
+ @Override
public Artifact getManifest() {
return getIdeInfoProvider().getManifest();
}
- @SkylarkCallable(
- name = "merged_manifest",
- structField = true,
- allowReturnNones = true,
- doc = "Returns a manifest file for this target after all processing, e.g.: merging, etc."
- )
+ @Override
public Artifact getMergedManifest() {
return getIdeInfoProvider().getGeneratedManifest();
}
- @SkylarkCallable(
- name = "native_libs",
- structField = true,
- doc =
- "Returns the native libraries as a dictionary of the libraries' architecture as a string "
- + "to a set of the native library files, or the empty dictionary if there are no "
- + "native libraries."
- )
+ @Override
public ImmutableMap<String, NestedSet<Artifact>> getNativeLibs() {
return getIdeInfoProvider().getNativeLibs();
}
- @SkylarkCallable(
- name = "resource_apk",
- structField = true,
- doc = "Returns the resources container for the target."
- )
+ @Override
public Artifact getResourceApk() {
return getIdeInfoProvider().getResourceApk();
}
- @SkylarkCallable(
- name = "apks_under_test",
- structField = true,
- allowReturnNones = true,
- doc = "Returns a collection of APKs that this target tests."
- )
+ @Override
public ImmutableCollection<Artifact> getApksUnderTest() {
return getIdeInfoProvider().getApksUnderTest();
}
- @SkylarkCallable(
- name = "defines_resources",
- structField = true,
- doc = "Returns <code>True</code> if the target defines any Android resources directly."
- )
+ @Override
public boolean definesAndroidResources() {
return getIdeInfoProvider().definesAndroidResources();
}
- @SkylarkCallable(
- name = "idl",
- structField = true,
- doc = "Returns information about IDL files associated with this target."
- )
+ @Override
public IdlInfo getIdlInfo() {
return idlInfo;
}
- @SkylarkCallable(
- name = "resources",
- structField = true,
- doc = "Returns resources defined by this target."
- )
+ @Override
public NestedSet<Artifact> getResources() {
return collectDirectArtifacts(ValidatedAndroidData::getResources);
}
- @SkylarkCallable(
- name = "resource_jar",
- structField = true,
- allowReturnNones = true,
- doc = "Returns a jar file for classes generated from resources."
- )
+ @Override
@Nullable
public JavaRuleOutputJarsProvider.OutputJar getResourceJar() {
return getIdeInfoProvider().getResourceJar();
}
- @SkylarkCallable(
- name = "aar",
- structField = true,
- allowReturnNones = true,
- doc = "Returns the aar output of this target."
- )
+ @Override
public Artifact getAar() {
return getIdeInfoProvider().getAar();
}
@@ -194,43 +126,24 @@ public class AndroidSkylarkApiProvider extends SkylarkApiProvider {
}
/** Helper class to provide information about IDLs related to this rule. */
- @SkylarkModule(
- name = "AndroidSkylarkIdlInfo",
- category = SkylarkModuleCategory.NONE,
- doc = "Provides access to information about Android rules."
- )
@Immutable
- public class IdlInfo {
- @SkylarkCallable(
- name = "import_root",
- structField = true,
- allowReturnNones = true,
- doc = "Returns the root of IDL packages if not the java root."
- )
+ public class IdlInfo implements IdlInfoApi<Artifact> {
+ @Override
public String getImportRoot() {
return getIdeInfoProvider().getIdlImportRoot();
}
- @SkylarkCallable(name = "sources", structField = true, doc = "Returns a list of IDL files.")
+ @Override
public ImmutableCollection<Artifact> getSources() {
return getIdeInfoProvider().getIdlSrcs();
}
- @SkylarkCallable(
- name = "generated_java_files",
- structField = true,
- doc = "Returns a list Java files generated from IDL sources."
- )
+ @Override
public ImmutableCollection<Artifact> getIdlGeneratedJavaFiles() {
return getIdeInfoProvider().getIdlGeneratedJavaFiles();
}
- @SkylarkCallable(
- name = "output",
- structField = true,
- allowReturnNones = true,
- doc = "Returns a jar file for classes generated from IDL sources."
- )
+ @Override
@Nullable
public JavaRuleOutputJarsProvider.OutputJar getIdlOutput() {
if (getIdeInfoProvider().getIdlClassJar() == null) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkCommon.java
index 7bcf8f35ff..fd02d258e0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkCommon.java
@@ -14,49 +14,25 @@
package com.google.devtools.build.lib.rules.android;
import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
-import com.google.devtools.build.lib.skylarkinterface.Param;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidSkylarkCommonApi;
+import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidSplitTransititionApi;
import com.google.devtools.build.lib.vfs.PathFragment;
/** Common utilities for Skylark rules related to Android. */
-@SkylarkModule(
- name = "android_common",
- doc = "Common utilities and functionality related to Android rules."
-)
-public class AndroidSkylarkCommon {
+public class AndroidSkylarkCommon implements AndroidSkylarkCommonApi<Artifact> {
- @SkylarkCallable(
- name = "create_device_broker_info",
- documented = false,
- parameters = {@Param(name = "type", type = String.class)}
- )
+ @Override
public AndroidDeviceBrokerInfo createDeviceBrokerInfo(String deviceBrokerType) {
return new AndroidDeviceBrokerInfo(deviceBrokerType);
}
- @SkylarkCallable(
- name = "resource_source_directory",
- allowReturnNones = true,
- doc =
- "Returns a source directory for Android resource file. "
- + "The source directory is a prefix of resource's relative path up to "
- + "a directory that designates resource kind (cf. "
- + "http://developer.android.com/guide/topics/resources/providing-resources.html)."
- )
+ @Override
public PathFragment getSourceDirectoryRelativePathFromResource(Artifact resource) {
return AndroidCommon.getSourceDirectoryRelativePathFromResource(resource);
}
- @SkylarkCallable(
- name = "multi_cpu_configuration",
- doc =
- "A configuration for rule attributes that compiles native code according to "
- + "the --fat_apk_cpu and --android_crosstool_top flags.",
- structField = true
- )
- public SplitTransition getAndroidSplitTransition() {
+ @Override
+ public AndroidSplitTransititionApi getAndroidSplitTransition() {
return AndroidRuleClasses.ANDROID_SPLIT_TRANSITION;
}
}
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
index 0e2556f672..de7841dc57 100644
--- 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
@@ -17,19 +17,12 @@ 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 com.google.devtools.build.lib.skylarkbuildapi.android.ApkInfoApi;
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 {
+public class ApkInfo extends NativeInfo implements ApkInfoApi<Artifact> {
private static final String SKYLARK_NAME = "ApkInfo";
public static final NativeProvider<ApkInfo> PROVIDER =
@@ -56,13 +49,7 @@ public class ApkInfo extends NativeInfo {
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
-
- )
+ @Override
public Artifact getApk() {
return apk;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidConfigurationApi.java
new file mode 100644
index 0000000000..abc026c647
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidConfigurationApi.java
@@ -0,0 +1,24 @@
+// 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.skylarkbuildapi.android;
+
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+
+/** Configuration fragment for Android rules. */
+@SkylarkModule(
+ name = "android",
+ doc = "A configuration fragment for Android.",
+ category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT)
+public interface AndroidConfigurationApi {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDeviceBrokerInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDeviceBrokerInfoApi.java
new file mode 100644
index 0000000000..51c22729b2
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDeviceBrokerInfoApi.java
@@ -0,0 +1,21 @@
+// 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.skylarkbuildapi.android;
+
+import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+
+/** Supplies the device broker type string, passed to the Android test runtime. */
+@SkylarkModule(name = "AndroidDeviceBrokerInfo", doc = "", documented = false)
+public interface AndroidDeviceBrokerInfoApi extends StructApi {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDex2OatInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDex2OatInfoApi.java
new file mode 100644
index 0000000000..c1415a6805
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDex2OatInfoApi.java
@@ -0,0 +1,24 @@
+// Copyright 2017 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.skylarkbuildapi.android;
+
+import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+
+/**
+ * Supplies the pregenerate_oat_files_for_tests attribute of type boolean provided by android_device
+ * rule.
+ */
+@SkylarkModule(name = "AndroidDex2OatInfo", doc = "", documented = false)
+public interface AndroidDex2OatInfoApi extends StructApi {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidInstrumentationInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidInstrumentationInfoApi.java
new file mode 100644
index 0000000000..2022024551
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidInstrumentationInfoApi.java
@@ -0,0 +1,42 @@
+// Copyright 2017 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.skylarkbuildapi.android;
+
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
+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 Android testing rules.
+ */
+@SkylarkModule(
+ name = "AndroidInstrumentationInfo",
+ doc = "Android instrumentation and target APKs to run in a test",
+ category = SkylarkModuleCategory.PROVIDER)
+public interface AndroidInstrumentationInfoApi<FileT extends FileApi> extends StructApi {
+
+ @SkylarkCallable(
+ name = "target_apk",
+ doc = "Returns the target APK of the instrumentation test.",
+ structField = true)
+ FileT getTargetApk();
+
+ @SkylarkCallable(
+ name = "instrumentation_apk",
+ doc = "Returns the instrumentation APK that should be executed.",
+ structField = true)
+ FileT getInstrumentationApk();
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidNativeLibsInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidNativeLibsInfoApi.java
new file mode 100644
index 0000000000..6e1c154258
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidNativeLibsInfoApi.java
@@ -0,0 +1,34 @@
+// 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.skylarkbuildapi.android;
+
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+
+/**
+ * Provider of transitively available ZIPs of native libs that should be directly copied into the
+ * APK.
+ */
+@SkylarkModule(name = "AndroidNativeLibsInfo", doc = "", documented = false)
+public interface AndroidNativeLibsInfoApi<FileT extends FileApi> extends StructApi {
+
+ @SkylarkCallable(
+ name = "native_libs",
+ doc = "Returns the native libraries produced by the rule.",
+ structField = true)
+ NestedSet<FileT> getNativeLibs();
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidProguardInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidProguardInfoApi.java
new file mode 100644
index 0000000000..4750a51241
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidProguardInfoApi.java
@@ -0,0 +1,40 @@
+// 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.skylarkbuildapi.android;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkConstructor;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+
+/** A target that can provide local proguard specifications. */
+@SkylarkModule(name = "AndroidProguardInfo", doc = "", documented = false)
+public interface AndroidProguardInfoApi<FileT extends FileApi> extends StructApi {
+ String PROVIDER_NAME = "AndroidProguardInfo";
+
+ @SkylarkCallable(
+ name = "local_proguard_specs",
+ structField = true,
+ doc = "Returns the local proguard specs defined by this target.")
+ ImmutableList<FileT> getLocalProguardSpecs();
+
+ @SkylarkCallable(
+ name = PROVIDER_NAME,
+ doc = "The <code>AndroidProguardInfo</code> constructor.",
+ selfCall = true)
+ @SkylarkConstructor(objectType = AndroidProguardInfoApi.class)
+ AndroidProguardInfoApi<FileT> androidProguardInfo(ImmutableList<FileT> localProguardSpecs);
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkApiProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkApiProviderApi.java
new file mode 100644
index 0000000000..d86d5a0fab
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkApiProviderApi.java
@@ -0,0 +1,153 @@
+// 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.skylarkbuildapi.android;
+
+import com.google.common.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.java.OutputJarApi;
+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 class that exposes the Android providers to Skylark. It is intended to provide a simple and
+ * stable interface for Skylark users.
+ */
+@SkylarkModule(
+ name = "AndroidSkylarkApiProvider",
+ title = "android",
+ category = SkylarkModuleCategory.PROVIDER,
+ doc =
+ "Provides access to information about Android rules. Every Android-related target provides "
+ + "this struct, accessible as a <code>android</code> field on a "
+ + "<a href=\"Target.html\">target</a>.")
+public interface AndroidSkylarkApiProviderApi<FileT extends FileApi> {
+
+ @SkylarkCallable(
+ name = "apk",
+ structField = true,
+ allowReturnNones = true,
+ doc = "Returns an APK produced by this target.")
+ FileT getApk();
+
+ @SkylarkCallable(
+ name = "java_package",
+ structField = true,
+ allowReturnNones = true,
+ doc = "Returns a java package for this target.")
+ String getJavaPackage();
+
+ @SkylarkCallable(
+ name = "manifest",
+ structField = true,
+ allowReturnNones = true,
+ doc = "Returns a manifest file for this target.")
+ FileT getManifest();
+
+ @SkylarkCallable(
+ name = "merged_manifest",
+ structField = true,
+ allowReturnNones = true,
+ doc = "Returns a manifest file for this target after all processing, e.g.: merging, etc.")
+ FileT getMergedManifest();
+
+ @SkylarkCallable(
+ name = "native_libs",
+ structField = true,
+ doc =
+ "Returns the native libraries as a dictionary of the libraries' architecture as a string "
+ + "to a set of the native library files, or the empty dictionary if there are no "
+ + "native libraries.")
+ ImmutableMap<String, NestedSet<FileT>> getNativeLibs();
+
+ @SkylarkCallable(
+ name = "resource_apk",
+ structField = true,
+ doc = "Returns the resources container for the target.")
+ FileT getResourceApk();
+
+ @SkylarkCallable(
+ name = "apks_under_test",
+ structField = true,
+ allowReturnNones = true,
+ doc = "Returns a collection of APKs that this target tests.")
+ ImmutableCollection<FileT> getApksUnderTest();
+
+ @SkylarkCallable(
+ name = "defines_resources",
+ structField = true,
+ doc = "Returns <code>True</code> if the target defines any Android resources directly.")
+ boolean definesAndroidResources();
+
+ @SkylarkCallable(
+ name = "idl",
+ structField = true,
+ doc = "Returns information about IDL files associated with this target.")
+ IdlInfoApi<FileT> getIdlInfo();
+
+ @SkylarkCallable(
+ name = "resources",
+ structField = true,
+ doc = "Returns resources defined by this target.")
+ NestedSet<FileT> getResources();
+
+ @SkylarkCallable(
+ name = "resource_jar",
+ structField = true,
+ allowReturnNones = true,
+ doc = "Returns a jar file for classes generated from resources.")
+ @Nullable
+ OutputJarApi<FileT> getResourceJar();
+
+ @SkylarkCallable(
+ name = "aar",
+ structField = true,
+ allowReturnNones = true,
+ doc = "Returns the aar output of this target.")
+ FileT getAar();
+
+ /** Helper class to provide information about IDLs related to this rule. */
+ @SkylarkModule(
+ name = "AndroidSkylarkIdlInfo",
+ category = SkylarkModuleCategory.NONE,
+ doc = "Provides access to information about Android rules.")
+ interface IdlInfoApi<FileT extends FileApi> {
+ @SkylarkCallable(
+ name = "import_root",
+ structField = true,
+ allowReturnNones = true,
+ doc = "Returns the root of IDL packages if not the java root.")
+ String getImportRoot();
+
+ @SkylarkCallable(name = "sources", structField = true, doc = "Returns a list of IDL files.")
+ ImmutableCollection<FileT> getSources();
+
+ @SkylarkCallable(
+ name = "generated_java_files",
+ structField = true,
+ doc = "Returns a list Java files generated from IDL sources.")
+ ImmutableCollection<FileT> getIdlGeneratedJavaFiles();
+
+ @SkylarkCallable(
+ name = "output",
+ structField = true,
+ allowReturnNones = true,
+ doc = "Returns a jar file for classes generated from IDL sources.")
+ @Nullable
+ OutputJarApi<FileT> getIdlOutput();
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkCommonApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkCommonApi.java
new file mode 100644
index 0000000000..8ce6f621a1
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkCommonApi.java
@@ -0,0 +1,51 @@
+// 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.skylarkbuildapi.android;
+
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkinterface.Param;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.vfs.PathFragment;
+
+/** Common utilities for Skylark rules related to Android. */
+@SkylarkModule(
+ name = "android_common",
+ doc = "Common utilities and functionality related to Android rules.")
+public interface AndroidSkylarkCommonApi<FileT extends FileApi> {
+
+ @SkylarkCallable(
+ name = "create_device_broker_info",
+ documented = false,
+ parameters = {@Param(name = "type", type = String.class)})
+ AndroidDeviceBrokerInfoApi createDeviceBrokerInfo(String deviceBrokerType);
+
+ @SkylarkCallable(
+ name = "resource_source_directory",
+ allowReturnNones = true,
+ doc =
+ "Returns a source directory for Android resource file. "
+ + "The source directory is a prefix of resource's relative path up to "
+ + "a directory that designates resource kind (cf. "
+ + "http://developer.android.com/guide/topics/resources/providing-resources.html).")
+ PathFragment getSourceDirectoryRelativePathFromResource(FileT resource);
+
+ @SkylarkCallable(
+ name = "multi_cpu_configuration",
+ doc =
+ "A configuration for rule attributes that compiles native code according to "
+ + "the --fat_apk_cpu and --android_crosstool_top flags.",
+ structField = true)
+ AndroidSplitTransititionApi getAndroidSplitTransition();
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSplitTransititionApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSplitTransititionApi.java
new file mode 100644
index 0000000000..ef4286e644
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSplitTransititionApi.java
@@ -0,0 +1,21 @@
+// 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.skylarkbuildapi.android;
+
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
+
+/** Android configuration for properly handling native dependencies */
+@SkylarkModule(name = "android_split_transition", doc = "")
+public interface AndroidSplitTransititionApi extends SkylarkValue {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ApkInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ApkInfoApi.java
new file mode 100644
index 0000000000..b279e87170
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ApkInfoApi.java
@@ -0,0 +1,34 @@
+// 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.skylarkbuildapi.android;
+
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
+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 produce an apk file. */
+@SkylarkModule(
+ name = "ApkInfo",
+ doc = "APKs provided by a rule",
+ category = SkylarkModuleCategory.PROVIDER)
+public interface ApkInfoApi<FileT extends FileApi> extends StructApi {
+ /** Returns the APK file built in the transitive closure. */
+ @SkylarkCallable(
+ name = "signed_apk",
+ doc = "Returns a signed APK built from the target.",
+ structField = true)
+ FileT getApk();
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/BUILD b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/BUILD
index 0f91d61a2f..6829345752 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/BUILD
@@ -22,7 +22,10 @@ java_library(
"//src/main/java/com/google/devtools/build/lib:events",
"//src/main/java/com/google/devtools/build/lib:skylarkinterface",
"//src/main/java/com/google/devtools/build/lib:syntax",
+ "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
"//src/main/java/com/google/devtools/build/lib/skylarkbuildapi",
+ "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java",
+ "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//third_party:guava",
"//third_party:jsr305",
],
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/BUILD b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/BUILD
index 7c5169569a..59948ecfe6 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/BUILD
@@ -6,7 +6,7 @@
# those which contain pure-Skylark concepts, such as the interpreter or
# annotation interfaces).
-package(default_visibility = ["//src/main/java/com/google/devtools/build/lib:__pkg__"])
+package(default_visibility = ["//src:__subpackages__"])
licenses(["notice"]) # Apache 2.0