精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android模擬器檢測方法有哪些?

移動開發 Android
隨著Android系統的更新,模擬器的增多,需要具體研究對應的一些變動來更新上述代碼。最終判定結果不一定能檢測出所有的模擬器,但是一定不能誤殺真機影響用戶正常使用。

Android模擬器的檢測,一般方法是通過檢查設備的一些特征來判斷應用是否運行在模擬器。

  1. 檢查Build信息:通過讀取設備的Build信息來判斷是否在模擬器上運行。例如,檢查設備的Build.MODEL和Build.MANUFACTURER是否包含常見的模擬器關鍵詞,如"generic"、"sdk"等。
  2. 檢查硬件特征:模擬器通常會模擬一些硬件特征,如IMEI、MAC地址等。通過檢查這些硬件特征來判斷是否在模擬器上運行。
  3. 檢查虛擬化指令集:模擬器通常會使用虛擬化指令集來模擬硬件,通過檢查CPU的指令集來判斷是否在模擬器上運行。
  4. 檢查運行環境:通過檢查設備的運行環境,如是否有電話功能、GPS功能等來判斷是否在模擬器上運行。

這些方法都不是絕對可靠的,模擬器的不斷發展可能會繞過這些檢測方法。在實際應用中,通過綜合多種方法進行檢測,以提高準確性。

普遍檢測方法

public boolean isEmulator() {

    String url = "tel:" + "123456";
    Intent intent = new Intent();
    intent.setData(Uri.parse(url));
    intent.setAction(Intent.ACTION_DIAL);
    // 是否可以處理跳轉到撥號的 Intent
    boolean canResolveIntent = intent.resolveActivity(mContext.getPackageManager()) != null;

    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.SERIAL.equalsIgnoreCase("unknown")
        || Build.SERIAL.equalsIgnoreCase("android")
        || 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)
        || ((TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE))
            .getNetworkOperatorName().toLowerCase().equals("android")
        || !canResolverIntent;
}

以上方法檢測模擬器有兩個問題:

  1. 撥號檢測,Android10.0及以上均為false,Android10.0以上會誤判。
  2. Build.SERIAL,Android8.0以上均為unknown導致8.0以上系統均會被誤判。

推薦檢測方法

設備信息檢測
private static final String[] known_numbers = {"15555215554", "15555215556", "15555215558", "15555215560", "15555215562", "15555215564", "15555215566", "15555215568", "15555215570", "15555215572", "15555215574", "15555215576", "15555215578", "15555215580", "15555215582", "15555215584",};

private boolean detectEmulator() {
    if (Build.FINGERPRINT.startsWith("generic") || Build.FINGERPRINT.startsWith("unknown")
        || 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)) {
        return true;
    }
    if (Build.PRODUCT.equals("sdk") || Build.PRODUCT.equals("sdk_x86")
        || Build.PRODUCT.equals("vbox86p") || Build.PRODUCT.equals("emulator")) {
        return true;
    }
    if (Build.BOARD == null) {
        return true;
    }
    if (Build.BOARD.equals("unknown")
        || Build.BOARD.contains("android")
        || Build.BOARD.contains("droid")) {
        return true;
    }
    if (Build.DEVICE == null) {
        return true;
    }
    if (Build.DEVICE.equals("unknown")
        || Build.DEVICE.contains("android")
        || Build.DEVICE.contains("droid")) {
        return true;
    }
    if (Build.HARDWARE == null) {
        return true;
    }
    if (Build.HARDWARE.equals("goldfish")
        || Build.HARDWARE.equals("ranchu")
        || Build.HARDWARE.contains("ranchu")) {
        return true;
    }
    if (Build.BRAND == null) {
        return true;
    }
    if (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) {
        return true;
    }
    if (Build.MANUFACTURER.equals("unknown")) {
        return true;
    }
    if (Build.MANUFACTURER.equals("Genymotion")) {
        return true;
    }
    if ((Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) || "google_sdk".equals(Build.PRODUCT)) {
        return true;
    }
    if (Build.PRODUCT == null) {
        return true;
    }
    if (Build.PRODUCT.equals("sdk")
        || Build.PRODUCT.equals("sdk_x86")
        || Build.PRODUCT.equals("vbox86p")
        || Build.PRODUCT.equals("emulator")) {
        return true;
    }
    if (Build.HARDWARE.equals("goldfish") || Build.HARDWARE.equals("ranchu")) {
        return true;
    }
    if (Build.FINGERPRINT.startsWith("generic")
        || Build.FINGERPRINT.startsWith("unknown")
        || 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)) {
        return true;
    }
    if (Build.PRODUCT == null) {
        return true;
    }
    if (Build.PRODUCT.equals("sdk")
        || Build.PRODUCT.equals("sdk_x86")
        || Build.PRODUCT.equals("vbox86p")
        || Build.PRODUCT.equals("emulator")) {
        return true;
    }
    if (Build.HARDWARE.equals("goldfish") || Build.HARDWARE.equals("ranchu")) {
        return true;
    }
    if (new File("/dev/socket/qemud").exists() || new File("/dev/qemu_pipe").exists()) {
        return true;
    }
    try {
        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        if (telephonyManager != null) {
            String deviceId = telephonyManager.getDeviceId();
            List<String> knownNumbers = Arrays.asList(known_numbers);
            if (knownNumbers.contains(deviceId)) {
                return true;
            }
        }
    } catch (Exception e) {
    }
    return false;
}

