Make `libart(d)-disassembler` a requirement of `libart(d)-compiler`.

The constructor of `art::HGraphVisualizerDisassembler` (which is part
of `libart(d)-compiler.so`) may dynamically load
`libart(d)-disassembler.so`; add `libart(d)-disassembler` to the
`runtime_libs` property of module `libart(d)-compiler` to make sure
the former can be found.

Also promote the failure to dynamically load
`libart(s)-disassembler.so` in
`art::HGraphVisualizerDisassembler::HGraphVisualizerDisassembler` from
`WARNING` to `ERROR`.

Test: art/tools/buildbot-build.sh --host \
        && art/test/testrunner/testrunner.py --host --optimizing \
             -t 640-checker-integer-valueof
Bug: 149749169
Change-Id: I307bdf8b71e47ed8da1d6d62ab688c500b3f9c80
diff --git a/build/apex/art_apex_test.py b/build/apex/art_apex_test.py
index b86abf3..e0b28bd 100755
--- a/build/apex/art_apex_test.py
+++ b/build/apex/art_apex_test.py
@@ -500,6 +500,7 @@
     self._checker.check_native_library('libart')
     self._checker.check_native_library('libart-compiler')
     self._checker.check_native_library('libart-dexlayout')
+    self._checker.check_native_library('libart-disassembler')
     self._checker.check_native_library('libartbase')
     self._checker.check_native_library('libartpalette')
     self._checker.check_native_library('libdexfile')
diff --git a/compiler/Android.bp b/compiler/Android.bp
index c7a6ec2..cbfff89 100644
--- a/compiler/Android.bp
+++ b/compiler/Android.bp
@@ -234,6 +234,11 @@
         "libdexfile",
     ],
     whole_static_libs: ["libelffile"],
+    runtime_libs: [
+        // `art::HGraphVisualizerDisassembler::HGraphVisualizerDisassembler` may dynamically load
+        // `libart-disassembler.so`.
+        "libart-disassembler",
+    ],
 
     target: {
         android: {
@@ -310,6 +315,12 @@
         "libdexfiled",
     ],
     whole_static_libs: ["libelffiled"],
+    runtime_libs: [
+        // `art::HGraphVisualizerDisassembler::HGraphVisualizerDisassembler` may dynamically load
+        // `libartd-disassembler.so`.
+        "libartd-disassembler",
+    ],
+
     apex_available: [
         "com.android.art.debug",
     ],
diff --git a/compiler/optimizing/graph_visualizer.cc b/compiler/optimizing/graph_visualizer.cc
index 9419c8d..d94c1fa 100644
--- a/compiler/optimizing/graph_visualizer.cc
+++ b/compiler/optimizing/graph_visualizer.cc
@@ -113,16 +113,19 @@
                                const uint8_t* base_address,
                                const uint8_t* end_address)
       : instruction_set_(instruction_set), disassembler_(nullptr) {
-    libart_disassembler_handle_ =
-        dlopen(kIsDebugBuild ? "libartd-disassembler.so" : "libart-disassembler.so", RTLD_NOW);
+    constexpr const char* libart_disassembler_so_name =
+        kIsDebugBuild ? "libartd-disassembler.so" : "libart-disassembler.so";
+    libart_disassembler_handle_ = dlopen(libart_disassembler_so_name, RTLD_NOW);
     if (libart_disassembler_handle_ == nullptr) {
-      LOG(WARNING) << "Failed to dlopen libart-disassembler: " << dlerror();
+      LOG(ERROR) << "Failed to dlopen " << libart_disassembler_so_name << ": " << dlerror();
       return;
     }
+    constexpr const char* create_disassembler_symbol = "create_disassembler";
     create_disasm_prototype* create_disassembler = reinterpret_cast<create_disasm_prototype*>(
-        dlsym(libart_disassembler_handle_, "create_disassembler"));
+        dlsym(libart_disassembler_handle_, create_disassembler_symbol));
     if (create_disassembler == nullptr) {
-      LOG(WARNING) << "Could not find create_disassembler entry: " << dlerror();
+      LOG(ERROR) << "Could not find " << create_disassembler_symbol << " entry in "
+                 << libart_disassembler_so_name << ": " << dlerror();
       return;
     }
     // Reading the disassembly from 0x0 is easier, so we print relative