精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

91网站最新网址| 久久一区91| 精品日韩美女的视频高清| 国产精品久久久久久久久久久久冷 | 欧美国产日韩在线观看成人| 哺乳挤奶一区二区三区免费看| 欧美色欧美亚洲高清在线视频| 香蕉久久免费影视| 亚洲成a人片在线| 久久综合导航| 久久99久久久久久久噜噜| 中文字幕在线观看网址| 91精品国产自产观看在线| 亚洲国产中文字幕在线视频综合| 日本不卡二区| 韩国av电影在线观看| 蜜臀av一级做a爰片久久| 欧美极品xxxx| 美国精品一区二区| 北条麻妃一区二区三区在线观看| 中文字幕91爱爱| 成年男女免费视频网站不卡| 国产日韩欧美制服另类| 99久久伊人精品影院| 亚洲不卡视频在线观看| 欧美一区网站| 国产亚洲精品久久久久久牛牛| 下面一进一出好爽视频| 日韩不卡视频在线观看| 亚洲国产裸拍裸体视频在线观看乱了| 日韩三级电影| 深夜福利免费在线观看| 国产成人在线视频免费播放| 国产精品视频网站| 国产美女激情视频| 欧美精品偷拍| 蜜臀久久99精品久久久无需会员| 最近中文字幕免费视频| 加勒比中文字幕精品| 欧美一区二区三区爱爱| 精品久久久久久久无码| 日本黄色免费在线| 亚洲一区二区三区三| 亚洲欧美日韩不卡| 91伦理视频在线观看| 久久久噜噜噜久噜久久综合| 精品视频在线观看| 日韩在线视频第一页| 国产精品一区二区久激情瑜伽| 国产日韩精品一区二区| 最好看的日本字幕mv视频大全| 欧美一区=区| 91精品国产91久久久久福利| 午夜影院在线看| 亚洲理论在线| 91干在线观看| 日韩在线播放中文字幕| 毛片一区二区| 国产精品香蕉av| 青娱乐国产91| 欧美最猛性xxxxx(亚洲精品)| 福利视频999| 日本欧美在线| 884aa四虎影成人精品一区| 亚洲一级免费观看| 国产原创一区| 4438x亚洲最大成人网| 欧美丝袜在线观看| 精品视频在线一区| 日韩欧美国产系列| 欧美丰满熟妇bbb久久久| 97一区二区国产好的精华液| 精品国产乱码久久久久久久久| 第一页在线视频| 精品女人视频| 亚洲欧美在线一区| 九九热免费在线| 91精品国产乱码久久久久久久| 欧美精品生活片| 欧美另类视频在线观看| 亚洲人成毛片在线播放女女| 欧洲亚洲在线视频| 中文字幕欧美人妻精品一区蜜臀| 久久99蜜桃精品| 999国产视频| 日本1级在线| 国产精品网曝门| 国产av熟女一区二区三区| 超碰在线cao| 在线精品视频一区二区| 中文 日韩 欧美| 日韩精品导航| 久久视频在线免费观看| 日本五十路女优| 毛片av一区二区三区| 97se亚洲综合| 国产在线视频网站| 亚洲黄色免费网站| 久久久免费视频网站| 久久久久黄色| 亚洲国产精品成人精品| 手机看片国产日韩| 1024日韩| 成人网在线观看| 视频三区在线观看| 亚洲精品ww久久久久久p站| 超碰网在线观看| 欧美精品三级在线| 一本大道久久加勒比香蕉| 放荡的美妇在线播放| 天堂成人免费av电影一区| 亚洲一区久久久| 国产精品秘入口| 亚洲亚洲人成综合网络| 日本三级黄色网址| 天堂成人娱乐在线视频免费播放网站 | 国产ts人妖调教重口男| 久久综合九色综合欧美98| av电影一区二区三区| 国产精品专区免费| 欧美成人三级电影在线| 老司机福利在线观看| 99精品热视频只有精品10| 亚洲一区二区三区香蕉| 在线免费黄色| 91国产福利在线| 好吊色视频一区二区三区| 欧美1区免费| 成人久久久久久久| a√在线中文网新版址在线| 欧美日韩精品在线观看| 在线xxxxx| 欧美国产精品| 亚洲字幕在线观看| 久久99精品久久久久久野外| 欧美在线不卡视频| 黄瓜视频污在线观看| 亚洲美女少妇无套啪啪呻吟| av一本久道久久波多野结衣| 老司机av在线免费看| 欧美在线一区二区| 亚洲精品国产91| 天堂蜜桃一区二区三区 | 视频污在线观看| 亚洲一区二区在线免费观看视频 | 婷婷久久综合九色综合99蜜桃| 国产一区二区三区在线观看网站| 九九热精品视频在线| 成人国产精品视频| 亚洲人成无码网站久久99热国产 | 久久se精品一区精品二区| 亚洲福利av在线| 九九九精品视频| 久久久国产精品一区| 国产精品视频在线观看免费| 中文字幕亚洲不卡| 日韩a一级欧美一级| 自由日本语亚洲人高潮| 99久热re在线精品996热视频| av在线播放国产| 日韩精品专区在线影院重磅| 久久婷婷综合国产| a在线欧美一区| 日韩毛片在线免费看| 精品99在线| 国产一区视频在线| a视频在线播放| 精品国产91洋老外米糕| 欧美啪啪小视频| 中文字幕高清一区| 人人爽人人爽av| 亚洲特色特黄| 日韩.欧美.亚洲| 不卡的国产精品| 97色伦亚洲国产| 成人精品一区二区三区校园激情| 国产一区二区三区的电影| 国产精品素人一区二区| 国内外免费激情视频| 第一sis亚洲原创| 91麻豆国产精品| 成全电影大全在线观看| 亚洲男人天堂2023| 亚洲天堂中文在线| 一区二区三区在线视频免费观看| 亚洲天堂2024| 美女视频一区二区三区| 97干在线视频| 日韩精品91| 国产伦精品一区二区三区四区免费| 一本大道色婷婷在线| 中文字幕亚洲欧美日韩2019| 亚洲美女综合网| 禁久久精品乱码| 国产精品日韩欧美一区二区三区| 亚洲精品一区| 久久这里只有精品视频首页| 姝姝窝人体www聚色窝| 在线看日本不卡| 久久精品国产亚洲av高清色欲| 国产亚洲成av人在线观看导航 | 福利精品在线| 欧美高跟鞋交xxxxhd| 黄色av免费在线看| 日韩精品中文字幕在线一区| 国产成人麻豆免费观看| 亚洲一区二区欧美| 一二三四国产精品| 99re热这里只有精品免费视频| 天堂一区在线观看| 亚洲精品在线二区| 免费观看黄色的网站| 久久99免费视频| 国产精品久久一区二区三区| 视频欧美精品| 日本精品在线视频| 男人天堂亚洲| 久久五月情影视| 91在线导航| 日韩理论片久久| 蜜桃视频在线观看www| 欧美另类z0zxhd电影| 香蕉影院在线观看| 亚洲va欧美va人人爽午夜 | 亚洲一区二区三区自拍| 天天爽天天爽天天爽| 久久久九九九九| 久久久久成人精品无码中文字幕| 久久精品999| 毛葺葺老太做受视频| 亚洲精品欧美| 国产精品久久久久久久乖乖| 综合日韩在线| 一区二区三区一级片| 四季av一区二区凹凸精品| 日韩av电影免费在线| 亚洲宅男网av| 美媛馆国产精品一区二区| 欧美精品中文| 国内精品国语自产拍在线观看| 亚洲精选av| 国产传媒一区| aiai久久| 国产欧美日韩综合精品二区| 成人资源在线| 国产在线欧美日韩| 女同另类激情重口| 久久99国产精品| 日本午夜精品| 欧美一区二区视频17c| 夜夜春成人影院| 日本视频一区二区在线观看| 国产一区二区区别| 日韩激情久久| 日韩在线综合| 中文字幕一区二区三区最新| 亚洲乱码在线| 99er在线视频| 国产精品乱看| 激情五月亚洲色图| 日韩成人免费看| 999这里有精品| 国产乱码字幕精品高清av| 下面一进一出好爽视频| 播五月开心婷婷综合| 亚洲乱码国产乱码精品精大量| 久久精品亚洲精品国产欧美 | 日本午夜一区| 免费久久久久久| 黄色国产精品| 毛片av免费在线观看| 美洲天堂一区二卡三卡四卡视频| 日本免费色视频| 国产91精品在线观看| 少妇精品一区二区| 成人不卡免费av| 97超级碰在线看视频免费在线看 | 999国产精品一区| 国内精品久久国产| 激情综合网站| 爱情岛论坛亚洲入口| 少妇无码一区二区三区| 亚洲国产日韩欧美在线99| 色就是色亚洲色图| 视频在线一区二区| 欧美人体视频xxxxx| 午夜免费在线观看精品视频| 神马电影网我不卡| 国产免费一区二区三区在线观看 | 黄av在线播放| 欧美精品18videos性欧| 亚洲风情在线资源| 国产日韩欧美在线播放| 日韩三级av高清片| 免费av在线一区二区| 99精品美女| 青青草视频在线免费播放| 天堂av在线一区| 亚洲精品在线视频播放| 99精品视频在线观看免费| 久久久精品成人| 一区二区三区四区蜜桃| 在线观看污污网站| 91精品国产综合久久久蜜臀粉嫩| 色丁香婷婷综合久久| 中文字幕日韩视频| 国产啊啊啊视频在线观看| 国产精品视频地址| 午夜影院一区| 激情久久中文字幕| 俄罗斯av网站| 精品一区二区三区视频在线观看 | 日韩三级久久久| 国产日韩影视精品| 免费人成在线观看| 欧美性一二三区| 特级丰满少妇一级aaaa爱毛片| 最近的2019中文字幕免费一页 | 国产成人啪精品视频免费网| 日韩综合一区二区三区| 日韩妆和欧美的一区二区| 狠狠干成人综合网| www.超碰97.com| 久久久国产精品不卡| 国产乡下妇女做爰| 日韩一区二区高清| 91caoporm在线视频| 人人爽久久涩噜噜噜网站| 国产精伦一区二区三区| 91制片厂免费观看| 日韩成人免费电影| 国产精品无码久久久久一区二区| 亚洲第一成年网| 亚洲精品久久久狠狠狠爱| 另类专区欧美制服同性| 久久天堂影院| 国产精品久久亚洲7777| 欧洲视频在线免费观看| 日韩中文在线视频| 欧洲精品一区二区三区| 美女视频久久| 香蕉视频成人在线观看| 国产十八熟妇av成人一区| 亚洲卡通欧美制服中文| 国产精品羞羞答答在线| 久久精品99久久香蕉国产色戒| 国内精品伊人| 一级黄色录像免费看| 狠狠v欧美v日韩v亚洲ⅴ| 美女av免费看| 欧美日本视频在线| 国产小视频免费在线观看| 亚洲精品日产精品乱码不卡| 国产高潮久久久| 国产视频精品久久久| 色综合桃花网| 牛人盗摄一区二区三区视频 | 88av.com| 国产乱一区二区| 国产精品国产三级国产aⅴ浪潮| 日本午夜在线观看| 亚洲欧美韩国综合色| 亚洲一区二区三区高清视频| 一本色道久久88综合日韩精品| 午夜无码国产理论在线| 国产成人91久久精品| 日本波多野结衣在线| 欧美激情久久久久| 欧美人体视频| 黄色一级免费大片| 国产精品九色蝌蚪自拍| av手机免费看| 国内精品久久久久久中文字幕| 三级精品视频| a在线观看免费视频| 亚洲欧美日韩国产综合在线| 亚洲精品久久久久久久久久| 97人人爽人人喊人人模波多| 国模精品一区| gogo亚洲国模私拍人体| 精品久久久久久久久久久久| 成人性爱视频在线观看| 久热在线中文字幕色999舞| 欧美日韩生活片| 成人av在线网| 中文字幕视频网| 日韩中文在线观看| 亚洲精品高潮| 欧美a在线视频| 亚洲色大成网站www久久九九| a级片在线免费看| 久久琪琪电影院| 狠狠色丁香婷婷综合影院| 中文字幕欧美视频| 欧美午夜美女看片| a视频在线免费看| 日韩电影免费观看在| 高清shemale亚洲人妖| 国产熟妇一区二区三区四区| 欧美精品午夜视频|