Merge ""Revert^4 "Make adbconnection start automatically for debuggable apps (on target)""
diff --git a/cmdline/cmdline_parser_test.cc b/cmdline/cmdline_parser_test.cc
index 235a2aa..a52e163 100644
--- a/cmdline/cmdline_parser_test.cc
+++ b/cmdline/cmdline_parser_test.cc
@@ -371,7 +371,7 @@
  */
 TEST_F(CmdlineParserTest, TestJdwpProviderEmpty) {
   {
-    EXPECT_SINGLE_PARSE_DEFAULT_VALUE(JdwpProvider::kNone, "", M::JdwpProvider);
+    EXPECT_SINGLE_PARSE_DEFAULT_VALUE(JdwpProvider::kUnset, "", M::JdwpProvider);
   }
 }  // TEST_F
 
diff --git a/runtime/jdwp_provider.h b/runtime/jdwp_provider.h
index 698fdc0..c4f1989 100644
--- a/runtime/jdwp_provider.h
+++ b/runtime/jdwp_provider.h
@@ -19,6 +19,7 @@
 
 #include <ios>
 
+#include "base/globals.h"
 #include "base/macros.h"
 #include "base/logging.h"
 
@@ -26,13 +27,33 @@
 
 enum class JdwpProvider {
   kNone,
+  // Special value only used to denote that no explicit choice has been made by the user. This
+  // should not be used and one should always call CanonicalizeJdwpProvider which will remove this
+  // value before using a JdwpProvider value.
+  kUnset,
   kInternal,
   kAdbConnection,
 
-  // The current default provider
+  // The current default provider. Used if you run -XjdwpProvider:default
   kDefaultJdwpProvider = kAdbConnection,
+
+  // What we should use as provider with no options and debuggable. On host we always want to be
+  // none since there is no adbd on host.
+  kUnsetDebuggable = kIsTargetBuild ? kDefaultJdwpProvider : kNone,
+  // What we should use as provider with no options and non-debuggable
+  kUnsetNonDebuggable = kNone,
 };
 
+inline JdwpProvider CanonicalizeJdwpProvider(JdwpProvider p, bool debuggable) {
+  if (p != JdwpProvider::kUnset) {
+    return p;
+  }
+  if (debuggable) {
+    return JdwpProvider::kUnsetDebuggable;
+  }
+  return JdwpProvider::kUnsetNonDebuggable;
+}
+
 std::ostream& operator<<(std::ostream& os, const JdwpProvider& rhs);
 
 }  // namespace art
diff --git a/runtime/runtime.cc b/runtime/runtime.cc
index a1645cb..3b4d177 100644
--- a/runtime/runtime.cc
+++ b/runtime/runtime.cc
@@ -1283,7 +1283,8 @@
   dump_gc_performance_on_shutdown_ = runtime_options.Exists(Opt::DumpGCPerformanceOnShutdown);
 
   jdwp_options_ = runtime_options.GetOrDefault(Opt::JdwpOptions);
-  jdwp_provider_ = runtime_options.GetOrDefault(Opt::JdwpProvider);
+  jdwp_provider_ = CanonicalizeJdwpProvider(runtime_options.GetOrDefault(Opt::JdwpProvider),
+                                            IsJavaDebuggable());
   switch (jdwp_provider_) {
     case JdwpProvider::kNone: {
       VLOG(jdwp) << "Disabling all JDWP support.";
@@ -1317,6 +1318,11 @@
       constexpr const char* plugin_name = kIsDebugBuild ? "libadbconnectiond.so"
                                                         : "libadbconnection.so";
       plugins_.push_back(Plugin::Create(plugin_name));
+      break;
+    }
+    case JdwpProvider::kUnset: {
+      LOG(FATAL) << "Illegal jdwp provider " << jdwp_provider_ << " was not filtered out!";
+      break;
     }
   }
   callbacks_->AddThreadLifecycleCallback(Dbg::GetThreadLifecycleCallback());
diff --git a/runtime/runtime_options.def b/runtime/runtime_options.def
index e647423..3f9a322 100644
--- a/runtime/runtime_options.def
+++ b/runtime/runtime_options.def
@@ -44,7 +44,7 @@
 RUNTIME_OPTIONS_KEY (Unit,                CheckJni)
 RUNTIME_OPTIONS_KEY (Unit,                JniOptsForceCopy)
 RUNTIME_OPTIONS_KEY (std::string,         JdwpOptions, "")
-RUNTIME_OPTIONS_KEY (JdwpProvider,        JdwpProvider,                   JdwpProvider::kNone)
+RUNTIME_OPTIONS_KEY (JdwpProvider,        JdwpProvider,                   JdwpProvider::kUnset)
 RUNTIME_OPTIONS_KEY (MemoryKiB,           MemoryMaximumSize,              gc::Heap::kDefaultMaximumSize)  // -Xmx
 RUNTIME_OPTIONS_KEY (MemoryKiB,           MemoryInitialSize,              gc::Heap::kDefaultInitialSize)  // -Xms
 RUNTIME_OPTIONS_KEY (MemoryKiB,           HeapGrowthLimit)                // Default is 0 for unlimited
diff --git a/test/etc/run-test-jar b/test/etc/run-test-jar
index 1ba433e..713fd35 100755
--- a/test/etc/run-test-jar
+++ b/test/etc/run-test-jar
@@ -377,6 +377,9 @@
 
 if [ "$USE_JVM" = "n" ]; then
     FLAGS="${FLAGS} ${ANDROID_FLAGS}"
+    # we don't want to be trying to get adbconnections since the plugin might
+    # not have been built.
+    FLAGS="${FLAGS} -XjdwpProvider:none"
     for feature in ${EXPERIMENTAL}; do
         FLAGS="${FLAGS} -Xexperimental:${feature} -Xcompiler-option --runtime-arg -Xcompiler-option -Xexperimental:${feature}"
         COMPILE_FLAGS="${COMPILE_FLAGS} --runtime-arg -Xexperimental:${feature}"
diff --git a/tools/run-jdwp-tests.sh b/tools/run-jdwp-tests.sh
index 0796432..eb33da2 100755
--- a/tools/run-jdwp-tests.sh
+++ b/tools/run-jdwp-tests.sh
@@ -251,6 +251,9 @@
     vm_args="${vm_args} --vm-arg -Djpda.settings.debuggeeAgentName=${with_jdwp_path}"
   fi
   vm_args="$vm_args --vm-arg -Xcompiler-option --vm-arg --debuggable"
+  # we don't want to be trying to connect to adbconnection which might not have
+  # been built.
+  vm_args="${vm_args} --vm-arg -XjdwpProvider:none"
   # Make sure the debuggee doesn't clean up what the debugger has generated.
   art_debugee="$art_debugee --no-clean"
 fi
@@ -327,6 +330,10 @@
   if [[ "x$with_jdwp_path" == "x" ]]; then
     # Need to enable the internal jdwp implementation.
     art_debugee="${art_debugee} -XjdwpProvider:internal"
+  else
+    # need to disable the jdwpProvider since we give the agent explicitly on the
+    # cmdline.
+    art_debugee="${art_debugee} -XjdwpProvider:none"
   fi
 else
   toolchain_args="--toolchain javac --language CUR"