MonoDroid - SIGSEGV在检查Dalvik vs ART时

时间:2014-03-19 11:13:24

标签: android xamarin xamarin.android art-runtime

我正在使用以下代码来确定用户是否已将运行时更改为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>

1 个答案:

答案 0 :(得分:0)

Xamarin.Android 4.12.3开始,ART正式受到支持,因此错误不再发生。