diff --git a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
index 8defc66..202d1da 100644
--- a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
@@ -16,9 +16,11 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.ByteSource;
+import com.google.devtools.build.lib.actions.ActionOwner;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.Root;
 import com.google.devtools.build.lib.analysis.Aspect;
+import com.google.devtools.build.lib.analysis.Aspect.Builder;
 import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
@@ -26,6 +28,7 @@
 import com.google.devtools.build.lib.analysis.actions.BinaryFileWriteAction;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.AndroidSdkRuleInfo;
 import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.ArtifactLocation;
 import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.JavaRuleIdeInfo;
 import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.LibraryArtifact;
@@ -33,9 +36,13 @@
 import com.google.devtools.build.lib.packages.AspectDefinition;
 import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.Rule;
+import com.google.devtools.build.lib.packages.Type;
+import com.google.devtools.build.lib.rules.android.AndroidSdkProvider;
 import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider;
+import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
+import com.google.protobuf.MessageLite;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -46,9 +53,13 @@
  */
 public class AndroidStudioInfoAspect implements ConfiguredAspectFactory {
   public static final String NAME = "AndroidStudioInfoAspect";
+
+  // Output groups.
   public static final String IDE_RESOLVE = "ide-resolve";
   public static final String IDE_BUILD = "ide-build";
-  public static final String IDE_BUILD_SUFFIX = ".aswb-build";
+
+  // File suffixes.
+  public static final String ASWB_BUILD_SUFFIX = ".aswb-build";
 
   @Override
   public AspectDefinition getDefinition() {
@@ -61,25 +72,48 @@
   @Override
   public Aspect create(ConfiguredTarget base, RuleContext ruleContext,
       AspectParameters parameters) {
+    Aspect.Builder builder = new Builder(NAME);
+
+    // Collect ide build files.
     NestedSetBuilder<Artifact> ideBuildFilesBuilder = NestedSetBuilder.stableOrder();
-    Iterable<AndroidStudioInfoFilesProvider> deps =
-        ruleContext.getPrerequisites("deps", Mode.TARGET, AndroidStudioInfoFilesProvider.class);
-    for (AndroidStudioInfoFilesProvider dep : deps) {
-      ideBuildFilesBuilder.addTransitive(dep.getIdeBuildFiles());
+    if (ruleContext.attributes().has("deps", Type.LABEL_LIST)) {
+      Iterable<AndroidStudioInfoFilesProvider> deps =
+          ruleContext.getPrerequisites("deps", Mode.TARGET, AndroidStudioInfoFilesProvider.class);
+      for (AndroidStudioInfoFilesProvider dep : deps) {
+        ideBuildFilesBuilder.addTransitive(dep.getIdeBuildFiles());
+      }
     }
 
-    RuleIdeInfo.Kind ruleKind = getRuleKind(ruleContext.getRule());
+    RuleIdeInfo.Kind ruleKind = getRuleKind(ruleContext.getRule(), base);
     if (ruleKind != RuleIdeInfo.Kind.UNRECOGNIZED) {
       Artifact ideBuildFile = createIdeBuildArtifact(base, ruleContext, ruleKind);
       ideBuildFilesBuilder.add(ideBuildFile);
     }
 
     NestedSet<Artifact> ideBuildFiles = ideBuildFilesBuilder.build();
-    return new Aspect.Builder(NAME)
+    builder
         .addOutputGroup(IDE_BUILD, ideBuildFiles)
         .addProvider(
-            AndroidStudioInfoFilesProvider.class, new AndroidStudioInfoFilesProvider(ideBuildFiles))
-        .build();
+            AndroidStudioInfoFilesProvider.class,
+            new AndroidStudioInfoFilesProvider(ideBuildFiles));
+
+    return builder.build();
+  }
+
+  private static AndroidSdkRuleInfo makeAndroidSdkRuleInfo(RuleContext ruleContext,
+      AndroidSdkProvider provider) {
+    AndroidSdkRuleInfo.Builder sdkInfoBuilder = AndroidSdkRuleInfo.newBuilder();
+
+    Path androidSdkDirectory = provider.getAndroidJar().getPath().getParentDirectory();
+    sdkInfoBuilder.setAndroidSdkPath(androidSdkDirectory.toString());
+
+    Root genfilesDirectory = ruleContext.getConfiguration().getGenfilesDirectory();
+    sdkInfoBuilder.setGenfilesPath(genfilesDirectory.getPath().toString());
+
+    Path binfilesPath = ruleContext.getConfiguration().getBinDirectory().getPath();
+    sdkInfoBuilder.setBinPath(binfilesPath.toString());
+
+    return sdkInfoBuilder.build();
   }
 
   private Artifact createIdeBuildArtifact(
@@ -105,33 +139,33 @@
 
     outputBuilder.setKind(ruleKind);
 
-    // Calculate source files.
-    JavaSourceInfoProvider sourceInfoProvider = base.getProvider(JavaSourceInfoProvider.class);
-    Collection<Artifact> sourceFiles =
-        sourceInfoProvider != null
-            ? sourceInfoProvider.getSourceFiles()
-            : ImmutableList.<Artifact>of();
-    for (Artifact sourceFile : sourceFiles) {
-      outputBuilder.addSources(makeArtifactLocation(sourceFile));
+    if (ruleKind == RuleIdeInfo.Kind.JAVA_LIBRARY) {
+      outputBuilder.setJavaRuleIdeInfo(makeJavaRuleIdeInfo(base));
+    } else if (ruleKind == RuleIdeInfo.Kind.ANDROID_SDK) {
+      outputBuilder.setAndroidSdkRuleInfo(
+          makeAndroidSdkRuleInfo(ruleContext, base.getProvider(AndroidSdkProvider.class)));
     }
 
-    outputBuilder.setJavaRuleIdeInfo(makeJavaRuleIdeInfo(base));
-
     final RuleIdeInfo ruleIdeInfo = outputBuilder.build();
     ruleContext.registerAction(
-        new BinaryFileWriteAction(
-            ruleContext.getActionOwner(),
-            ideBuildFile,
-            new ByteSource() {
-              @Override
-              public InputStream openStream() throws IOException {
-                return ruleIdeInfo.toByteString().newInput();
-              }
-            },
-            /*makeExecutable =*/ false));
+        makeProtoWriteAction(ruleContext.getActionOwner(), ruleIdeInfo, ideBuildFile));
     return ideBuildFile;
   }
 
+  private static BinaryFileWriteAction makeProtoWriteAction(
+      ActionOwner actionOwner, final MessageLite message, Artifact artifact) {
+    return new BinaryFileWriteAction(
+        actionOwner,
+        artifact,
+        new ByteSource() {
+          @Override
+          public InputStream openStream() throws IOException {
+            return message.toByteString().newInput();
+          }
+        },
+        /*makeExecutable =*/ false);
+  }
+
   private static ArtifactLocation makeArtifactLocation(Artifact artifact) {
     return ArtifactLocation.newBuilder()
         .setRootPath(artifact.getRoot().getPath().toString())
@@ -176,6 +210,16 @@
       }
     }
 
+    // Calculate source files.
+    JavaSourceInfoProvider sourceInfoProvider = base.getProvider(JavaSourceInfoProvider.class);
+    Collection<Artifact> sourceFiles =
+        sourceInfoProvider != null
+            ? sourceInfoProvider.getSourceFiles()
+            : ImmutableList.<Artifact>of();
+    for (Artifact sourceFile : sourceFiles) {
+      builder.addSources(makeArtifactLocation(sourceFile));
+    }
+
     return builder.build();
   }
 
@@ -183,13 +227,15 @@
     PathFragment packagePathFragment =
         ruleContext.getLabel().getPackageIdentifier().getPathFragment();
     String name = base.getLabel().getName();
-    return new PathFragment(packagePathFragment, new PathFragment(name + IDE_BUILD_SUFFIX));
+    return new PathFragment(packagePathFragment, new PathFragment(name + ASWB_BUILD_SUFFIX));
   }
 
-  private RuleIdeInfo.Kind getRuleKind(Rule rule) {
+  private RuleIdeInfo.Kind getRuleKind(Rule rule, ConfiguredTarget base) {
     RuleIdeInfo.Kind kind;
     if ("java_library".equals(rule.getRuleClassObject().getName())) {
       kind = RuleIdeInfo.Kind.JAVA_LIBRARY;
+    } else if (base.getProvider(AndroidSdkProvider.class) != null) {
+      kind = RuleIdeInfo.Kind.ANDROID_SDK;
     } else {
       kind = RuleIdeInfo.Kind.UNRECOGNIZED;
     }
