ART: Clear WellKnownClasses on shutdown

The members go stale on shutdown, so delete them. This also works
around a startup bug that is relying on null members.

Bug: 65500943
Test: m test-art-host
Change-Id: Ib8c0a28c4b6509a0614a12e123b73e7c117db319
diff --git a/runtime/runtime.cc b/runtime/runtime.cc
index a67a6aa..3edf343 100644
--- a/runtime/runtime.cc
+++ b/runtime/runtime.cc
@@ -400,6 +400,11 @@
   // TODO: acquire a static mutex on Runtime to avoid racing.
   CHECK(instance_ == nullptr || instance_ == this);
   instance_ = nullptr;
+
+  // Well-known classes must be deleted or it is impossible to successfully start another Runtime
+  // instance. We rely on a small initialization order issue in Runtime::Start() that requires
+  // elements of WellKnownClasses to be null, see b/65500943.
+  WellKnownClasses::Clear();
 }
 
 struct AbortState {
diff --git a/runtime/well_known_classes.cc b/runtime/well_known_classes.cc
index 1c14cf2..74d11a3 100644
--- a/runtime/well_known_classes.cc
+++ b/runtime/well_known_classes.cc
@@ -414,6 +414,124 @@
                "Ljava/lang/reflect/InvocationHandler;");
 }
 
