也是出於感興趣,類似於我們有時候不希望自己的程序運行在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之類的,或許可以用於預判的還有不少