Put dex2oat32 and dex2oat64 in the ART apex.

Required to move to dex2oat64 on some devices.

Test: m && art_apex_test
Test: art/build/apex/runtests.sh
Bug: 153380900
Change-Id: Ie4a75d72a8be3c1252c6b49b29d680dc641b6b61
diff --git a/build/apex/Android.bp b/build/apex/Android.bp
index 4d96d6d..706fa96 100644
--- a/build/apex/Android.bp
+++ b/build/apex/Android.bp
@@ -8,10 +8,12 @@
 art_runtime_base_binaries_both = [
     "dalvikvm",
 ]
+art_runtime_base_binaries_both_on_device_first_on_host = [
+    "dex2oat",
+]
 // - Base requirements (binaries for which a 32-bit version is preferred on device, but for which
 //   only the "first" (likely 64-bit) version is required on host).
 art_runtime_base_binaries_prefer32_on_device_first_on_host = [
-    "dex2oat",
     "dexoptanalyzer",
     "profman",
 ]
@@ -66,10 +68,12 @@
 // - Debug variants (binaries for which a 32-bit version is preferred on device, but for which
 //   only the "first" (likely 64-bit) version is required on host).
 art_runtime_debug_binaries_prefer32_on_device_first_on_host = [
-    "dex2oatd",
     "dexoptanalyzerd",
     "profmand",
 ]
+art_runtime_debug_binaries_both_on_device_first_on_host = [
+    "dex2oatd",
+]
 
 // - Debug variants (libraries).
 art_runtime_debug_native_shared_libs = [
@@ -208,7 +212,8 @@
         libcore_native_shared_libs,
     multilib: {
         both: {
-            binaries: art_runtime_base_binaries_both,
+            binaries: art_runtime_base_binaries_both +
+                art_runtime_base_binaries_both_on_device_first_on_host,
         },
         prefer32: {
             binaries: art_runtime_base_binaries_prefer32_on_device_first_on_host,
@@ -235,7 +240,8 @@
         libcore_debug_native_shared_libs,
     multilib: {
         both: {
-            binaries: art_tools_debug_binaries_both,
+            binaries: art_tools_debug_binaries_both +
+                art_runtime_debug_binaries_both_on_device_first_on_host,
         },
         prefer32: {
             binaries: art_runtime_debug_binaries_prefer32_on_device_first_on_host,
@@ -328,7 +334,9 @@
         },
         first: {
             binaries: art_runtime_base_binaries_prefer32_on_device_first_on_host +
+                art_runtime_base_binaries_both_on_device_first_on_host +
                 art_runtime_debug_binaries_prefer32_on_device_first_on_host +
+                art_runtime_debug_binaries_both_on_device_first_on_host +
                 art_tools_common_binaries +
                 art_tools_debug_binaries + // Host APEX is always debug.
                 art_tools_host_only_binaries,
diff --git a/build/apex/art_apex_test.py b/build/apex/art_apex_test.py
index aa07fe2..6bccdf5 100755
--- a/build/apex/art_apex_test.py
+++ b/build/apex/art_apex_test.py
@@ -389,10 +389,18 @@
     """Check bin/filename32, and/or bin/filename64, with symlink bin/filename."""
     raise NotImplementedError
 
+  def check_symlinked_first_executable(self, filename):
+    """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
@@ -411,8 +419,15 @@
     self.check_executable('%s32' % filename)
     self.check_executable_symlink(filename)
 
+  def check_symlinked_first_executable(self, filename):
+    self.check_executable('%s32' % filename)
+    self.check_executable_symlink(filename)
+
   def check_multilib_executable(self, filename):
-    self.check_executable(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
@@ -431,9 +446,16 @@
     self.check_executable('%s64' % filename)
     self.check_executable_symlink(filename)
 
+  def check_symlinked_first_executable(self, filename):
+    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?
@@ -452,9 +474,16 @@
     self.check_executable('%s64' % filename)
     self.check_executable_symlink(filename)
 
+  def check_symlinked_first_executable(self, filename):
+    self.check_executable('%s64' % filename)
+    self.check_executable_symlink(filename)
+
   def check_multilib_executable(self, filename):
     self.check_executable('%s64' % filename)
-    self.check_executable(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
@@ -482,7 +511,7 @@
     self._checker.check_file('apex_manifest.pb')
 
     # Check binaries for ART.
-    self._checker.check_executable('dex2oat')
+    self._checker.check_first_executable('dex2oat')
     self._checker.check_executable('dexdump')
     self._checker.check_executable('dexlist')
     self._checker.check_executable('dexoptanalyzer')
@@ -579,6 +608,7 @@
 
     # Check binaries for ART.
     self._checker.check_executable('oatdump')
+    self._checker.check_multilib_executable('dex2oat')
 
     # Check internal libraries for ART.
     self._checker.check_prefer64_library('libart-disassembler')
@@ -614,7 +644,8 @@
   def run(self):
     # Check binaries for ART.
     self._checker.check_executable('hprof-conv')
-    self._checker.check_executable('dex2oatd')
+    self._checker.check_symlinked_first_executable('dex2oatd')
+    self._checker.check_symlinked_first_executable('dex2oat')
 
     # Check exported native libraries for Managed Core Library.
     self._checker.check_native_library('libandroidicu-host')
@@ -674,7 +705,8 @@
 
   def run(self):
     # Check ART debug binaries.
-    self._checker.check_executable('dex2oatd')
+    self._checker.check_multilib_executable('dex2oatd')
+    self._checker.check_multilib_executable('dex2oat')
     self._checker.check_executable('oatdumpd')
 
     # Check ART internal libraries.
diff --git a/dex2oat/Android.bp b/dex2oat/Android.bp
index 4a72faa..0e82704 100644
--- a/dex2oat/Android.bp
+++ b/dex2oat/Android.bp
@@ -181,8 +181,7 @@
 
     target: {
         android: {
-            // Use the 32-bit version of dex2oat on devices.
-            compile_multilib: "prefer32",
+            compile_multilib: "both",
         },
     },
     header_libs: [
@@ -250,6 +249,15 @@
         "libart-dex2oat",
     ],
 
+    multilib: {
+        lib32: {
+            suffix: "32",
+        },
+        lib64: {
+            suffix: "64",
+        },
+    },
+
     pgo: {
         // Additional cflags just for dex2oat during PGO instrumentation
         cflags: [
@@ -279,6 +287,7 @@
             // it'd get overridden by the load hook even when it uses
             // PrependProperties.
             compile_multilib: "64",
+            symlink_preferred_arch: true,
         },
     },
     apex_available: [
@@ -316,7 +325,6 @@
             static_libs: [
                 "libz",
             ],
-            compile_multilib: "prefer32",
         },
         host: {
             shared_libs: [
@@ -330,11 +338,21 @@
             // 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 {