ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android 判断App运行在模拟器还是真机上的最终解决方案

2021-01-27 20:01:04  阅读:123  来源: 互联网

标签:return String App contains Build Android true 模拟器


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

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

方法使用:

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;
}

标签:return,String,App,contains,Build,Android,true,模拟器
来源: https://blog.csdn.net/wusejiege6/article/details/113267879

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有