上面方法使用了多種方法來檢測設備是否為模擬器,包括:

  • 檢測 Build.FINGERPRINT 是否以 “generic” 或 “unknown” 開頭
  • 檢測 Build.MODEL 是否包含 “google_sdk”、“Emulator” 或 “Android SDK built for x86”
  • 檢測 Build.MANUFACTURER 是否為 “Genymotion”
  • 檢測 Build.PRODUCT 是否為 “sdk”、“sdk_x86”、“vbox86p” 或 “emulator”
  • 檢測 Build.BOARD 是否為 “unknown” 或包含 “android” 或 “droid”
  • 檢測 Build.DEVICE 是否為 “unknown” 或包含 “android” 或 “droid”
  • 檢測 Build.HARDWARE 是否為 “goldfish”、“ranchu” 或包含 “ranchu”
  • 檢測 Build.BRAND 是否以 “generic” 開頭,且 Build.DEVICE 以 “generic” 開頭
  • 檢測 Build.PRODUCT 是否為 “google_sdk”
  • 檢測是否存在文件 “/dev/socket/qemud” 或 “/dev/qemu_pipe”
  • 檢測設備的電話號碼是否為已知的模擬器電話號碼

都是基于固件信息的判斷,通過測試發現很多模擬器都失效,參考網上的教程,還有藍牙、光線傳感器、CPU檢測,配合上面的固件信息,基本可以搞定大部分模擬器。

藍牙檢測
public 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;
        }
    }
}
光線傳感器檢測
public static Boolean notHasLightSensorManager(Context context) {
    SensorManager sensorManager = (SensorManager) context.getSystemService(SENSOR_SERVICE);
    Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); 
    //光
    if (null == sensor) {
        return true;
    } else {
        return false;
    }
}
CPU檢測
public static boolean checkIsNotRealPhone() {
    String cpuInfo = readCpuInfo();
    if ((cpuInfo.contains("intel") || cpuInfo.contains("amd"))) {
        return true;
    }
    return false;
}

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

以上檢測方法也不是完全可行,隨著Android系統的更新,模擬器的增多,需要具體研究對應的一些變動來更新上述代碼。最終判定結果不一定能檢測出所有的模擬器,但是一定不能誤殺真機影響用戶正常使用。

責任編輯:武曉燕 來源: 沐雨花飛蝶
相關推薦

2017-05-03 14:57:34

2010-01-25 09:28:54

Android模擬器

2010-01-27 13:37:15

2014-06-06 10:32:11

Linux終端模擬器

2011-05-24 11:04:58

Android

2010-01-27 18:27:07

Android模擬器應

2013-07-24 16:08:01

Android模擬器Genymotion

2010-03-03 17:11:08

2014-11-17 10:34:15

2010-01-28 17:18:08

Android模擬器s

2009-09-14 09:59:19

CCNA模擬器介紹CCNA

2013-07-25 14:35:27

2015-07-27 10:38:14

微軟android模擬器

2011-05-26 13:22:33

電腦上安裝 Android

2012-12-25 12:26:39

2013-07-04 13:29:40

Androidgenymotion

2011-05-26 09:40:11

Android模擬器

2013-05-14 11:22:48

