Provide disable_pre_dex option for android_binary().

Summary:
This gives us an escape hatch to disable pre-dexing on an individual
android_binary() rule. The plan is to improve pre-dexing so that it
is clearly a win so we can ultimately remove this option.
diff --git a/src/com/facebook/buck/android/AndroidBinaryBuildRuleFactory.java b/src/com/facebook/buck/android/AndroidBinaryBuildRuleFactory.java
index 4fcfb52..3a20be3 100644
--- a/src/com/facebook/buck/android/AndroidBinaryBuildRuleFactory.java
+++ b/src/com/facebook/buck/android/AndroidBinaryBuildRuleFactory.java
@@ -18,10 +18,10 @@
 
 import com.facebook.buck.dalvik.ZipSplitter;
 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;
 import com.facebook.buck.rules.SourcePath;
 import com.google.common.base.Optional;
 
@@ -75,6 +75,9 @@
         ? ZipSplitter.DexSplitStrategy.MINIMIZE_PRIMARY_DEX_SIZE
         : ZipSplitter.DexSplitStrategy.MAXIMIZE_PRIMARY_DEX_SIZE;
 
+    // disable_pre_dex
+    builder.setDisablePreDex(params.getBooleanAttribute("disable_pre_dex"));
+
     // dex_compression
     DexStore dexStore =
         "xz".equals(params.getRequiredStringAttribute("dex_compression")) ?
diff --git a/src/com/facebook/buck/android/AndroidBinaryRule.java b/src/com/facebook/buck/android/AndroidBinaryRule.java
index d75ac36..cbc2f67 100644
--- a/src/com/facebook/buck/android/AndroidBinaryRule.java
+++ b/src/com/facebook/buck/android/AndroidBinaryRule.java
@@ -1189,6 +1189,7 @@
     private BuildTarget keystoreTarget;
     private PackageType packageType = DEFAULT_PACKAGE_TYPE;
     private Set<BuildTarget> buildRulesToExcludeFromDex = Sets.newHashSet();
+    private boolean disablePreDex = false;
     private DexSplitMode dexSplitMode = new DexSplitMode(
         /* shouldSplitDex */ false,
         ZipSplitter.DexSplitStrategy.MAXIMIZE_PRIMARY_DEX_SIZE,
@@ -1227,7 +1228,8 @@
       BuildRuleParams originalParams = createBuildRuleParams(ruleResolver);
       ImmutableSortedSet<BuildRule> originalDeps = originalParams.getDeps();
       ImmutableSet<DexProducedFromJavaLibraryThatContainsClassFiles> preDexDeps;
-      if (PackageType.DEBUG.equals(packageType)
+      if (!disablePreDex
+          && PackageType.DEBUG.equals(packageType)
           && !dexSplitMode.isShouldSplitDex() // TODO(mbolin): Support predex for split dex.
           && !preprocessJavaClassesBash.isPresent() // TODO(mbolin): Support predex post-preprocess.
           ) {
@@ -1397,6 +1399,11 @@
       return this;
     }
 
+    public Builder setDisablePreDex(boolean disablePreDex) {
+      this.disablePreDex = disablePreDex;
+      return this;
+    }
+
     public Builder setDexSplitMode(DexSplitMode dexSplitMode) {
       this.dexSplitMode = dexSplitMode;
       return this;
diff --git a/src/com/facebook/buck/parser/buck.py b/src/com/facebook/buck/parser/buck.py
index 4217007..44e9f3c 100644
--- a/src/com/facebook/buck/parser/buck.py
+++ b/src/com/facebook/buck/parser/buck.py
@@ -411,6 +411,7 @@
       use_split_dex=False,
       use_linear_alloc_split_dex=False,
       minimize_primary_dex_size=False,
+      disable_pre_dex=False,
       dex_compression='jar',
       use_android_proguard_config_with_optimizations=False,
       proguard_config=None,
@@ -438,6 +439,7 @@
     'use_split_dex': use_split_dex,
     'use_linear_alloc_split_dex': use_linear_alloc_split_dex,
     'minimize_primary_dex_size': minimize_primary_dex_size,
+    'disable_pre_dex' : disable_pre_dex,
     'dex_compression': dex_compression,
     'use_android_proguard_config_with_optimizations':
         use_android_proguard_config_with_optimizations,