Build JDI support jar.

This adds a jdi-support 'jar' which contains the debugee side of the
debugger. This allows for tests and tools to interact with debuggers
using the standard JDI classes without having to rely on the
configuration of the host classpath.

Test: CtsJdwpTunnelTestCases
Test: m jdi-support
Bug: 124507633

Change-Id: I2e38ca05c38d48e7440e3545061ac8e710cd4b57
diff --git a/Android.bp b/Android.bp
index 28e8223..56fb729 100644
--- a/Android.bp
+++ b/Android.bp
@@ -124,3 +124,47 @@
     required: ["libnpt"],
     defaults: ["upstream-jdwp-defaults"],
 }
+
+genrule {
+    name: "jdwp_generated_java",
+    tools: ["jdwpgen"],
+    cmd: "$(location jdwpgen) $(in) -jdi $(out)",
+    srcs: ["make/data/jdwp/jdwp.spec"],
+    out: ["JDWP.java"],
+}
+
+python_binary_host {
+  name: "jdi_prop_gen",
+  srcs: ["etc/jdigen.py"],
+  main: "etc/jdigen.py",
+}
+
+genrule {
+  name: "jdi_generated_properties",
+  tools: ["jdi_prop_gen"],
+  cmd: "$(location jdi_prop_gen) $(in) $(out)",
+  out: ["jdi.java"],
+  srcs: ["src/share/classes/com/sun/tools/jdi/resources/jdi.properties"],
+}
+
+// The classes needed to support JDI and debug remote processes.
+java_library_host {
+  name: "jdi-support",
+  srcs: [
+    // The JDI interface definition.
+    "src/share/classes/com/sun/jdi/**/*.java",
+    // The JDI interface implementation
+    "src/share/classes/com/sun/tools/jdi/**/*.java",
+    // The JDWP.java file that contains all the constants.
+    ":jdwp_generated_java",
+    // The properties class which holds information about the various connectors.
+    ":jdi_generated_properties",
+  ],
+  exclude_srcs: [
+    // We don't support process attachment and lack some of the classes to even compile this file.
+    "src/share/classes/com/sun/tools/jdi/ProcessAttachingConnector.java",
+  ],
+  services: ["etc/com.sun.jdi.connect.Connector"],
+  javacflags: ["-g"],
+  notice: "LICENSE",
+}
\ No newline at end of file
diff --git a/etc/com.sun.jdi.connect.Connector b/etc/com.sun.jdi.connect.Connector
new file mode 100644
index 0000000..01de058
--- /dev/null
+++ b/etc/com.sun.jdi.connect.Connector
@@ -0,0 +1,2 @@
+com.sun.tools.jdi.SocketAttachingConnector
+com.sun.tools.jdi.SocketListeningConnector
\ No newline at end of file
diff --git a/etc/jdigen.py b/etc/jdigen.py
new file mode 100644
index 0000000..a5ba1a5
--- /dev/null
+++ b/etc/jdigen.py
@@ -0,0 +1,60 @@
+# Copyright (C) 2019 The Android Open Source Project
+#
+# 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.
+#
+
+from __future__ import print_function
+import sys
+
+args = sys.argv
+
+if len(args) != 3:
+  print("Usage: jdigen <input> <output>")
+  sys.exit(1)
+
+TEMPLATE = """
+// Copyright (C) 2019 The Android Open Source Project
+//
+// 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.sun.tools.jdi.resources;
+import java.util.ListResourceBundle;
+public final class jdi extends ListResourceBundle {{
+  protected final Object[][] getContents() {{
+    return new Object[][] {{
+      {values}
+    }};
+  }}
+}}
+"""
+
+INSTANCE_FORMAT = '{{ "{key}", "{value}" }},\n'
+
+VALUES = ""
+with open(args[1], 'r+') as inp:
+  for l in inp.readlines():
+    key, value = l.split('=')
+    VALUES += INSTANCE_FORMAT.format(key = key.strip(), value = value.strip())
+
+with open(args[2], 'w') as out:
+  out.write(TEMPLATE.format(values = VALUES))