How can I detect the Android runtime (Dalvik or ART) in Xamarin

回眸只為那壹抹淺笑 提交于 2019-12-25 04:26:42

问题


Similar question to this one : How can I detect the Android runtime (Dalvik or ART)?

How to do it in Xamarin.Android (MonoDroid), since I dont have java reflection here?

Since ART is not working on xamarin yet, I would like to detect it and show user some friendly message instead on app crash at least. Thanks.


回答1:


Seems to work on the emulator, don't know what happens with actual device until it gets some charge:

[Activity (Label = "RuntimeActivity", MainLauncher = true)]
public class RuntimeActivity : Activity 
{
    private static readonly string SELECT_RUNTIME_PROPERTY = "persist.sys.dalvik.vm.lib";
    private static readonly string LIB_DALVIK = "libdvm.so";
    private static readonly string  LIB_ART = "libart.so";
    private static readonly string  LIB_ART_D = "libartd.so";

    override protected void OnCreate(Bundle savedInstanceState) {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.runtime);

        var tv = FindViewById<TextView>(Resource.Id.textView1);
        tv.Text = getCurrentRuntimeValue ();
    }

    private string getCurrentRuntimeValue() 
    {
        try 
        {
            var systemProperties = Java.Lang.Class.ForName("android.os.SystemProperties");

            try 
            {
                var str = new Java.Lang.String();
                var getMethod = systemProperties.GetMethod("get", str.Class, str.Class);

                if (getMethod == null) 
                {
                    return "WTF?!";
                }

                try 
                {
                    var value = getMethod.Invoke(systemProperties, SELECT_RUNTIME_PROPERTY,
                        /* Assuming default is */"Dalvik").ToString();
                    if (LIB_DALVIK.Equals(value)) {
                        return "Dalvik";
                    } else if (LIB_ART.Equals(value)) {
                        return "ART";
                    } else if (LIB_ART_D.Equals(value)) {
                        return "ART debug build";
                    }

                    return value;
                } 
                catch (IllegalAccessException e) 
                {
                    Log.Error(this.ToString(), e.Message);
                    return "IllegalAccessException";
                } 
                catch (IllegalArgumentException e) 
                {
                    Log.Error(this.ToString(), e.Message);
                    return "IllegalArgumentException";
                } 
                catch (InvocationTargetException e) 
                {
                    Log.Error(this.ToString(), e.Message);
                    return "InvocationTargetException";
                }
            } 
            catch (NoSuchMethodException e) 
            {
                Log.Error(this.ToString(), e.Message);
                return "SystemProperties.get(String key, String def) method is not found";
            }
        } 
        catch (ClassNotFoundException e) 
        {
            Log.Error(this.ToString(), e.Message);
            return "SystemProperties class is not found";
        }
    }
}



回答2:


Xamarin.Android itself uses __system_property_get, which is a stable, documented, API, so you can use P/Invoke to do the same:

// <sys/system_properties.h>
[DllImport ("/system/lib/libc.so")]
static extern int __system_property_get (string name, StringBuilder value);

const int MaxPropertyNameLength   = 32; // <sys/system_properties.h>
const int MaxPropertyValueLength  = 92; // <sys/system_properties.h>

static bool OnArt {
    get {
        var buf = new StringBuilder (MaxPropertyValueLength + 1);
        int n   = __system_property_get ("persist.sys.dalvik.vm.lib", buf);
        if (n > 0)
            return buf.ToString () == "libart.so";
        return false;
    }
}


来源:https://stackoverflow.com/questions/22017813/how-can-i-detect-the-android-runtime-dalvik-or-art-in-xamarin

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!