Update android_binary to take a SourcePath for its manifest parameter.

Summary:
In practice, we have been using genfile() to use a generated file as
a manifest for an android_binary(). This relaxes android_binary() to
accept a SourcePath, which will help us start to do away with genfile().

Test Plan: Sandcastle builds.
diff --git a/src/com/facebook/buck/android/AndroidBinaryBuildRuleFactory.java b/src/com/facebook/buck/android/AndroidBinaryBuildRuleFactory.java
index 3a20be3..fa804cf 100644
--- a/src/com/facebook/buck/android/AndroidBinaryBuildRuleFactory.java
+++ b/src/com/facebook/buck/android/AndroidBinaryBuildRuleFactory.java
@@ -38,9 +38,7 @@
   protected void amendBuilder(AndroidBinaryRule.Builder builder,
       BuildRuleFactoryParams params) throws NoSuchBuildTargetException {
     // manifest
-    String manifestAttribute = params.getRequiredStringAttribute("manifest");
-    String manifestPath = params.resolveFilePathRelativeToBuildFileDirectory(manifestAttribute);
-    builder.setManifest(manifestPath);
+    builder.setManifest(params.getRequiredSourcePath("manifest", builder));
 
     // target
     String target = params.getRequiredStringAttribute("target");
diff --git a/src/com/facebook/buck/android/AndroidBinaryRule.java b/src/com/facebook/buck/android/AndroidBinaryRule.java
index f6ece50..e5a1bc3 100644
--- a/src/com/facebook/buck/android/AndroidBinaryRule.java
+++ b/src/com/facebook/buck/android/AndroidBinaryRule.java
@@ -40,10 +40,10 @@
 import com.facebook.buck.rules.BuildableProperties;
 import com.facebook.buck.rules.DependencyGraph;
 import com.facebook.buck.rules.DoNotUseAbstractBuildable;
-import com.facebook.buck.rules.FileSourcePath;
 import com.facebook.buck.rules.InstallableBuildRule;
 import com.facebook.buck.rules.RuleKey;
 import com.facebook.buck.rules.SourcePath;
+import com.facebook.buck.rules.SourcePaths;
 import com.facebook.buck.shell.AbstractGenruleStep;
 import com.facebook.buck.shell.EchoStep;
 import com.facebook.buck.shell.SymlinkFilesIntoDirectoryStep;
@@ -59,6 +59,7 @@
 import com.facebook.buck.util.DirectoryTraverser;
 import com.facebook.buck.util.HumanReadableException;
 import com.facebook.buck.util.MorePaths;
+import com.facebook.buck.util.Optionals;
 import com.facebook.buck.zip.RepackZipEntriesStep;
 import com.facebook.buck.zip.ZipDirectoryWithMaxDeflateStep;
 import com.google.common.annotations.VisibleForTesting;
@@ -168,7 +169,7 @@
     }
   }
 
-  private final String manifest;
+  private final SourcePath manifest;
   private final String target;
   private final ImmutableSortedSet<BuildRule> classpathDeps;
   private final Keystore keystore;
