国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

安卓判斷是否是模擬器,適配主流雷電,MUMU,夜神,逍遙

這篇具有很好參考價(jià)值的文章主要介紹了安卓判斷是否是模擬器,適配主流雷電,MUMU,夜神,逍遙。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

最近游戲項(xiàng)目組又有新的要求,對(duì)于數(shù)據(jù)上報(bào)和數(shù)據(jù)統(tǒng)計(jì)接口,盡可能的具體化,比如是否是模擬器,模擬器的型號(hào),品牌等,都要求統(tǒng)計(jì),后續(xù)模擬器玩家在活動(dòng)發(fā)放,安全風(fēng)控等方面也易于分析和把控。

實(shí)現(xiàn)

在網(wǎng)上搜了搜,大概思路是:

1:模擬器的cpu是x86,arm的,通過(guò)cpu信息判斷

2:模擬器的傳感器比較少,尤其沒(méi)有光傳感器等

3:模擬器沒(méi)有藍(lán)牙模塊,可以通過(guò)藍(lán)牙判斷,這里沒(méi)有考慮,畢竟需要?jiǎng)討B(tài)權(quán)限

Manifest.permission.BLUETOOTH_CONNECT

在隱私合規(guī)的大環(huán)境下,還是盡量避免獲取多的權(quán)限

4:通過(guò)部分特征參數(shù),比如Build.FINGERPRINT、 Build.MODEL、Build.BRAND

5:通過(guò)模擬器特有文件檢測(cè)

下面具體貼上工具類代碼:

package com.xx.xx.myapplication;

