Android模拟器的判定
开发当中,有时需要判断当前设备是否为模拟器。一般判断的方法是通过匹配Build.MODEL, Build.MANUFACTURER, 属性”ro.hardware”的值。
其实查看Build的源码可以发现,其暴露出来的MODEL/MANUFACTURER等属性也是调用android.os.SystemProperties#get(java.lang.String, java.lang.String)方法,读取相应的值
MODEL为ro.product.model
MANUFACTURE为ro.product.manufacturer
由于工作需要,对比了几种常见的模拟器及其特征值,这里简单总结一下。
Android Google Simuator
- Build.MODEL - Android SDK built for x86
- Build.MANUFACTURER - unknown
- ro.hardware - goldfish
这里使用”ro.hardware”比较合适,它的稳定性看起来更高一些
Genymotion
- Build.MODEL - Samsung Galaxy S5 - 4.4.4 - API 19 - 1080x1920
- Build.MANUFACTURER - Genymotion
- ro.hardware - vbox86
这里我是用的是MANUFACTURER,MODEL和你选择的模拟机型相关,而ro.hardware就是使用的vm的标识(VirtualBox),有可能会因为平台不一样而变化
BlueStacks
- Build.MODEL - GT-N7100
- Build.MANUFACTURER - sumsung
- ro.hardware - smdk4x12
这个相比就不厚道了,完全模拟三星的N7100,这几个字段无法判定
ro.hardware的获取方法
String roHardware = getSystemPropertie("ro.hardware");
/**
* 获取系统属性值
*/
public static String getSystemPropertie(String propertyName) {
String value = "";
try {
Class clazz = Class.forName("android.os.SystemProperties");
Class[] paramTypes = new Class[1];
paramTypes[0] = String.class;
Method method = clazz.getMethod("get", paramTypes);
Object object = clazz.newInstance();
Object[] propertyNames = new Object[1];
propertyNames[0] = propertyName;
value = (String) method.invoke(object, propertyNames);
} catch (Exception e) {
}
return value;
}
其它模拟器
精力有限,还有一些其它的模拟器没有研究,列一下