路由器DNSDHCP

2012-04-10 09:38:57

2012-12-31 14:07:23

Android模擬器快捷鍵
點贊
收藏

51CTO技術棧公眾號

久久精品超碰| 国精品人妻无码一区二区三区喝尿 | 国产精品va在线播放| 老熟妇一区二区| 欧美三级一区| 欧美性生活大片免费观看网址| 日韩av一级大片| 中文字幕一区二区三区波野结| 欧美有码视频| 日韩精品www| 五月婷婷六月丁香激情| 久草在线新免费首页资源站| 91丨九色丨黑人外教| 国产精品一二三在线| 伊人久久久久久久久久| 欧美理论一区二区| 国产精品久久婷婷| 性久久久久久| 欧美男插女视频| 欧美另类z0zx974| 成人影院中文字幕| 欧美另类z0zxhd电影| 日日碰狠狠添天天爽超碰97| 巨大荫蒂视频欧美另类大| 9人人澡人人爽人人精品| 国产剧情日韩欧美| 五月婷婷视频在线| 黄色亚洲精品| www.国产一区| 欧美波霸videosex极品| 国产精品中文字幕制服诱惑| 欧美男人的天堂一二区| 成人免费无码av| 欧美日韩在线观看首页| 亚洲精品第一国产综合野| 亚洲人成影视在线观看| 男男电影完整版在线观看| 成人av在线网| 国产福利久久精品| 99国产精品久久久久99打野战| 丝袜国产日韩另类美女| 91精品国产91久久久久久| 久草视频手机在线观看| 在线电影一区二区| 久久精品中文字幕一区| 超薄肉色丝袜一二三| 窝窝社区一区二区| 亚洲激情视频在线| 亚洲啪av永久无码精品放毛片 | 国产精品v亚洲精品v日韩精品 | 国产又粗又硬又长又爽| 一区二区三区韩国免费中文网站| 亚洲成人黄色在线观看| 午夜视频在线观| 四虎国产精品成人免费影视| 欧美日韩专区在线| 色婷婷久久99综合精品jk白丝| 91精品美女在线| 亚洲天堂男人网| 久草这里只有精品视频| 国产欧美一区二区三区久久| 最近中文字幕在线视频| 免费不卡在线观看| 成人h视频在线| av 一区二区三区| 国产乱妇无码大片在线观看| 国产精品一二区| 国产欧美一级片| 国产高清久久久| 国产伦一区二区三区色一情| 手机在线不卡av| 久久新电视剧免费观看| 欧美日韩一区在线视频| aaa日本高清在线播放免费观看| 国产欧美久久久精品影院| 亚洲国产精品久久久久久女王| av午夜在线| 亚洲日本在线a| 日本黄网站色大片免费观看| 黄色影院在线看| 欧美性生交大片免费| 韩国中文字幕av| 国产999精品在线观看| 精品国产污污免费网站入口| 亚洲熟妇无码av| 99国产精品一区二区| 九九久久久久99精品| 日韩欧美大片在线观看| 日韩精品视频网| 91在线高清视频| 午夜成人免费影院| 国产日韩精品视频一区| 日本道在线视频| 美女网站在线看| 精品1区2区3区| 欧美久久久久久久久久久| 欧美美乳视频| 色综合五月天导航| 天天干天天插天天射| 国产馆精品极品| 日本一区二区免费看| a黄色片在线观看| 欧美丝袜第一区| 在线亚洲一区二区| 日韩中文字幕在线不卡| 亚洲优女在线| 7777精品伊人久久久大香线蕉的 | 日韩精品一区二区三区中文字幕 | 在线视频亚洲| 91精品在线影院| 欧美孕妇孕交| 一区二区成人在线视频 | 国产成人77亚洲精品www| 日韩欧美123| 国产欧美小视频| 亚洲欧美网站| 国产高清精品一区二区三区| 91在线播放网站| 黑人巨大精品欧美一区二区免费 | 欧美午夜寂寞| 美女av一区二区三区| 久久精品五月天| aaa国产一区| 欧美极品少妇无套实战| 午夜精品久久久久久毛片| 亚洲精品自拍视频| 国产一级在线视频| 韩国精品免费视频| 亚洲欧美电影在线观看| 日本综合字幕| 日韩av一区二区在线观看| 久久99久久98精品免观看软件| 蜜臀精品久久久久久蜜臀| 精品久久久久久亚洲| 免费网站在线观看人| 91精品国产综合久久香蕉麻豆| 国产毛片欧美毛片久久久| 午夜综合激情| 美女视频久久| 国产777精品精品热热热一区二区| 欧美日韩中文精品| 国产毛片欧美毛片久久久| 久久激情久久| 欧美日韩一区二区视频在线| 91精品产国品一二三产区| 亚洲精品国精品久久99热一| 偷拍视频一区二区| 国产成人久久久久| 美女视频黄a大片欧美| 日韩欧美精品一区二区| 欧美大胆成人| 亚洲女成人图区| 国产精品久久久久久久久夜色| 2024国产精品视频| 成年人视频在线免费| 久久亚州av| 51ⅴ精品国产91久久久久久| 欧美午夜黄色| 色老综合老女人久久久| 五月天精品在线| 精品一区二区精品| 黄色一级视频播放| 亚洲高清在线一区| 性色av一区二区三区| 四虎在线视频| 在线观看成人免费视频| 亚洲熟女毛茸茸| 国产精品一区二区黑丝| 国产黄色激情视频| 台湾佬综合网| 国产精品久久婷婷六月丁香| 快射av在线播放一区| 日韩欧美激情一区| 国产无套丰满白嫩对白| 日本一区二区三区久久久久久久久不| 国产一二三区av| 综合一区av| 久久精彩视频| jizz久久久久久| 欧美福利在线观看| 美女欧美视频在线观看免费 | 91蝌蚪视频在线观看| 欧美激情国产在线| 国产精品乱码视频| 日韩不卡免费高清视频| 另类图片亚洲另类| 亚洲 欧美 激情 小说 另类| 欧洲人成人精品| 麻豆精品一区二区三区视频| 91亚洲永久精品| 182午夜在线观看| 亚洲精品色图| 亚洲精品成人自拍| 精品国产午夜肉伦伦影院| 国产精品扒开腿做爽爽爽视频| 91亚洲天堂| 亚洲一区999| 亚洲精品久久久蜜桃动漫| 色综合久久精品| 97免费中文视频在线观看| 国产精品免费无码| 国产一区二区福利视频| 91九色丨porny丨国产jk| av在线不卡免费观看| 不卡一卡2卡3卡4卡精品在| 亚洲成av在线| 久久久久国产精品www| av黄色在线观看| 亚洲国产精品小视频| 国产乱色精品成人免费视频| 日韩欧美国产中文字幕| 欧美成人精品欧美一级| 国产精品全国免费观看高清| 黄色污在线观看| 日本午夜精品一区二区三区电影| 制服诱惑一区| 国产欧美日韩在线一区二区| 国产精品对白一区二区三区| 国产精品无码久久久久| 欧美在线一区二区三区四| 日本在线观看大片免费视频| 色吧影院999| av在线电影播放| 国产丝袜高跟一区| 日韩有码第一页| 日韩欧美国产综合| 国产原创中文av| 欧美午夜免费电影| 免费看污视频的网站| 无吗不卡中文字幕| 欧美交换国产一区内射| 中文字幕制服丝袜一区二区三区 | 亚洲欧美视频一区| 毛片久久久久久| 日本一区二区三区四区| av网站免费在线看| 国产喂奶挤奶一区二区三区| 玖草视频在线观看| av在线不卡免费看| 国产十八熟妇av成人一区| 国产风韵犹存在线视精品| 天天久久综合网| 国产在线精品一区二区夜色 | 91麻豆国产自产在线观看| 亚洲精品乱码久久久久久蜜桃图片| 国产乱码精品一区二区三| 日韩a一级欧美一级| 韩国精品在线观看| 中文字幕乱妇无码av在线| 国产精品亚洲人在线观看| 超级砰砰砰97免费观看最新一期| 国产一区999| 91成品人片a无限观看| 欧美日韩精品亚洲精品| 亚洲欧洲中文日韩久久av乱码| 国产又色又爽又高潮免费| 国产精品国产三级国产有无不卡 | 91久久久一线二线三线品牌| 国产精品一区二区三区四区在线观看 | 精品国产制服丝袜高跟| 欧洲av在线播放| 国产午夜精品理论片a级探花| 人成免费电影一二三区在线观看| 日韩精品视频在线免费观看| 精品三级久久久久久久电影聊斋| 亚洲区中文字幕| 日本中文字幕在线观看| 理论片在线不卡免费观看| 欧美理论电影| 欧美一级高清免费| 成人在线免费电影网站| 91精品一区二区| 久草在线综合| 色爱区成人综合网| 99热在线成人| 人人妻人人做人人爽| 午夜亚洲性色福利视频| 天堂视频免费看| 福利一区二区在线观看| 三级黄色片网站| 国产精品麻豆视频| 久操免费在线视频| 在线精品视频免费观看| 国产男男gay网站| 亚洲国产毛片完整版| 成人资源www网在线最新版| 欧美噜噜久久久xxx| 深夜成人在线| 成人黄色av网| 欧美理伦片在线播放| 色之综合天天综合色天天棕色| 亚洲欧美色图| 99热成人精品热久久66| 国产在线精品一区二区三区不卡| 特级西西人体4444xxxx| 中文字幕在线不卡一区| 国产三级av片| 日韩一卡二卡三卡国产欧美| 欧美日韩免费做爰大片| 久久成人精品一区二区三区| 黄色在线观看www| 91麻豆桃色免费看| 精品国产成人| 黄色一级视频在线播放| 精品亚洲欧美一区| 91成人破解版| 亚洲成人综合网站| 国产精品一区二区黑人巨大| 亚洲精选中文字幕| av影视在线| 青青青伊人色综合久久| 久久精品国产sm调教网站演员| 免费不卡在线观看| 公侵犯人妻一区二区三区| 亚洲激情自拍偷拍| 在线黄色av网站| 亚洲毛片在线观看| 1区2区3区在线| 91高跟黑色丝袜呻吟在线观看| 狠狠色狠狠色综合婷婷tag| 免费在线观看视频a| 国产精品一二三| 国产第一页浮力| 欧美日韩高清一区二区三区| 欧洲综合视频| 日本精品久久中文字幕佐佐木 | 快播日韩欧美| 欧美日韩爆操| 91亚洲一区二区| 中文字幕欧美一| 在线免费一区二区| 亚洲三级 欧美三级| 深夜在线视频| 极品日韩久久| 宅男噜噜噜66一区二区| 无码成人精品区在线观看| 一片黄亚洲嫩模| www日本在线| 久久91亚洲精品中文字幕奶水| 成人97精品毛片免费看| 永久久久久久| 狠狠色2019综合网| 四虎884aa成人精品| 欧美精品777| 国产剧情在线| 91夜夜未满十八勿入爽爽影院| 天天做综合网| 亚洲av无码久久精品色欲| 亚洲精品日产精品乱码不卡| jlzzjlzzjlzz亚洲人| 欧美另类高清videos| 澳门久久精品| 69堂免费视频| 久久久91精品国产一区二区精品| 丁香社区五月天| 中文字幕欧美亚洲| 成人在线日韩| 精品人妻人人做人人爽| 粉嫩高潮美女一区二区三区| 国产一级免费av| 日韩av中文字幕在线播放| 中文字幕资源网在线观看免费 | 色诱视频网站一区| 国产福利小视频在线观看| 国产在线a不卡| 女同性一区二区三区人了人一| 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | 欧美卡1卡2卡| 欧美色图天堂| 蜜桃成人免费视频| 美女视频黄久久| 久久综合久久鬼| 亚洲美女喷白浆| 欧美91在线|欧美| 国产成人永久免费视频| 91色porny蝌蚪| 一二区在线观看| 久久精品人人| 国产精品一二三区在线观看| 7777精品伊人久久久大香线蕉经典版下载 | 精品欧美激情在线观看| 捷克做爰xxxⅹ性视频| 精品高清一区二区三区| 美女羞羞视频在线观看| 国产精品免费观看高清| 日韩电影在线一区二区| 99精品久久久久| 日韩精品中文字幕久久臀| 欧美黑粗硬大| 欧美a v在线播放| 亚洲欧美另类小说视频| 色在线免费视频| 亚洲一区亚洲二区亚洲三区| 亚洲一区二区网站| 国产黄在线免费观看| 亚洲男子天堂网| 一区二区三区亚洲变态调教大结局 | 极品少妇一区二区| 99热只有这里有精品| 久久夜色精品国产|