+void WellKnownClasses::Clear() {
+  dalvik_annotation_optimization_CriticalNative = nullptr;
+  dalvik_annotation_optimization_FastNative = nullptr;
+  dalvik_system_BaseDexClassLoader = nullptr;
+  dalvik_system_DelegateLastClassLoader = nullptr;
+  dalvik_system_DexClassLoader = nullptr;
+  dalvik_system_DexFile = nullptr;
+  dalvik_system_DexPathList = nullptr;
+  dalvik_system_DexPathList__Element = nullptr;
+  dalvik_system_EmulatedStackFrame = nullptr;
+  dalvik_system_PathClassLoader = nullptr;
+  dalvik_system_VMRuntime = nullptr;
+  java_lang_annotation_Annotation__array = nullptr;
+  java_lang_BootClassLoader = nullptr;
+  java_lang_ClassLoader = nullptr;
+  java_lang_ClassNotFoundException = nullptr;
+  java_lang_Daemons = nullptr;
+  java_lang_Error = nullptr;
+  java_lang_IllegalAccessError = nullptr;
+  java_lang_invoke_MethodHandle = nullptr;
+  java_lang_NoClassDefFoundError = nullptr;
+  java_lang_Object = nullptr;
+  java_lang_OutOfMemoryError = nullptr;
+  java_lang_reflect_Constructor = nullptr;
+  java_lang_reflect_Executable = nullptr;
+  java_lang_reflect_Field = nullptr;
+  java_lang_reflect_Method = nullptr;
+  java_lang_reflect_Parameter = nullptr;
+  java_lang_reflect_Parameter__array = nullptr;
+  java_lang_reflect_Proxy = nullptr;
+  java_lang_RuntimeException = nullptr;
+  java_lang_StackOverflowError = nullptr;
+  java_lang_String = nullptr;
+  java_lang_StringFactory = nullptr;
+  java_lang_System = nullptr;
+  java_lang_Thread = nullptr;
+  java_lang_ThreadGroup = nullptr;
+  java_lang_Throwable = nullptr;
+  java_util_ArrayList = nullptr;
+  java_util_Collections = nullptr;
+  java_nio_DirectByteBuffer = nullptr;
+  libcore_reflect_AnnotationFactory = nullptr;
+  libcore_reflect_AnnotationMember = nullptr;
+  libcore_util_EmptyArray = nullptr;
+  org_apache_harmony_dalvik_ddmc_Chunk = nullptr;
+  org_apache_harmony_dalvik_ddmc_DdmServer = nullptr;
+
+  dalvik_system_VMRuntime_runFinalization = nullptr;
+  java_lang_Boolean_valueOf = nullptr;
+  java_lang_Byte_valueOf = nullptr;
+  java_lang_Character_valueOf = nullptr;
+  java_lang_ClassLoader_loadClass = nullptr;
+  java_lang_ClassNotFoundException_init = nullptr;
+  java_lang_Daemons_requestHeapTrim = nullptr;
+  java_lang_Daemons_start = nullptr;
+  java_lang_Daemons_stop = nullptr;
+  java_lang_Double_valueOf = nullptr;
+  java_lang_Float_valueOf = nullptr;
+  java_lang_Integer_valueOf = nullptr;
+  java_lang_invoke_MethodHandle_invoke = nullptr;
+  java_lang_invoke_MethodHandle_invokeExact = nullptr;
+  java_lang_invoke_MethodHandles_lookup = nullptr;
+  java_lang_invoke_MethodHandles_Lookup_findConstructor = nullptr;
+  java_lang_Long_valueOf = nullptr;
+  java_lang_ref_FinalizerReference_add = nullptr;
+  java_lang_ref_ReferenceQueue_add = nullptr;
+  java_lang_reflect_Parameter_init = nullptr;
+  java_lang_reflect_Proxy_invoke = nullptr;
+  java_lang_Runtime_nativeLoad = nullptr;
+  java_lang_Short_valueOf = nullptr;
+  java_lang_String_charAt = nullptr;
+  java_lang_System_runFinalization = nullptr;
+  java_lang_Thread_dispatchUncaughtException = nullptr;
+  java_lang_Thread_init = nullptr;
+  java_lang_Thread_run = nullptr;
+  java_lang_ThreadGroup_removeThread = nullptr;
+  java_nio_DirectByteBuffer_init = nullptr;
+  libcore_reflect_AnnotationFactory_createAnnotation = nullptr;
+  libcore_reflect_AnnotationMember_init = nullptr;
+  org_apache_harmony_dalvik_ddmc_DdmServer_broadcast = nullptr;
+  org_apache_harmony_dalvik_ddmc_DdmServer_dispatch = nullptr;
+
+  dalvik_system_BaseDexClassLoader_pathList = nullptr;
+  dalvik_system_DexFile_cookie = nullptr;
+  dalvik_system_DexFile_fileName = nullptr;
+  dalvik_system_DexPathList_dexElements = nullptr;
+  dalvik_system_DexPathList__Element_dexFile = nullptr;
+  java_lang_reflect_Executable_artMethod = nullptr;
+  java_lang_reflect_Proxy_h = nullptr;
+  java_lang_Thread_daemon = nullptr;
+  java_lang_Thread_group = nullptr;
+  java_lang_Thread_lock = nullptr;
+  java_lang_Thread_name = nullptr;
+  java_lang_Thread_priority = nullptr;
+  java_lang_Thread_nativePeer = nullptr;
+  java_lang_ThreadGroup_groups = nullptr;
+  java_lang_ThreadGroup_ngroups = nullptr;
+  java_lang_ThreadGroup_mainThreadGroup = nullptr;
+  java_lang_ThreadGroup_name = nullptr;
+  java_lang_ThreadGroup_parent = nullptr;
+  java_lang_ThreadGroup_systemThreadGroup = nullptr;
+  java_lang_Throwable_cause = nullptr;
+  java_lang_Throwable_detailMessage = nullptr;
+  java_lang_Throwable_stackTrace = nullptr;
+  java_lang_Throwable_stackState = nullptr;
+  java_lang_Throwable_suppressedExceptions = nullptr;
+  java_nio_DirectByteBuffer_capacity = nullptr;
+  java_nio_DirectByteBuffer_effectiveDirectAddress = nullptr;
+  java_util_ArrayList_array = nullptr;
+  java_util_ArrayList_size = nullptr;
+  java_util_Collections_EMPTY_LIST = nullptr;
+  libcore_util_EmptyArray_STACK_TRACE_ELEMENT = nullptr;
+  org_apache_harmony_dalvik_ddmc_Chunk_data = nullptr;
+  org_apache_harmony_dalvik_ddmc_Chunk_length = nullptr;
+  org_apache_harmony_dalvik_ddmc_Chunk_offset = nullptr;
+  org_apache_harmony_dalvik_ddmc_Chunk_type = nullptr;
+}
+
 ObjPtr<mirror::Class> WellKnownClasses::ToClass(jclass global_jclass) {
   auto ret = ObjPtr<mirror::Class>::DownCast(Thread::Current()->DecodeJObject(global_jclass));
   DCHECK(!ret.IsNull());
diff --git a/runtime/well_known_classes.h b/runtime/well_known_classes.h
index 2f2f1ad..7deef63 100644
--- a/runtime/well_known_classes.h
+++ b/runtime/well_known_classes.h
@@ -37,6 +37,9 @@
  public:
   static void Init(JNIEnv* env);  // Run before native methods are registered.
   static void LateInit(JNIEnv* env);  // Run after native methods are registered.
+
+  static void Clear();
+
   static ArtMethod* StringInitToStringFactory(ArtMethod* method);
   static uint32_t StringInitToEntryPoint(ArtMethod* method);