如何判断一个APP运行于Android模拟器 - 堕落华为人

时间:2024-03-11 08:43:06

如何判断一个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之类的,或许可以用于预判的还有不少