以下のコードを使用して、ユーザーがランタイムを ART に変更したかどうかを判断しています (Xamarin は現在サポートしていないため、アプリがクラッシュします)。
private bool IsART {
get {
try {
var systemProperties = Java.Lang.Class.ForName("android.os.SystemProperties");
var strClass = Java.Lang.Class.FromType(typeof (Java.Lang.String));
Method get = systemProperties.GetMethod("get", strClass, strClass);
string value = get.Invoke(systemProperties, "persist.sys.dalvik.vm.lib", "Dalvik").ToString();
if ("libart.so".Equals(value) || "libartd.so".Equals(value)) {
return true;
}
}
catch {}
return false;
}
}
私のテスト デバイス (HTC One X) では問題なく動作しますが、ART が有効になっている Nexus 5 で実行すると、次のスタック トレースで SIGSEGV エラーが発生します (try-catch ではキャッチされません)。
03-18 19:39:30.045 E/mono-rt (26924): at <unknown> <0xffffffff>
03-18 19:39:30.045 E/mono-rt (26924): at (wrapper managed-to-native) object.wrapper_native_0x415b0f9d (intptr,intptr,intptr,Android.Runtime.JValue[]) <0xffffffff>
03-18 19:39:30.045 E/mono-rt (26924): at (wrapper delegate-invoke) <Module>.invoke_intptr__this___intptr_intptr_intptr_JValue[] (intptr,intptr,intptr,Android.Runtime.JValue[]) <0xffffffff>
03-18 19:39:30.045 E/mono-rt (26924): at Android.Runtime.JNIEnv.CallStaticObjectMethod (intptr,intptr,Android.Runtime.JValue[]) <0x00097>
03-18 19:39:30.045 E/mono-rt (26924): at Java.Lang.Class.ForName (string) <0x000ef>
03-18 19:39:30.045 E/mono-rt (26924): at AwesomeApp.Droid.SplashScreen.get_IsART () <0x0001b>