Get rid of dependencies on /system/bin ART binary compat symlinks.

Make the tools/art script try the /apex/com.android.art location first,
for use on device. Also add a symlink for dex2oat to the preferred
bitness in the APEX, just like dalvikvm already has, so the script
works with neither --32 nor --64.

Test: m installclean
      art/tools/buildbot-build.sh --target && \
        art/tools/buildbot-teardown-device.sh && \
        art/tools/buildbot-cleanup-device.sh && \
        art/tools/buildbot-setup-device.sh && \
        art/tools/buildbot-sync.sh
      art/tools/run-libcore-tests.sh --mode=device --variant=X32 libcore.sun.net
      art/tools/run-libcore-tests.sh --mode=device --variant=X64 libcore.sun.net
  with the script temporarily changed to error out on missing dex2oat
Test: rm -r out/host
      art/tools/buildbot-build.sh --host
      art/tools/run-libcore-tests.sh --mode=host --variant=X32 libcore.sun.net
      art/tools/run-libcore-tests.sh --mode=host --variant=X64 libcore.sun.net
  with the script temporarily changed to error out on missing dex2oat
Test: lunch aosp_cf_x86_64_phone
      art/build/apex/runtests.sh --bitness=multilib
Test: lunch aosp_arm
      art/build/apex/runtests.sh
Bug: 155478143
Change-Id: Ie6a6c057c5948d353258882f5a9e0ae921d7bedc
diff --git a/build/apex/art_apex_test.py b/build/apex/art_apex_test.py
index 904fd16..17eb18e 100755
--- a/build/apex/art_apex_test.py
+++ b/build/apex/art_apex_test.py
@@ -343,14 +343,6 @@
     """Check bin/filename32, and/or bin/filename64, with symlink bin/filename."""
     raise NotImplementedError
 
-  def check_multilib_executable(self, filename):
-    """Check bin/filename for 32 bit, and/or bin/filename64."""
-    raise NotImplementedError
-
-  def check_first_executable(self, filename):
-    """Check bin/filename for 32 bit, and/or bin/filename64."""
-    raise NotImplementedError
-
   def check_native_library(self, basename):
     """Check lib/basename.so, and/or lib64/basename.so."""
     raise NotImplementedError
@@ -376,12 +368,6 @@
     self.check_executable('%s32' % filename)
     self.check_executable_symlink(filename)
 
-  def check_multilib_executable(self, filename):
-    self.check_executable('%s32' % filename)
-
-  def check_first_executable(self, filename):
-    self.check_executable('%s32' % filename)
-
   def check_native_library(self, basename):
     # TODO: Use $TARGET_ARCH (e.g. check whether it is "arm" or "arm64") to improve
     # the precision of this test?
@@ -405,12 +391,6 @@
     self.check_executable('%s64' % filename)
     self.check_executable_symlink(filename)
 
-  def check_multilib_executable(self, filename):
-    self.check_executable('%s64' % filename)
-
-  def check_first_executable(self, filename):
-    self.check_executable('%s64' % filename)
-
   def check_native_library(self, basename):
     # TODO: Use $TARGET_ARCH (e.g. check whether it is "arm" or "arm64") to improve
     # the precision of this test?
@@ -436,13 +416,6 @@
     self.check_executable('%s64' % filename)
     self.check_executable_symlink(filename)
 
-  def check_multilib_executable(self, filename):
-    self.check_executable('%s64' % filename)
-    self.check_executable('%s32' % filename)
-
-  def check_first_executable(self, filename):
-    self.check_executable('%s64' % filename)
-
   def check_native_library(self, basename):
     # TODO: Use $TARGET_ARCH (e.g. check whether it is "arm" or "arm64") to improve
     # the precision of this test?
@@ -478,7 +451,6 @@
     self._checker.check_file('apex_manifest.pb')
 
     # Check binaries for ART.
-    self._checker.check_first_executable('dex2oat')
     self._checker.check_executable('dexdump')
     self._checker.check_executable('dexlist')
     self._checker.check_executable('dexoptanalyzer')
@@ -573,9 +545,9 @@
 
     # Check binaries for ART.
     self._checker.check_executable('artd')
-    self._checker.check_multilib_executable('dex2oat')
     self._checker.check_executable('oatdump')
     self._checker.check_executable("odrefresh")
+    self._checker.check_symlinked_multilib_executable('dex2oat')
 
     # Check internal libraries for ART.
     self._checker.check_native_library('libperfetto_hprof')
@@ -663,9 +635,8 @@
 
   def run(self):
     # Check ART debug binaries.