@@ -209,7 +210,7 @@
    */
   protected AndroidBinaryRule(
       BuildRuleParams buildRuleParams,
-      String manifest,
+      SourcePath manifest,
       String target,
       ImmutableSortedSet<BuildRule> classpathDeps,
       Keystore keystore,
@@ -270,7 +271,7 @@
   @Override
   public RuleKey.Builder appendToRuleKey(RuleKey.Builder builder) throws IOException {
     super.appendToRuleKey(builder)
-        .set("manifest", manifest)
+        .set("manifest", manifest.asReference())
         .set("target", target)
         .set("keystore", keystore.getBuildTarget().getFullyQualifiedName())
         .setRuleNames("classpathDeps", classpathDeps)
@@ -424,16 +425,13 @@
 
   @Override
   public List<String> getInputsToCompareToOutput() {
-    ImmutableList.Builder<String> inputs = ImmutableList.builder();
-    inputs.add(manifest);
-    if (proguardConfig.isPresent()) {
-      SourcePath sourcePath = proguardConfig.get();
-      // Alternatively, if it is a BuildTargetSourcePath, then it should not be included.
-      if (sourcePath instanceof FileSourcePath) {
-        inputs.add(sourcePath.asReference());
-      }
-    }
+    ImmutableList.Builder<SourcePath> sourcePaths = ImmutableList.builder();
+    sourcePaths.add(manifest);
 
+    Optionals.addIfPresent(proguardConfig, sourcePaths);
+
+    ImmutableList.Builder<String> inputs = ImmutableList.builder();
+    inputs.addAll(SourcePaths.filterInputsToCompareToOutput(sourcePaths.build()));
     return inputs.build();
   }
 
@@ -476,7 +474,8 @@
 
     // Symlink the manifest to a path named AndroidManifest.xml. Do this before running any other
     // commands to ensure that it is available at the desired path.
-    steps.add(new MkdirAndSymlinkFileStep(getManifest(), getAndroidManifestXml()));
+    steps.add(new MkdirAndSymlinkFileStep(getManifest().resolve(context).toString(),
+        getAndroidManifestXml()));
 
     final AndroidTransitiveDependencies transitiveDependencies = findTransitiveDependencies(
         context.getDependencyGraph());
@@ -1184,7 +1183,7 @@
    *     AndroidManifest.xml.
    */
   @Override
-  public String getManifest() {
+  public SourcePath getManifest() {
     return manifest;
   }
 
@@ -1229,7 +1228,7 @@
   public static class Builder extends AbstractBuildRuleBuilder<AndroidBinaryRule> {
     private static final PackageType DEFAULT_PACKAGE_TYPE = PackageType.DEBUG;
 
-    private String manifest;
+    private SourcePath manifest;
     private String target;
 
     /** This should always be a subset of {@link #getDeps()}. */
@@ -1352,7 +1351,7 @@
       return this;
     }
 
-    public Builder setManifest(String manifest) {
+    public Builder setManifest(SourcePath manifest) {
       this.manifest = manifest;
       return this;
     }
diff --git a/src/com/facebook/buck/android/AndroidInstrumentationApk.java b/src/com/facebook/buck/android/AndroidInstrumentationApk.java
index bb5bd03..356b035 100644
--- a/src/com/facebook/buck/android/AndroidInstrumentationApk.java
+++ b/src/com/facebook/buck/android/AndroidInstrumentationApk.java
@@ -28,6 +28,7 @@
 import com.facebook.buck.rules.DependencyGraph;
 import com.facebook.buck.rules.InstallableBuildRule;
 import com.facebook.buck.rules.RuleKey;
+import com.facebook.buck.rules.SourcePath;
 import com.facebook.buck.util.HumanReadableException;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -55,7 +56,7 @@
   private final ImmutableSortedSet<BuildRule> classpathDepsForInstrumentationApk;
 
   private AndroidInstrumentationApk(BuildRuleParams buildRuleParams,
-      String manifest,
+      SourcePath manifest,
       AndroidBinaryRule apkUnderTest,
       ImmutableSortedSet<BuildRule> classpathDepsForInstrumentationApk) {
     super(buildRuleParams,
@@ -129,7 +130,7 @@
 
   public static class Builder extends AbstractBuildRuleBuilder<AndroidInstrumentationApk> {
 
-    private String manifest = null;
+    private SourcePath manifest = null;
     private BuildTarget apk = null;
 
     /** This should always be a subset of {@link #getDeps()}. */
@@ -160,7 +161,7 @@
           getBuildTargetsAsBuildRules(ruleResolver, classpathDeps.build()));
     }
 
-    public Builder setManifest(String manifest) {
+    public Builder setManifest(SourcePath manifest) {
       this.manifest = manifest;
       return this;
     }
diff --git a/src/com/facebook/buck/android/AndroidInstrumentationApkRuleFactory.java b/src/com/facebook/buck/android/AndroidInstrumentationApkRuleFactory.java
index 04e4a43..2576e7e 100644
--- a/src/com/facebook/buck/android/AndroidInstrumentationApkRuleFactory.java
+++ b/src/com/facebook/buck/android/AndroidInstrumentationApkRuleFactory.java
@@ -17,10 +17,10 @@
 package com.facebook.buck.android;
 
 import com.facebook.buck.model.BuildTarget;
-import com.facebook.buck.rules.AbstractBuildRuleFactory;
-import com.facebook.buck.rules.BuildRuleFactoryParams;
 import com.facebook.buck.parser.NoSuchBuildTargetException;
 import com.facebook.buck.rules.AbstractBuildRuleBuilderParams;
+import com.facebook.buck.rules.AbstractBuildRuleFactory;
+import com.facebook.buck.rules.BuildRuleFactoryParams;
 
 public class AndroidInstrumentationApkRuleFactory
     extends AbstractBuildRuleFactory<AndroidInstrumentationApk.Builder> {
@@ -34,9 +34,7 @@
   protected void amendBuilder(AndroidInstrumentationApk.Builder builder,
       BuildRuleFactoryParams params) throws NoSuchBuildTargetException {
     // manifest
-    String manifestAttribute = params.getRequiredStringAttribute("manifest");
-    String manifestPath = params.resolveFilePathRelativeToBuildFileDirectory(manifestAttribute);
-    builder.setManifest(manifestPath);
+    builder.setManifest(params.getRequiredSourcePath("manifest", builder));
 
     // apk
     String apk = params.getRequiredStringAttribute("apk");
diff --git a/src/com/facebook/buck/android/ApkGenrule.java b/src/com/facebook/buck/android/ApkGenrule.java
index 839db09..926ca14 100644
--- a/src/com/facebook/buck/android/ApkGenrule.java
+++ b/src/com/facebook/buck/android/ApkGenrule.java
@@ -27,6 +27,7 @@
 import com.facebook.buck.rules.BuildableProperties;
 import com.facebook.buck.rules.InstallableBuildRule;
 import com.facebook.buck.rules.RuleKey;
+import com.facebook.buck.rules.SourcePath;
 import com.facebook.buck.shell.Genrule;
 import com.facebook.buck.step.ExecutionContext;
 import com.facebook.buck.util.HumanReadableException;
@@ -100,7 +101,7 @@
   }
 
   @Override
-  public String getManifest() {
+  public SourcePath getManifest() {
     return apk.getManifest();
   }
 
diff --git a/src/com/facebook/buck/cli/InstallCommand.java b/src/com/facebook/buck/cli/InstallCommand.java
index 821bee5..cabfa0e 100644
--- a/src/com/facebook/buck/cli/InstallCommand.java
+++ b/src/com/facebook/buck/cli/InstallCommand.java
@@ -24,6 +24,7 @@
 import com.android.ddmlib.TimeoutException;
 import com.facebook.buck.command.Build;
 import com.facebook.buck.event.LogEvent;
+import com.facebook.buck.rules.BuildContext;
 import com.facebook.buck.rules.BuildRule;
 import com.facebook.buck.rules.DependencyGraph;
 import com.facebook.buck.rules.InstallableBuildRule;
@@ -83,7 +84,8 @@
 
     // Uninstall the app first, if requested.
     if (options.shouldUninstallFirst()) {
-      String packageName = tryToExtractPackageNameFromManifest(installableBuildRule);
+      String packageName = tryToExtractPackageNameFromManifest(installableBuildRule,
+          build.getBuildContext().getDependencyGraph());
       uninstallApk(packageName,
           options.adbOptions(),
           options.targetDeviceOptions(),
@@ -99,7 +101,10 @@
     // We've installed the application successfully.
     // Is either of --activity or --run present?
     if (options.shouldStartActivity()) {
-      exitCode = startActivity(installableBuildRule, options.getActivityToStart(), options,
+      exitCode = startActivity(installableBuildRule,
+          options.getActivityToStart(),
+          options,
+          build.getBuildContext(),
           build.getExecutionContext());
       if (exitCode != 0) {
         return exitCode;
@@ -109,12 +114,15 @@
     return exitCode;
   }
 
-  private int startActivity(InstallableBuildRule androidBinaryRule, String activity,
-      InstallCommandOptions options, ExecutionContext context) throws IOException {
+  private int startActivity(InstallableBuildRule androidBinaryRule,
+      String activity,
+      InstallCommandOptions options,
+      BuildContext buildContext,
+      ExecutionContext context) throws IOException {
 
     // Might need the package name and activities from the AndroidManifest.
-    AndroidManifestReader reader = DefaultAndroidManifestReader.forPath(
-        androidBinaryRule.getManifest());
+    String pathToManifest = androidBinaryRule.getManifest().resolve(buildContext).toString();
+    AndroidManifestReader reader = DefaultAndroidManifestReader.forPath(pathToManifest);
 
     if (activity == null) {
       // Get list of activities that show up in the launcher.
diff --git a/src/com/facebook/buck/cli/UninstallCommand.java b/src/com/facebook/buck/cli/UninstallCommand.java
index 6b264b3..d97553d 100644
--- a/src/com/facebook/buck/cli/UninstallCommand.java
+++ b/src/com/facebook/buck/cli/UninstallCommand.java
@@ -86,7 +86,8 @@
     ExecutionContext context = createExecutionContext(options, dependencyGraph);
 
     // Find application package name from manifest and uninstall from matching devices.
-    String appId = tryToExtractPackageNameFromManifest(installableBuildRule);
+    String appId = tryToExtractPackageNameFromManifest(installableBuildRule,
+        dependencyGraph);
     return uninstallApk(appId,
         options.adbOptions(),
         options.targetDeviceOptions(),
diff --git a/src/com/facebook/buck/cli/UninstallSupportCommandRunner.java b/src/com/facebook/buck/cli/UninstallSupportCommandRunner.java
index 8653018..35af8ea 100644
--- a/src/com/facebook/buck/cli/UninstallSupportCommandRunner.java
+++ b/src/com/facebook/buck/cli/UninstallSupportCommandRunner.java
@@ -23,6 +23,7 @@
 import com.android.ddmlib.ShellCommandUnresponsiveException;
 import com.android.ddmlib.TimeoutException;
 import com.facebook.buck.cli.UninstallCommandOptions.UninstallOptions;
+import com.facebook.buck.rules.DependencyGraph;
 import com.facebook.buck.rules.InstallableBuildRule;
 import com.facebook.buck.step.ExecutionContext;
 import com.facebook.buck.util.DefaultAndroidManifestReader;
@@ -148,8 +149,9 @@
     }
   }
 
-  String tryToExtractPackageNameFromManifest(InstallableBuildRule androidBinaryRule) {
-    String pathToManifest = androidBinaryRule.getManifest();
+  String tryToExtractPackageNameFromManifest(InstallableBuildRule androidBinaryRule,
+      DependencyGraph dependencyGraph) {
+    String pathToManifest = androidBinaryRule.getManifest().resolve(dependencyGraph).toString();
 
     // Note that the file may not exist if AndroidManifest.xml is a generated file.
     File androidManifestXml = new File(pathToManifest);
diff --git a/src/com/facebook/buck/rules/BuildRuleFactoryParams.java b/src/com/facebook/buck/rules/BuildRuleFactoryParams.java
index 3deceb7..34d3018 100644
--- a/src/com/facebook/buck/rules/BuildRuleFactoryParams.java
+++ b/src/com/facebook/buck/rules/BuildRuleFactoryParams.java
@@ -232,6 +232,17 @@
   }
 
   /**
+   * @param identifier for the argument in this params.
+   * @param builder If the value associated with {@code identifier} corresponds to a
+   *     {@link BuildTarget}, that build target will be added to the {@code deps} of this builder.
+   * @return a source path that corresponds to the specified {@code identifier}.
+   */
+  public SourcePath getRequiredSourcePath(String identifier, AbstractBuildRuleBuilder<?> builder) {
+    String resource = getRequiredStringAttribute(identifier);
+    return asSourcePath(resource, builder);
+  }
+
+  /**
    * @param resource that identifies either a file path or a build target.
    * @param builder If {@code resource} corresponds to a {@link BuildTarget}, that build target will
    *     be added to the {@code deps} of this builder.
diff --git a/src/com/facebook/buck/rules/BuildTargetSourcePath.java b/src/com/facebook/buck/rules/BuildTargetSourcePath.java
index f90dd2f..3dc3d8b 100644
--- a/src/com/facebook/buck/rules/BuildTargetSourcePath.java
+++ b/src/com/facebook/buck/rules/BuildTargetSourcePath.java
@@ -36,7 +36,12 @@
 
   @Override
   public Path resolve(BuildContext context) {
-    BuildRule rule = context.getDependencyGraph().findBuildRuleByTarget(buildTarget);
+    return resolve(context.getDependencyGraph());
+  }
+
+  @Override
+  public Path resolve(DependencyGraph graph) {
+    BuildRule rule = graph.findBuildRuleByTarget(buildTarget);
     if (rule == null) {
       throw new HumanReadableException("Cannot resolve: %s", buildTarget);
     }
diff --git a/src/com/facebook/buck/rules/FileSourcePath.java b/src/com/facebook/buck/rules/FileSourcePath.java
index ad808a7..f44fcd6 100644
--- a/src/com/facebook/buck/rules/FileSourcePath.java
+++ b/src/com/facebook/buck/rules/FileSourcePath.java
@@ -34,6 +34,11 @@
   }
 
   @Override
+  public Path resolve(DependencyGraph graph) {
+    return Paths.get(relativePath);
+  }
+
+  @Override
   public String asReference() {
     return relativePath;
   }
diff --git a/src/com/facebook/buck/rules/InstallableBuildRule.java b/src/com/facebook/buck/rules/InstallableBuildRule.java
index cca3ebb..7e2b81e 100644
--- a/src/com/facebook/buck/rules/InstallableBuildRule.java
+++ b/src/com/facebook/buck/rules/InstallableBuildRule.java
@@ -21,7 +21,7 @@
   /**
    * @return The manifest file for this build rule.
    */
-  public String getManifest();
+  public SourcePath getManifest();
 
   /**
    * @return The APK at this path is the final one that points to an APK that a user should
diff --git a/src/com/facebook/buck/rules/SourcePath.java b/src/com/facebook/buck/rules/SourcePath.java
index 2e10249..cd84465 100644
--- a/src/com/facebook/buck/rules/SourcePath.java
+++ b/src/com/facebook/buck/rules/SourcePath.java
@@ -41,6 +41,8 @@
    */
   public Path resolve(BuildContext context);
 
+  public Path resolve(DependencyGraph graph);
+
   /**
    * @return a representation of path in a stable manner that does not involve calling {#resolve()}
    */
diff --git a/test/com/facebook/buck/android/AndroidBinaryRuleTest.java b/test/com/facebook/buck/android/AndroidBinaryRuleTest.java
index a75bc26..26277f4 100644
--- a/test/com/facebook/buck/android/AndroidBinaryRuleTest.java
+++ b/test/com/facebook/buck/android/AndroidBinaryRuleTest.java
@@ -99,7 +99,7 @@
         .addClasspathDep(libraryTwo.getBuildTarget())
         .addBuildRuleToExcludeFromDex(
             BuildTargetFactory.newInstance("//java/src/com/facebook/base:libraryTwo"))
-        .setManifest("java/src/com/facebook/base/AndroidManifest.xml")
+        .setManifest(new FileSourcePath("java/src/com/facebook/base/AndroidManifest.xml"))
         .setTarget("Google Inc.:Google APIs:16")
         .setKeystore(addKeystoreRule(ruleResolver))
         .setPackageType("debug"));
@@ -177,7 +177,7 @@
         .setBuildTarget(binaryBuildTarget)
         .addClasspathDep(libraryOne.getBuildTarget())
         .addClasspathDep(libraryTwo.getBuildTarget())
-        .setManifest("java/src/com/facebook/base/AndroidManifest.xml")
+        .setManifest(new FileSourcePath("java/src/com/facebook/base/AndroidManifest.xml"))
         .setTarget("Google Inc.:Google APIs:16")
         .setKeystore(addKeystoreRule(ruleResolver))
         .setPackageType("debug"));
@@ -236,7 +236,7 @@
         .setBuildTarget(binaryBuildTarget)
         .addClasspathDep(libraryOne.getBuildTarget())
         .addClasspathDep(libraryTwo.getBuildTarget())
-        .setManifest("java/src/com/facebook/base/AndroidManifest.xml")
+        .setManifest(new FileSourcePath("java/src/com/facebook/base/AndroidManifest.xml"))
         .setTarget("Google Inc.:Google APIs:16")
         .setKeystore(addKeystoreRule(ruleResolver))
         .setPackageType("debug"));
@@ -306,7 +306,7 @@
         .setBuildTarget(binaryBuildTarget)
         .addClasspathDep(libraryOne.getBuildTarget())
         .addClasspathDep(libraryTwo.getBuildTarget())
-        .setManifest("java/src/com/facebook/base/AndroidManifest.xml")
+        .setManifest(new FileSourcePath("java/src/com/facebook/base/AndroidManifest.xml"))
         .setTarget("Google Inc.:Google APIs:16")
         .setKeystore(addKeystoreRule(ruleResolver))
         .setPackageType("debug"));
@@ -413,7 +413,7 @@
     AndroidBinaryRule.Builder androidBinaryRuleBuilder = AndroidBinaryRule
         .newAndroidBinaryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
         .setBuildTarget(BuildTargetFactory.newInstance("//java/src/com/facebook:app"))
-        .setManifest("java/src/com/facebook/AndroidManifest.xml")
+        .setManifest(new FileSourcePath("java/src/com/facebook/AndroidManifest.xml"))
         .setTarget("Google Inc.:Google APIs:16")
         .setKeystore(addKeystoreRule(ruleResolver));
 
@@ -448,7 +448,7 @@
     AndroidBinaryRule ruleInRootDirectory = ruleResolver.buildAndAddToIndex(
         AndroidBinaryRule.newAndroidBinaryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
         .setBuildTarget(BuildTargetFactory.newInstance("//:fb4a"))
-        .setManifest("AndroidManifest.xml")
+        .setManifest(new FileSourcePath("AndroidManifest.xml"))
         .setKeystore(keystoreTarget)
         .setTarget("Google Inc.:Google APIs:16"));
     assertEquals(GEN_DIR + "/fb4a.apk", ruleInRootDirectory.getApkPath());
@@ -456,7 +456,7 @@
     AndroidBinaryRule ruleInNonRootDirectory = ruleResolver.buildAndAddToIndex(
         AndroidBinaryRule.newAndroidBinaryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
         .setBuildTarget(BuildTargetFactory.newInstance("//java/com/example:fb4a"))
-        .setManifest("AndroidManifest.xml")
+        .setManifest(new FileSourcePath("AndroidManifest.xml"))
         .setKeystore(keystoreTarget)
         .setTarget("Google Inc.:Google APIs:16"));
     assertEquals(GEN_DIR + "/java/com/example/fb4a.apk", ruleInNonRootDirectory.getApkPath());
@@ -469,7 +469,7 @@
     AndroidBinaryRule rule = ruleResolver.buildAndAddToIndex(
         AndroidBinaryRule.newAndroidBinaryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
         .setBuildTarget(BuildTargetFactory.newInstance("//:fbandroid_with_dash_debug_fbsign"))
-        .setManifest("AndroidManifest.xml")
+        .setManifest(new FileSourcePath("AndroidManifest.xml"))
         .setKeystore(addKeystoreRule(ruleResolver))
         .setTarget("Google Inc.:Google APIs:16"));
 
@@ -499,7 +499,7 @@
     AndroidBinaryRule splitDexRule = ruleResolver.buildAndAddToIndex(
         AndroidBinaryRule.newAndroidBinaryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
         .setBuildTarget(BuildTargetFactory.newInstance("//:fbandroid_with_dash_debug_fbsign"))
-        .setManifest("AndroidManifest.xml")
+        .setManifest(new FileSourcePath("AndroidManifest.xml"))
         .setKeystore(addKeystoreRule(ruleResolver))
         .setTarget("Google Inc.:Google APIs:16")
         .setDexSplitMode(new DexSplitMode(
@@ -571,7 +571,7 @@
     AndroidBinaryRule.Builder builder = AndroidBinaryRule.newAndroidBinaryRuleBuilder(
         new FakeAbstractBuildRuleBuilderParams())
         .setBuildTarget(BuildTargetFactory.newInstance("//:target"))
-        .setManifest("AndroidManifest.xml")
+        .setManifest(new FileSourcePath("AndroidManifest.xml"))
         .setKeystore(addKeystoreRule(resolver))
         .setTarget("Google Inc:Google APIs:16")
         .setResourceFilter(new ResourceFilter(ImmutableList.<String>of("mdpi")))
@@ -623,7 +623,7 @@
     AndroidBinaryRule.Builder builder = AndroidBinaryRule.newAndroidBinaryRuleBuilder(
         new FakeAbstractBuildRuleBuilderParams())
         .setBuildTarget(BuildTargetFactory.newInstance("//:fbandroid_with_dash_debug_fbsign"))
-        .setManifest("AndroidManifest.xml")
+        .setManifest(new FileSourcePath("AndroidManifest.xml"))
         .setKeystore(addKeystoreRule(ruleResolver))
         .setTarget("Google Inc:Google APIs:16");
 
diff --git a/test/com/facebook/buck/android/AndroidResourceRuleTest.java b/test/com/facebook/buck/android/AndroidResourceRuleTest.java
index f403be9..2480d94 100644
--- a/test/com/facebook/buck/android/AndroidResourceRuleTest.java
+++ b/test/com/facebook/buck/android/AndroidResourceRuleTest.java
@@ -28,6 +28,7 @@
 import com.facebook.buck.rules.DependencyGraph;
 import com.facebook.buck.rules.FakeAbstractBuildRuleBuilderParams;
 import com.facebook.buck.rules.FakeBuildRuleParams;
+import com.facebook.buck.rules.FileSourcePath;
 import com.facebook.buck.testutil.MoreAsserts;
 import com.facebook.buck.testutil.RuleMap;
 import com.google.common.collect.ImmutableList;
@@ -150,7 +151,7 @@
     AndroidBinaryRule e = ruleResolver.buildAndAddToIndex(
         AndroidBinaryRule.newAndroidBinaryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
         .setBuildTarget(BuildTargetFactory.newInstance("//:e"))
-        .setManifest("AndroidManfiest.xml")
+        .setManifest(new FileSourcePath("AndroidManfiest.xml"))
         .setTarget("Google Inc.:Google APIs:16")
         .setKeystore(keystoreTarget)
         .addDep(BuildTargetFactory.newInstance("//:a"))
diff --git a/test/com/facebook/buck/android/AndroidTransitiveDependencyGraphTest.java b/test/com/facebook/buck/android/AndroidTransitiveDependencyGraphTest.java
index c1de5ba..799f08c 100644
--- a/test/com/facebook/buck/android/AndroidTransitiveDependencyGraphTest.java
+++ b/test/com/facebook/buck/android/AndroidTransitiveDependencyGraphTest.java
@@ -28,6 +28,7 @@
 import com.facebook.buck.rules.BuildRuleResolver;
 import com.facebook.buck.rules.DependencyGraph;
 import com.facebook.buck.rules.FakeAbstractBuildRuleBuilderParams;
+import com.facebook.buck.rules.FileSourcePath;
 import com.facebook.buck.testutil.RuleMap;
 import com.facebook.buck.util.BuckConstant;
 import com.google.common.collect.ImmutableSet;
@@ -101,7 +102,7 @@
         .addClasspathDep(libraryRule.getBuildTarget())
         .addClasspathDep(manifestRule.getBuildTarget())
         .addBuildRuleToExcludeFromDex(BuildTargetFactory.newInstance("//third_party/guava:guava"))
-        .setManifest("java/src/com/facebook/AndroidManifest.xml")
+        .setManifest(new FileSourcePath("java/src/com/facebook/AndroidManifest.xml"))
         .setTarget("Google Inc.:Google APIs:16")
         .setKeystore(keystoreTarget));
 
@@ -182,7 +183,7 @@
     AndroidBinaryRule androidBinaryRule = ruleResolver.buildAndAddToIndex(
         AndroidBinaryRule.newAndroidBinaryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
         .setBuildTarget(new BuildTarget("//apps/sample", "app"))
-        .setManifest("apps/sample/AndroidManifest.xml")
+        .setManifest(new FileSourcePath("apps/sample/AndroidManifest.xml"))
         .setTarget("Google Inc.:Google APIs:16")
         .setKeystore(keystoreTarget)
         .addClasspathDep(androidLibraryTarget));
diff --git a/test/com/facebook/buck/android/ApkGenruleTest.java b/test/com/facebook/buck/android/ApkGenruleTest.java
index fb3276a..097e3b3 100644
--- a/test/com/facebook/buck/android/ApkGenruleTest.java
+++ b/test/com/facebook/buck/android/ApkGenruleTest.java
@@ -26,19 +26,20 @@
 import com.facebook.buck.model.BuildTarget;
 import com.facebook.buck.model.BuildTargetFactory;
 import com.facebook.buck.model.BuildTargetPattern;
-import com.facebook.buck.rules.BuildRuleFactoryParams;
 import com.facebook.buck.parser.BuildTargetParser;
 import com.facebook.buck.parser.NoSuchBuildTargetException;
-import com.facebook.buck.rules.NonCheckingBuildRuleFactoryParams;
 import com.facebook.buck.parser.ParseContext;
 import com.facebook.buck.rules.ArtifactCache;
 import com.facebook.buck.rules.BuildContext;
+import com.facebook.buck.rules.BuildRuleFactoryParams;
 import com.facebook.buck.rules.BuildRuleResolver;
 import com.facebook.buck.rules.BuildRuleType;
 import com.facebook.buck.rules.DependencyGraph;
 import com.facebook.buck.rules.FakeAbstractBuildRuleBuilderParams;
 import com.facebook.buck.rules.FakeBuildableContext;
+import com.facebook.buck.rules.FileSourcePath;
 import com.facebook.buck.rules.JavaPackageFinder;
+import com.facebook.buck.rules.NonCheckingBuildRuleFactoryParams;
 import com.facebook.buck.shell.ShellStep;
 import com.facebook.buck.step.ExecutionContext;
 import com.facebook.buck.step.Step;
@@ -99,7 +100,7 @@
     ruleResolver.buildAndAddToIndex(
         AndroidBinaryRule.newAndroidBinaryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
         .setBuildTarget(BuildTargetFactory.newInstance("//:fb4a"))
-        .setManifest("AndroidManifest.xml")
+        .setManifest(new FileSourcePath("AndroidManifest.xml"))
         .setTarget("Google Inc.:Google APIs:16")
         .setKeystore(keystoreTarget)
         .addDep(libAndroidTarget)
diff --git a/test/com/facebook/buck/cli/AuditClasspathCommandTest.java b/test/com/facebook/buck/cli/AuditClasspathCommandTest.java
index 8f31a96..5a95997 100644
--- a/test/com/facebook/buck/cli/AuditClasspathCommandTest.java
+++ b/test/com/facebook/buck/cli/AuditClasspathCommandTest.java
@@ -33,6 +33,7 @@
 import com.facebook.buck.rules.BuildRuleResolver;
 import com.facebook.buck.rules.DependencyGraph;
 import com.facebook.buck.rules.FakeAbstractBuildRuleBuilderParams;
+import com.facebook.buck.rules.FileSourcePath;
 import com.facebook.buck.rules.KnownBuildRuleTypes;
 import com.facebook.buck.rules.NoopArtifactCache;
 import com.facebook.buck.testutil.BuckTestConstant;
@@ -125,7 +126,7 @@
     ruleResolver.buildAndAddToIndex(
         AndroidBinaryRule.newAndroidBinaryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
         .setBuildTarget(BuildTargetFactory.newInstance("//:test-android-binary"))
-        .setManifest("AndroidManifest.xml")
+        .setManifest(new FileSourcePath("AndroidManifest.xml"))
         .setTarget("Google Inc.:Google APIs:16")
         .setKeystore(keystoreBuildTarget)
         .addClasspathDep(BuildTargetFactory.newInstance("//:test-android-library"))
diff --git a/test/com/facebook/buck/command/ProjectTest.java b/test/com/facebook/buck/command/ProjectTest.java
index 78e1e61..0ff32a8 100644
--- a/test/com/facebook/buck/command/ProjectTest.java
+++ b/test/com/facebook/buck/command/ProjectTest.java
@@ -41,6 +41,7 @@
 import com.facebook.buck.rules.BuildRuleResolver;
 import com.facebook.buck.rules.DependencyGraph;
 import com.facebook.buck.rules.FakeAbstractBuildRuleBuilderParams;
+import com.facebook.buck.rules.FileSourcePath;
 import com.facebook.buck.rules.JavaPackageFinder;
 import com.facebook.buck.rules.ProjectConfigRule;
 import com.facebook.buck.step.ExecutionContext;
@@ -184,7 +185,7 @@
         AndroidBinaryRule.newAndroidBinaryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
         .setBuildTarget(BuildTargetFactory.newInstance("//foo:app"))
         .addClasspathDep(BuildTargetFactory.newInstance("//java/src/com/facebook/base:base"))
-        .setManifest("foo/AndroidManifest.xml")
+        .setManifest(new FileSourcePath("foo/AndroidManifest.xml"))
         .setTarget("Google Inc.:Google APIs:16")
         .setKeystore(keystoreTarget)
         .addBuildRuleToExcludeFromDex(BuildTargetFactory.newInstance("//third_party/guava:guava")));
@@ -200,7 +201,7 @@
         AndroidBinaryRule.newAndroidBinaryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
         .setBuildTarget(BuildTargetFactory.newInstance("//bar:app"))
         .addClasspathDep(BuildTargetFactory.newInstance("//java/src/com/facebook/base:base"))
-            .setManifest("foo/AndroidManifest.xml")
+            .setManifest(new FileSourcePath("foo/AndroidManifest.xml"))
             .setTarget("Google Inc.:Google APIs:16")
             .setKeystore(keystoreTarget));