当前位置 博文首页 > 赵星海的博客:Android 判断App运行在模拟器还是真机上的最终解

    赵星海的博客:Android 判断App运行在模拟器还是真机上的最终解

    作者:[db:作者] 时间:2021-08-03 18:50

    最近公司搞了一波送福利的活动,被人用模拟器恶意刷注册量了.

    后来我经过研究和实测,得出以下方法,目前还没有发现有模拟器能突破这个检测,方法如下:

    方法使用:

        if(Android_ID_Utils.notHasBlueTooth()
          ||Android_ID_Utils.notHasLightSensorManager(this)
          ||Android_ID_Utils.isFeatures()
          ||Android_ID_Utils.checkIsNotRealPhone()
          ||Android_ID_Utils.checkPipes()){
                ToastUtils.ToastLong(this,"检查到您的设备违规,将限制您的所有功能使用!");
                return;
            }

    方法实体:

        /*
         *作者:赵星海
         *时间:2019/2/21 17:50
         *用途:判断蓝牙是否有效来判断是否为模拟器
         *返回:true 为模拟器
         */
        public static boolean notHasBlueTooth() {
            BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter();
            if (ba == null) {
                return true;
            } else {
                // 如果有蓝牙不一定是有效的。获取蓝牙名称,若为null 则默认为模拟器
                String name = ba.getName();
                if (TextUtils.isEmpty(name)) {
                    return true;
                } else {
                    return false;
                }
            }
        }
    
        /*
         *作者:赵星海
         *时间:2019/2/21 17:55
         *用途:依据是否存在光传感器来判断是否为模拟器
         *返回:true 为模拟器
         */
        public static Boolean notHasLightSensorManager(Context context) {
            SensorManager sensorManager = (SensorManager) context.getSystemService(context.SENSOR_SERVICE);
            Sensor sensor8 = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); //光
            if (null == sensor8) {
                return true;
            } else {
                return false;
            }
        }
    
        /*
         *作者:赵星海
         *时间:2019/2/21 17:56
         *用途:根据部分特征参数设备信息来判断是否为模拟器
         *返回:true 为模拟器
         */
        public static boolean isFeatures() {
            return Build.FINGERPRINT.startsWith("generic")
                    || Build.FINGERPRINT.toLowerCase().contains("vbox")
                    || Build.FINGERPRINT.toLowerCase().contains("test-keys")
                    || Build.MODEL.contains("google_sdk")
                    || Build.MODEL.contains("Emulator")
                    || Build.MODEL.contains("Android SDK built for x86")
                    || Build.MANUFACTURER.contains("Genymotion")
                    || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
                    || "google_sdk".equals(Build.PRODUCT);
        }
    
        /*
         *作者:赵星海
         *时间:2019/2/21 17:58
         *用途:根据CPU是否为电脑来判断是否为模拟器
         *返回:true 为模拟器
         */
        public static boolean checkIsNotRealPhone() {
            String cpuInfo = readCpuInfo();
            if ((cpuInfo.contains("intel") || cpuInfo.contains("amd"))) {
                return true;
            }
            return false;
        }
        /*
         *作者:赵星海
         *时间:2019/2/21 17:58
         *用途:根据CPU是否为电脑来判断是否为模拟器(子方法)
         *返回:String
         */
        public static String readCpuInfo() {
            String result = "";
            try {
                String[] args = {"/system/bin/cat", "/proc/cpuinfo"};
                ProcessBuilder cmd = new ProcessBuilder(args);
    
                Process process = cmd.start();
                StringBuffer sb = new StringBuffer();
                String readLine = "";
                BufferedReader responseReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "utf-8"));
                while ((readLine = responseReader.readLine()) != null) {
                    sb.append(readLine);
                }
                responseReader.close();
                result = sb.toString().toLowerCase();
            } catch (IOException ex) {
            }
            return result;
        }
    
        /*
         *作者:赵星海
         *时间:2019/2/21 17:50
         *用途:检测模拟器的特有文件
         *返回:true 为模拟器
         */
        private static String[] known_pipes = {"/dev/socket/qemud", "/dev/qemu_pipe"};
        public static boolean checkPipes() {
            for (int i = 0; i < known_pipes.length; i++) {
                String pipes = known_pipes[i];
                File qemu_socket = new File(pipes);
                if (qemu_socket.exists()) {
                    Log.v("Result:", "Find pipes!");
                    return true;
                }
            }
            Log.i("Result:", "Not Find pipes!");
            return false;
        }    
    
    

    如果您有什么建议的话,欢迎留言评论.谢谢.

    如果深海写的东西对您有用,请您给该博客点个赞吧

    大家的支持就是深海写博客的动力,谢过各位

    cs
    下一篇:没有了