-    self._checker.check_multilib_executable('dex2oatd')
-    self._checker.check_multilib_executable('dex2oat')
     self._checker.check_executable('oatdumpd')
+    self._checker.check_symlinked_multilib_executable('dex2oatd')
 
     # Check ART internal libraries.
     self._checker.check_native_library('libperfetto_hprofd')
diff --git a/dex2oat/Android.bp b/dex2oat/Android.bp
index 531c0f5..5bc986b 100644
--- a/dex2oat/Android.bp
+++ b/dex2oat/Android.bp
@@ -272,6 +272,7 @@
             suffix: "64",
         },
     },
+    symlink_preferred_arch: true,
 
     pgo: {
         // Additional cflags just for dex2oat during PGO instrumentation
@@ -281,6 +282,7 @@
             "-DART_PGO_INSTRUMENTATION",
         ],
     },
+
     target: {
         android: {
             shared_libs: [
@@ -311,9 +313,9 @@
             // it'd get overridden by the load hook even when it uses
             // PrependProperties.
             compile_multilib: "64",
-            symlink_preferred_arch: true,
         },
     },
+
     apex_available: [
         "com.android.art",
         "com.android.art.debug",
@@ -329,6 +331,17 @@
     // Modules that do dexpreopting, e.g. android_app, depend implicitly on
     // either dex2oat or dex2oatd in ART source builds.
     visibility: ["//visibility:public"],
+
+    multilib: {
+        lib32: {
+            suffix: "32",
+        },
+        lib64: {
+            suffix: "64",
+        },
+    },
+    symlink_preferred_arch: true,
+
     target: {
         android: {
             shared_libs: [
@@ -356,21 +369,12 @@
             // it'd get overridden by the load hook even when it uses
             // PrependProperties.
             compile_multilib: "64",
-            symlink_preferred_arch: true,
         },
     },
+
     apex_available: [
         "com.android.art.debug",
     ],
-
-    multilib: {
-        lib32: {
-            suffix: "32",
-        },
-        lib64: {
-            suffix: "64",
-        },
-    },
 }
 
 cc_defaults {
diff --git a/tools/art b/tools/art
index e524b17..54cb7ac 100755
--- a/tools/art
+++ b/tools/art
@@ -494,20 +494,30 @@
   fi
 fi
 
-ART_BINARY_PATH=$ANDROID_ROOT/bin/$ART_BINARY
+ART_BINARY_TARGET_PATH=$ANDROID_ART_ROOT/bin/$ART_BINARY
+ART_BINARY_HOST_PATH=$ANDROID_ROOT/bin/$ART_BINARY
 
-if [ ! -x "$ART_BINARY_PATH" ]; then
+if [ -x "$ART_BINARY_TARGET_PATH" ]; then
+  ART_BINARY_PATH="$ART_BINARY_TARGET_PATH"
+elif [ -x "$ART_BINARY_HOST_PATH" ]; then
+  ART_BINARY_PATH="$ART_BINARY_HOST_PATH"
+else
   cat 1>&2 <<EOF
-Android Runtime not found: $ART_BINARY_PATH
+Android Runtime not found as either $ART_BINARY_TARGET_PATH or $ART_BINARY_HOST_PATH
 This script should be in the same directory as the Android Runtime ($ART_BINARY).
 EOF
   exit 1
 fi
 
-DEX2OAT_BINARY_PATH=$ANDROID_ROOT/bin/$DEX2OAT_BINARY$DEX2OAT_SUFFIX
+DEX2OAT_BINARY_TARGET_PATH=$ANDROID_ART_ROOT/bin/$DEX2OAT_BINARY$DEX2OAT_SUFFIX
+DEX2OAT_BINARY_HOST_PATH=$ANDROID_ROOT/bin/$DEX2OAT_BINARY$DEX2OAT_SUFFIX
 
-if [ ! -x "$DEX2OAT_BINARY_PATH" ]; then
-  echo "Warning: Android Compiler not found: $DEX2OAT_BINARY_PATH"
+if [ -x "$DEX2OAT_BINARY_TARGET_PATH" ]; then
+  DEX2OAT_BINARY_PATH="$DEX2OAT_BINARY_TARGET_PATH"
+elif [ -x "$DEX2OAT_BINARY_HOST_PATH" ]; then
+  DEX2OAT_BINARY_PATH="$DEX2OAT_BINARY_HOST_PATH"
+else
+  echo "Warning: Android Compiler not found as either $DEX2OAT_BINARY_TARGET_PATH or $DEX2OAT_BINARY_HOST_PATH"
 fi
 
 ######################################