如何判断一个APP运行于Android模拟器
也是出于感兴趣,类似于我们有时候不希望自己的程序运行在Windows虚拟机一样,有时候也有人会会关心自己写的APP是否运行于Android模拟器下面
以下是网上2种讨论最多的办法:
(1)判断IMEI
public static boolean isEmulatorByImei(Context context){ TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); String imei = tm.getDeviceId(); Log.e("imei=",imei); if (imei == null || imei.equals("000000000000000")){ return true; } return false; }
主要目的是判断IMEI是否为”000000000000000“从而推断是否运行于模拟器下面,是就说明肯定是模拟器
(2)判断Build.MODEL
private boolean isEmulatorByBuildModel() { Log.e("MODEL=",Build.MODEL); Log.e("MANUFACTURER=",Build.MANUFACTURER); return ( Build.MODEL.equals("sdk")) || (Build.MODEL.equals("google_sdk") ); }
如果Build.MODEL是sdk或者google_sdk说明是运行在模拟器下面
不过第一种针对IMEI的方法并不是很靠谱,因为Android模拟器的IMEI可以修改,例如我是Froyo的模拟器,可以通过修改tools下面的emulator.exe的内容从而实现修改模拟器IMEI:
(修改前)
(修改后)
(修改后测试)
不过参考的帖子中有人提到Android4.X的模拟器不行,这个我没有作进一步测试了。
另外还有一种我在阅读Froyo代码时候想到的办法,查看属性(adb shell getprop):
这个属性在模拟器中也是独有的,参考/init.rc的脚本就可以知道:
# adbd on at boot in emulator on property:ro.kernel.qemu=1 start adbd
模拟器中还有一些一般固定的参数,如DNS之类的,或许可以用于预判的还有不少