import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class EmutorUtils {

    private static final String TAG = "EmutorUtils";

    private static final String[] PKG_NAMES = {"com.mumu.launcher", "com.ami.duosupdater.ui", "com.ami.launchmetro",
            "com.ami.syncduosservices", "com.bluestacks.home", "com.bluestacks.windowsfilemanager",
            "com.bluestacks.settings", "com.bluestacks.bluestackslocationprovider", "com.bluestacks.appsettings",
            "com.bluestacks.bstfolder", "com.bluestacks.BstCommandProcessor", "com.bluestacks.s2p", "com.bluestacks.setup",
            "com.bluestacks.appmart", "com.kaopu001.tiantianserver", "com.kpzs.helpercenter", "com.kaopu001.tiantianime",
            "com.android.development_settings", "com.android.development", "com.android.customlocale2", "com.genymotion.superuser",
            "com.genymotion.clipboardproxy", "com.uc.xxzs.keyboard", "com.uc.xxzs", "com.blue.huang17.agent", "com.blue.huang17.launcher",
            "com.blue.huang17.ime", "com.microvirt.guide", "com.microvirt.market", "com.microvirt.memuime", "cn.itools.vm.launcher",
            "cn.itools.vm.proxy", "cn.itools.vm.softkeyboard", "cn.itools.avdmarket", "com.syd.IME", "com.bignox.app.store.hd",
            "com.bignox.launcher", "com.bignox.app.phone", "com.bignox.app.noxservice", "com.android.noxpush", "com.haimawan.push",
            "me.haima.helpcenter", "com.windroy.launcher", "com.windroy.superuser", "com.windroy.launcher", "com.windroy.ime",
            "com.android.flysilkworm", "com.android.emu.inputservice", "com.tiantian.ime", "com.microvirt.launcher", "me.le8.androidassist",
            "com.vphone.helper", "com.vphone.launcher", "com.duoyi.giftcenter.giftcenter"};

    private static final String[] FILES = {"/data/data/com.android.flysilkworm", "/data/data/com.bluestacks.filemanager"};

    public static String checkFeaturesByHardware(Context context) {
        String result = "";
        String hardware = getProperty("ro.hardware");
        if (null == hardware)
            return "unknown";
        String tempValue = hardware.toLowerCase();
        Log.d(TAG,tempValue);
        if(tempValue.startsWith("cancro")){
            result = "MUMU模擬器";
        }else if(tempValue.contains("nox")){
            result = "夜神模擬器";
        }else if(tempValue.equals("android_x86")){
            result= "雷電模擬器";
        }else{
            List pathList = getInstalledSimulatorPackages(context);
            result =  getSimulatorBrand(pathList);
        }
        return result;
    }

    private static String getProperty(String propName) {
        String value = null;
        Object roSecureObj;
        try {
            roSecureObj = Class.forName("android.os.SystemProperties")
                    .getMethod("get", String.class)
                    .invoke(null, propName);
            if (roSecureObj != null) value = (String) roSecureObj;
        } catch (Exception e) {
            value = null;
        } finally {
            return value;
        }
    }


    private static List getInstalledSimulatorPackages(Context context) {
        ArrayList localArrayList = new ArrayList();
        try {
            for (int i = 0; i < PKG_NAMES.length; i++)
                try {
                    context.getPackageManager().getPackageInfo(PKG_NAMES[i], PackageManager.GET_ACTIVITIES);
                    localArrayList.add(PKG_NAMES[i]);
                } catch (PackageManager.NameNotFoundException localNameNotFoundException) {
                }
            if (localArrayList.size() == 0) {
                for (int i = 0; i < FILES.length; i++) {
                    if (new File(FILES[i]).exists())
                        localArrayList.add(FILES[i]);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return localArrayList;
    }

    private static String getSimulatorBrand(List<String> list) {
        if (list.size() == 0)
            return "";
        String pkgName = list.get(0);
        if (pkgName.contains("mumu")) {
            return "mumu";
        } else if (pkgName.contains("ami")) {
            return "AMIDuOS";
        } else if (pkgName.contains("bluestacks")) {
            return "藍(lán)疊";
        } else if (pkgName.contains("kaopu001") || pkgName.contains("tiantian")) {
            return "天天";
        } else if (pkgName.contains("kpzs")) {
            return "靠譜助手";
        } else if (pkgName.contains("genymotion")) {
            if (Build.MODEL.contains("iTools")) {
                return "iTools";
            } else if ((Build.MODEL.contains("ChangWan"))) {
                return "暢玩";
            } else {
                return "genymotion";
            }
        } else if (pkgName.contains("uc")) {
            return "uc";
        } else if (pkgName.contains("blue")) {
            return "blue";
        } else if (pkgName.contains("microvirt")) {
            return "逍遙";
        } else if (pkgName.contains("itools")) {
            return "itools";
        } else if (pkgName.contains("syd")) {
            return "手游島";
        } else if (pkgName.contains("bignox")) {
            return "夜神";
        } else if (pkgName.contains("haimawan")) {
            return "海馬玩";
        } else if (pkgName.contains("windroy")) {
            return "windroy";
        } else if (pkgName.contains("flysilkworm")) {
            return "雷電";
        } else if (pkgName.contains("emu")) {
            return "emu";
        } else if (pkgName.contains("le8")) {
            return "le8";
        } else if (pkgName.contains("vphone")) {
            return "vphone";
        } else if (pkgName.contains("duoyi")) {
            return "多益";
        }
        return "";
    }


    public static boolean isEmulator(Context context){
              return notHasLightSensorManager(context)
                ||isFeatures()
                ||checkIsNotRealPhone()
                ||checkPipes() ||isYeshenEmulator();
    }


    public static String getPhoneBrand(){
        return android.os.Build.BRAND;
    }

    public static String getPhoneModel(){
        return  android.os.Build.MODEL;
    }

    /*
     *用途:判斷藍(lán)牙是否有效來(lái)判斷是否為模擬器
     *返回:true 為模擬器
     */
//    private static boolean notHasBlueTooth() {
//        BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter();
//        if (ba == null) {
//            return true;
//        } else {
//            // 如果有藍(lán)牙不一定是有效的。獲取藍(lán)牙名稱,若為null 則默認(rèn)為模擬器
//            String name = ba.getName();
//            if (TextUtils.isEmpty(name)) {
//                return true;
//            } else {
//                return false;
//            }
//        }
//    }

    /*
     *用途:依據(jù)是否存在光傳感器來(lái)判斷是否為模擬器
     *返回:true 為模擬器
     */
    private 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;
        }
    }

    /*
     *用途:根據(jù)部分特征參數(shù)設(shè)備信息來(lái)判斷是否為模擬器
     *返回:true 為模擬器
     */
    private 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);
    }

    /*
     *用途:根據(jù)CPU是否為電腦來(lái)判斷是否為模擬器
     *返回:true 為模擬器
     */
    private static boolean checkIsNotRealPhone() {
        String cpuInfo = readCpuInfo();
        if ((cpuInfo.contains("intel") || cpuInfo.contains("amd"))) {
            return true;
        }
        return false;
    }

    /*
     *用途:根據(jù)CPU是否為電腦來(lái)判斷是否為模擬器(子方法)
     *返回:String
     */
    private 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;
    }

    /*
     *用途:檢測(cè)模擬器的特有文件
     *返回:true 為模擬器
     */
    private static String[] known_pipes = {"/dev/socket/qemud", "/dev/qemu_pipe"};
    private 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;
    }

    //****************適配夜神模擬器*******************
    //獲取 cpu 信息
    private static String getCpuInfo() {
        String[] abis = new String[]{};
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            abis = Build.SUPPORTED_ABIS;
        } else {
            abis = new String[]{Build.CPU_ABI, Build.CPU_ABI2};
        }
        StringBuilder abiStr = new StringBuilder();
        for (String abi : abis) {
            abiStr.append(abi);
            abiStr.append(',');
        }

        return abiStr.toString();
    }

    // 通過(guò)cpu判斷是否模擬器 ,適配夜神
    private static boolean isYeshenEmulator() {
        String abiStr = getCpuInfo();
        if (abiStr != null && abiStr.length() > 0) {
            boolean isSupportX86 = false;
            boolean isSupportArm = false;

            if (abiStr.contains("x86_64") || abiStr.contains("x86")) {
                isSupportX86 = true;
            }
            if (abiStr.contains("armeabi") || abiStr.contains("armeabi-v7a") || abiStr.contains("arm64-v8a")) {
                isSupportArm = true;
            }
            if (isSupportX86 && isSupportArm) {
                //同時(shí)擁有X86和arm的判斷為模擬器。
                return true;
            }
        }
        return false;
    }


}

