Initial commit of "HostStubGen" (Ravenwood)

See tools/hoststubgen/README.md for the directory structure...

This CL contains:
- The HostGenTool.

- Libraries to build / run host side tets. (helper-*/ directories)

- Currently we expose ArrayMap and Log to the host side, but we also need to
expose a lot more classes that the tests usee.

- Some sample tests. (test-framework/ and test-tiny-framework/)

Sample tests contain very small tests for ArrayMap and Log.

- This version doen't loa JNI code yet. It still uses the Java substitution
for Log's native methods.

This is because `libandroid_runtime` seems to have a lot of obscure dependencies,
and using `libandroid_runtime` could cause obscure build errors when someone
make chages to any of direct/indirect dependencies.

- Current version doesn't use any Java annotations to control what are exposed
on the host side. Instead, we use `framework-policy-override.txt`, which is
easier to change. (because changing the file wouln't require rebuilding
framework-minus-apex.jar.)

- Currently we expose ArrayMap and Log to the host side, but we also need to
expose a lot more classes that the tests usee. See the `framework-policy-override.txt`
file.

Test: ./scripts/run-all-tests.sh
Bug: 292141694
Change-Id: If149e26aa919d17a0b82dacc78f31bd79fbb110b
diff --git a/tools/hoststubgen/common.sh b/tools/hoststubgen/common.sh
new file mode 100644
index 0000000..b49ee39
--- /dev/null
+++ b/tools/hoststubgen/common.sh
@@ -0,0 +1,116 @@
+# Copyright (C) 2023 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.
+
+set -e # Exit at failure
+shopt -s globstar # Enable double-star wildcards (**)
+
+cd "${0%/*}" # Move to the script dir
+
+fail() {
+  echo "Error: $*" 1>&2
+  exit 1
+}
+
+# Print the arguments and then execute.
+run() {
+  echo "Running: $*" 1>&2
+  "$@"
+}
+
+# Concatenate the second and subsequent args with the first arg as a separator.
+# e.g. `join : a b c` -> prints `a:b:c`
+join() {
+  local IFS="$1"
+  shift
+  echo "$*"
+}
+
+abspath() {
+  for name in "${@}"; do
+    readlink -f $name
+  done
+}
+
+m() {
+  if (( $SKIP_BUILD )) ; then
+    echo "Skipping build: $*" 1>&2
+    return 0
+  fi
+  run ${ANDROID_BUILD_TOP}/build/soong/soong_ui.bash --make-mode "$@"
+}
+
+# Extract given jar files
+extract() {
+  for f in "${@}"; do
+    local out=$f.ext
+    run rm -fr $out
+    run mkdir -p $out
+
+    # It's too noisy, so only show the first few lines.
+    {
+      # Hmm unzipping kotlin jar files may produce a warning? Let's just add `|| true`...
+      run unzip $f -d $out || true
+    } |& sed -e '5,$d'
+    echo '  (omitting remaining output)'
+
+  done
+}
+
+# Find all *.java files in $1, and print them as Java class names.
+# For example, if there's a file `src/com/android/test/Test.java`, and you run
+# `list_all_classes_under_dir src`, then it'll print `com.android.test.Test`.
+list_all_classes_under_dir() {
+  local dir="$1"
+  ( # Use a subshell, so we won't change the current directory on the caller side.
+    cd "$dir"
+
+    # List the java files, but replace the slashes with dots, and remove the `.java` suffix.
+    ls **/*.java | sed -e 's!/!.!g' -e 's!.java$!!'
+  )
+}
+
+checkenv() {
+  # Make sure $ANDROID_BUILD_TOP is set.
+  : ${ANDROID_BUILD_TOP:?}
+
+  # Make sure ANDROID_BUILD_TOP doesn't contain whitespace.
+  set ${ANDROID_BUILD_TOP}
+  if [[ $# != 1 ]] ; then
+    fail "\$ANDROID_BUILD_TOP cannot contain whitespace."
+  fi
+}
+
+checkenv
+
+JAVAC=${JAVAC:-javac}
+JAVA=${JAVA:-java}
+JAR=${JAR:-jar}
+
+JAVAC_OPTS=${JAVAC_OPTS:--Xmaxerrs 99999 -Xlint:none}
+
+SOONG_INT=$ANDROID_BUILD_TOP/out/soong/.intermediates
+
+JUNIT_TEST_MAIN_CLASS=com.android.hoststubgen.hosthelper.HostTestSuite
+
+run_junit_test_jar() {
+  local jar="$1"
+  echo "Starting test: $jar ..."
+  run cd "${jar%/*}"
+
+  run $JAVA $JAVA_OPTS \
+      -cp $jar \
+      org.junit.runner.JUnitCore \
+      $main_class || return 1
+  return 0
+}