使用

boolean flag = EmutorUtils.isEmulator(MainActivity.this);
        Toast.makeText(MainActivity.this,"是否是模擬器:"+flag,Toast.LENGTH_SHORT).show();

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = EmutorUtils.checkFeaturesByHardware(MainActivity.this);
                String brand = EmutorUtils.getPhoneBrand();
                String model = EmutorUtils.getPhoneModel();
                String result = "name:"+name+"brand:"+brand+"model:"+model;
                Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();
            }
        });

效果圖

mumu

android 判斷模擬器,Android工具類,android

雷電

android 判斷模擬器,Android工具類,android逍遙

android 判斷模擬器,Android工具類,android

夜神

android 判斷模擬器,Android工具類,android官方AVD(用這個(gè)玩游戲基本沒(méi)有)

android 判斷模擬器,Android工具類,android

參考?

http://dxtdbj.com/article.php?id=268
https://cloud.tencent.com/developer/article/2019963?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-752097.html

到了這里,關(guān)于安卓判斷是否是模擬器,適配主流雷電,MUMU,夜神,逍遙的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • fiddler抓包 雷電模擬器9(安卓9.0)教程,app加載不出來(lái)要記得移動(dòng)證書目錄

    fiddler抓包 雷電模擬器9(安卓9.0)教程,app加載不出來(lái)要記得移動(dòng)證書目錄

    使用的是網(wǎng)上的fiddler中文漢化版,按照百度搜索的教程總是有一些坑,記錄一下。 1、 設(shè)置https ,在捕獲https這邊勾上三個(gè)√,點(diǎn)擊【動(dòng)作】,生成證書,導(dǎo)到桌面。 ?2、 設(shè)置連接 ,允許遠(yuǎn)程計(jì)算機(jī)連接,勾上√,記住端口數(shù)字,這邊我是8888 ?3、在fiddler右側(cè)或ipconfig中查

    2024年01月16日
    瀏覽(35)
  • fiddler+安卓雷電模擬器+解決無(wú)法抓包問(wèn)題,看我就對(duì)了,一站式解決問(wèn)題,告別到處搜文章

    fiddler+安卓雷電模擬器+解決無(wú)法抓包問(wèn)題,看我就對(duì)了,一站式解決問(wèn)題,告別到處搜文章

    前言:本文講述fiddler抓取模擬器中數(shù)據(jù)包,話不多說(shuō)來(lái)看正文。 目錄 環(huán)境準(zhǔn)備:雷電模擬器、fiddler、adb adb和fiddler下載地址: ?一、Fiddler設(shè)置 1.HTTPS:解密https流量、忽略不安全證書 2.連接設(shè)置:允許遠(yuǎn)程計(jì)算機(jī)連接 ?3.根證書安裝:導(dǎo)出桌面安裝證書 ?二、模擬器設(shè)置 1

    2024年02月09日
    瀏覽(27)
  • 適配m1芯片的安卓手機(jī)模擬器來(lái)了

    適配m1芯片的安卓手機(jī)模擬器來(lái)了

    最近在學(xué)習(xí)ADB,手里沒(méi)有安卓機(jī),一些比較火的像夜神、MUMU模擬器在M1電腦上不適用,終于在我不懈的努力下,找到了可以使用的安卓模擬器,話不多說(shuō),上操作! 打開GitHub,搜索 m1 Android 點(diǎn)擊第??個(gè) - google/android-emulator-m1-preview 點(diǎn)擊右邊的 Releases 一共3個(gè)版本,選擇最新

    2024年02月11日
    瀏覽(31)
  • Python - 控制雷電模擬器(Dnconsole)

    1.Dnconsole控制臺(tái) 雷電模擬器9.0 雷電模擬器9.0 ,32+64位并行,支持對(duì)畫質(zhì)、性能要求較高的一類游戲。關(guān)于使用Python實(shí)現(xiàn)雷電模擬器的控制代碼,主要適用于雷電模擬器9.0版本。不同的模擬器版本的控制臺(tái)程序命名也不同(9.0版本為“l(fā)dconsole.exe”),可以使用的指令也不同,

    2023年04月08日
    瀏覽(24)
  • 雷電模擬器端口號(hào) adb連接

    雷電模擬器端口號(hào) adb連接

    在嘗試adb連接雷電模擬器時(shí),網(wǎng)上查詢了一下端口號(hào),發(fā)現(xiàn)說(shuō)是5555. 但是自己嘗試,會(huì)提示: cannot connect to 127.0.0.1:5555: 由于目標(biāo)計(jì)算機(jī)積極拒絕,無(wú)法連接。 (10061) 終于發(fā)現(xiàn),因?yàn)槲掖蜷_的模擬器,編號(hào)已經(jīng)到了29。。。 此時(shí)的端口號(hào)就不是5555了, 而是5555+2*29=5613。(即 端

    2024年02月05日
    瀏覽(24)
  • Fiddler+雷電模擬器APP抓包

    Fiddler+雷電模擬器APP抓包

    因?yàn)楣ぷ髦猩婕暗揭苿?dòng)端的內(nèi)容相對(duì)較多,在需要接口文檔時(shí),開發(fā)人員無(wú)法立即提供,因此需要我們自己使用對(duì)APP進(jìn)行抓包,完成相關(guān)的測(cè)試工作。 1、打開Fiddler客戶端,依次進(jìn)入Tools—options設(shè)置,先點(diǎn)擊Connections設(shè)置,選擇Allowremote computers to connect,確認(rèn)監(jiān)聽端口為8888。

    2024年02月12日
    瀏覽(20)
  • android studio連接雷電模擬器調(diào)試

    android studio連接雷電模擬器調(diào)試

    一、下載雷電模擬器,安裝完成后打開 下載地址:https://www.ldmnq.com/ 二、進(jìn)入模擬器的桌面,系統(tǒng)應(yīng)用—打開設(shè)置—點(diǎn)擊關(guān)于平板電腦,連續(xù)點(diǎn)擊5次版本號(hào)–會(huì)出現(xiàn)開發(fā)者選項(xiàng)—-進(jìn)入開發(fā)者選項(xiàng)—-勾選usb調(diào)試。 三:按win+r,輸入cmd打開命令控制器,將目錄切換到你安裝雷電

    2023年04月08日
    瀏覽(37)
  • vmare 虛擬機(jī)上安裝雷電模擬器的解決

    vmare 虛擬機(jī)上安裝雷電模擬器的解決

    自已有一個(gè)需求:需要在虛擬機(jī),需要在上面安裝一下模擬器3.0; 環(huán)境: vmare老版本:6.0~7.0 虛擬機(jī)系統(tǒng):windows7 旗艦版 64位 遇到問(wèn)題: 1. 沒(méi)有開啟VT-x。 分析:原來(lái)的vmare是低版本好像是 vmare7;沒(méi)有Intel VT-x選項(xiàng)選擇。 我的解決方法: 升級(jí)vmare為Vmware Workstation 16 Pro; 把當(dāng)

    2024年02月06日
    瀏覽(26)
  • 雷電模擬器運(yùn)行非??D有效解決方法分享

    雷電模擬器運(yùn)行非常卡頓有效解決方法分享

    雷電模擬器運(yùn)行非??D有效解決方法分享。有用戶在電腦上開啟雷電模擬器來(lái)使用的時(shí)候,遇到了軟件使用非常卡頓的情況。那么這樣的軟件卡頓問(wèn)題要怎么去進(jìn)行處理呢?接下來(lái)我們一起來(lái)看看以下的解決方法教學(xué)吧。 雷電模擬器卡頓的解決方法 一、關(guān)閉360核晶防護(hù) 打

    2024年02月05日
    瀏覽(22)
  • 移動(dòng)應(yīng)用測(cè)試(Python+Appium+雷電模擬器)

    移動(dòng)應(yīng)用測(cè)試(Python+Appium+雷電模擬器)

    一、node.js(v20.1.1) 二、Java(JDK17) 三、Android SDK(24.4.1版本) 四、Python(3.10) 五、PyCharm(2023.3.2) 六、Appium(1.21.0) 七、雷電模擬器(雷電9) 若不想單獨(dú)去下載,想直接獲取所有安裝包,請(qǐng)?jiān)L問(wèn)百度網(wǎng)盤鏈接提?。篽ttps://pan.baidu.com/s/1LSzazfQ2PbdiMLfZ4WiWAQ?pwd=n4vi ? ? ? ?在

    2024年03月16日
    瀏覽(41)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包