检测Android模拟器

2023-05-16

package com.lisn.check_emulator_lib;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;

/**
 * Created by shan ge on 2018/10/22
 */
public class CommandUtil {
    private CommandUtil() {
    }

    private static class SingletonHolder {
        private static final CommandUtil INSTANCE = new CommandUtil();
    }

    public static final CommandUtil getSingleInstance() {
        return SingletonHolder.INSTANCE;
    }

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

    public String exec(String command) {
        BufferedOutputStream bufferedOutputStream = null;
        BufferedInputStream bufferedInputStream = null;
        Process process = null;
        try {
            process = Runtime.getRuntime().exec("sh");
            bufferedOutputStream = new BufferedOutputStream(process.getOutputStream());

            bufferedInputStream = new BufferedInputStream(process.getInputStream());
            bufferedOutputStream.write(command.getBytes());
            bufferedOutputStream.write('\n');
            bufferedOutputStream.flush();
            bufferedOutputStream.close();

            process.waitFor();

            String outputStr = getStrFromBufferInputSteam(bufferedInputStream);
            return outputStr;
        } catch (Exception e) {
            return null;
        } finally {
            if (bufferedOutputStream != null) {
                try {
                    bufferedOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bufferedInputStream != null) {
                try {
                    bufferedInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (process != null) {
                process.destroy();
            }
        }
    }

    private static String getStrFromBufferInputSteam(BufferedInputStream bufferedInputStream) {
        if (null == bufferedInputStream) {
            return "";
        }
        int BUFFER_SIZE = 512;
        byte[] buffer = new byte[BUFFER_SIZE];
        StringBuilder result = new StringBuilder();
        try {
            while (true) {
                int read = bufferedInputStream.read(buffer);
                if (read > 0) {
                    result.append(new String(buffer, 0, read));
                }
                if (read < BUFFER_SIZE) {
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result.toString();
    }
}
package com.lisn.check_emulator_lib;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.text.TextUtils;

/**
 * Created by shan ge on 2018/10/22
 */
public class EmulatorCheckUtil {
    private EmulatorCheckUtil() {

    }

    private static class SingletonHolder {
        private static final EmulatorCheckUtil INSTANCE = new EmulatorCheckUtil();
    }

    public static final EmulatorCheckUtil getSingleInstance() {
        return SingletonHolder.INSTANCE;
    }

    //逍遥安卓模拟器能模拟cpu信息
    public String readCpuInfo() {
        String result = CommandUtil.getSingleInstance().exec("cat /proc/cpuinfo");
        return result;
    }

    //逍遥安卓模拟器读取不到该文件
    public boolean readUidInfo() {
        String filter = CommandUtil.getSingleInstance().exec("cat /proc/self/cgroup");
        return filter == null || filter.length() == 0;
    }

    private EmulatorCheckCallback emulatorCheckCallback;

    public boolean readSysProperty() {
        return readSysProperty(null);
    }

    public boolean readSysProperty(EmulatorCheckCallback callback) {
        this.emulatorCheckCallback = callback;
        int suspectCount = 0;

        //读基带信息
        String baseBandVersion = CommandUtil.getSingleInstance().getProperty("gsm.version.baseband");
        if (TextUtils.isEmpty(baseBandVersion) | (baseBandVersion != null && baseBandVersion.contains("1.0.0.0")))
            ++suspectCount;

        //读渠道信息,针对一些基于vbox的模拟器
        String buildFlavor = CommandUtil.getSingleInstance().getProperty("ro.build.flavor");
        if (TextUtils.isEmpty(buildFlavor))
            ++suspectCount;
        else if (buildFlavor.contains("vbox") | buildFlavor.contains("sdk_gphone"))
            ++suspectCount;

        //读处理器信息,这里经常会被处理
        String productBoard = CommandUtil.getSingleInstance().getProperty("ro.product.board");
        if (TextUtils.isEmpty(productBoard))
            ++suspectCount;
        else if (productBoard.contains("android") | productBoard.contains("goldfish"))
            ++suspectCount;

        String boardPlatform = CommandUtil.getSingleInstance().getProperty("ro.board.platform");
        if (TextUtils.isEmpty(boardPlatform))
            ++suspectCount;
        else if (boardPlatform.contains("android"))
            ++suspectCount;

        if (!TextUtils.isEmpty(productBoard)
                && !TextUtils.isEmpty(boardPlatform)
                && !productBoard.equals(boardPlatform))
            ++suspectCount;

        //一些模拟器读取不到进程组信息
        String filter = CommandUtil.getSingleInstance().exec("cat /proc/self/cgroup");
        if (TextUtils.isEmpty(filter)) ++suspectCount;

        if (emulatorCheckCallback != null) {
            StringBuffer stringBuffer = new StringBuffer("ceshi start|")
                    .append(baseBandVersion)
                    .append("|")
                    .append(buildFlavor)
                    .append("|")
                    .append(productBoard)
                    .append("|")
                    .append(boardPlatform)
                    .append("|")
                    .append(filter)
                    .append("|end");
            emulatorCheckCallback.findEmulator(stringBuffer.toString());
            emulatorCheckCallback = null;
        }
        return suspectCount > 2;
    }

    public boolean hasGyroscopeSensor(Context context) {
        return getSystemSensor(context, Sensor.TYPE_GYROSCOPE);
    }

    public boolean hasLightSensor(Context context) {
        return getSystemSensor(context, Sensor.TYPE_LIGHT);
    }

    private boolean getSystemSensor(Context context, int type) {
        if (context == null) return false;
        SensorManager manager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
        if (manager == null) return false;
        Sensor sensor = manager.getDefaultSensor(type);
        if (sensor == null) return false;
        manager.registerListener(new MySensorEventListener(manager), sensor, SensorManager.SENSOR_DELAY_NORMAL);
        return true;
    }

    private class MySensorEventListener implements SensorEventListener {
        SensorManager sensorManager;

        MySensorEventListener(SensorManager sensorManager) {
            this.sensorManager = sensorManager;
        }

        @Override
        public void onSensorChanged(SensorEvent event) {
            sensorManager.unregisterListener(this);
            sensorManager = null;
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    }

    @Deprecated
    public String readBuildInfo() {
        StringBuffer sb = new StringBuffer();
        sb.append("-\n")
                .append("BOARD-")
                .append(android.os.Build.BOARD)
                .append("\nBOOTLOADER-")
                .append(android.os.Build.BOOTLOADER)
                .append("\nBRAND-")
                .append(android.os.Build.BRAND)
                .append("\nDEVICE-")
                .append(android.os.Build.DEVICE)
                .append("\nHARDWARE-")
                .append(android.os.Build.HARDWARE)
                .append("\nMODEL-")
                .append(android.os.Build.MODEL)
                .append("\nPRODUCT-")
                .append(android.os.Build.PRODUCT);
        return sb.toString();
    }
}

使用方法:

 TextView emulator = findViewById(R.id.tv_deviceInfo);
        emulator.setText(EmulatorCheckUtil.getSingleInstance().readSysProperty(new EmulatorCheckCallback() {
            @Override
            public void findEmulator(String emulatorInfo) {
                System.out.println(emulatorInfo);
            }
        }) ? "isEmulator" : "not-emulator");

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测Android模拟器 的相关文章

随机推荐

  • MyEclipse配置Tomcat 7

    1 打开步骤 xff1a 窗口 gt 首选项 gt MyEclipse gt Servers gt Tomcat gt Tomcat 7 x 2 配置自己本地的Tomcat 7版本 3 关闭MyEclipse自带的Tomcat服务器 4 启
  • mysql之模糊查询的方法

    Mysql模糊查询正常情况下在数据量小的时候 xff0c 速度还是可以的 xff0c 但是不容易看出查询的效率 xff0c 在数据量达到百万级 xff0c 千万级的甚至亿级时mysql查询的效率是很关键的 xff0c 也是很重要的 一 一般
  • Spring Cloud限流详解

    Spring Cloud限流详解 Spring Cloud Spring Cloud 2017 12 01 在高并发的应用中 xff0c 限流往往是一个绕不开的话题 本文详细探讨在Spring Cloud中如何实现限流 在Zuul上实现限流
  • 如何释放linux的内存

    你们知道怎么释放linux的内存吗不知道的话跟着学习啦小编一起来学习怎么释放linux的内存 释放linux的内存的步骤 Linux下操作频繁时 xff0c 物理内存会被快速用完 xff0c 当操作结束后 xff0c 物理内存没有被正常的释
  • docker修改镜像名称以及tag版本

    docker tag 镜像ID 镜像名称 tag版本信息 docker tag 8ef375298394 mysql v5 7
  • 跨域的五种解决方案详解

    1 跨域解决方案一 cors技术 CORS 全称cross origin resource share xff08 资源共享 xff09 工作原理 xff1a 服务器 在返回响应报文的时候 xff0c 在响应头中 设置一个允许的header
  • MySQL 日期时间类型精确到毫秒

    MySQL 常用的日期时间类型常用的是datetime timestamp 其中datetime占用5个字节 xff08 有些文档中说占用8个字节是不对的 xff0c 默认也不会保存毫秒 xff09 DATETIME和TIMESTAMP两种
  • Spring Boot——Thymeleaf

    哈喽 xff01 大家好 xff0c 我是 xff0c 一位上进心十足的 Java领域博主 xff01 的写作风格 xff1a 喜欢用 通俗易懂 的文笔去讲解每一个知识点 xff0c 而不喜欢用 高大上 的官方陈述 博客的领域是 面向后端技
  • 详细nginx配置websocket的wss协议

    需求 xff1a 小程序连接websocket xff0c 必须使用wss协议 nginx配置websocket以及wss协议 其实wss协议就是使用了ssl协议的域名所自带的协议 xff0c 所以wss协议需要域名来进行socket连接
  • Java面试宝典(超级详细)

    一 Java 基础 1 JDK 和 JRE 有什么区别 xff1f JDK xff1a Java Development Kit 的简称 xff0c java 开发工具包 xff0c 提供了 java 的开发环境和运行环境 JRE xff1
  • VNCServer卡死处理办法

    通过VNC连接远程Linux服务器 xff0c 一段时间后 xff0c 远程界面卡死 xff0c 不能操作 解决办法 xff1a 重启vncserver服务 通过终端远程ssh到服务器 1 xff09 查看vncserver命令用法 xff
  • Lottie进阶和原理分析

    简介 Lottie是aribnb发布的开源库 xff0c 它可以将AE制作的动画在Android iOS和RN代码中渲染出来 Lottie的功能及其强大 xff0c 只需要设计师使用AE设计动画 xff0c 用bodymovin导出 xff
  • 前端都应该了解的 NodeJs 知识及原理浅析

    node js 初探 Node js 是一个 JS 的服务端运行环境 xff0c 简单的来说 xff0c 它是在 JS 语言规范的基础上 xff0c 封装了一些服务端的运行时对象 xff0c 让我们能够简单实现非常多的业务功能 如果我们只使
  • 网站安全检测被 提示该网站内容被禁止访问

    很多建站公司都在使用Kindeditor开源的图片上传系统 xff0c 该上传系统是可视化的 xff0c 采用的开发语言支持asp aspx php jsp 几乎支持了所有的网站可以使用他们的上传系统 xff0c 对浏览器的兼容以及手机端也
  • 10个经典程序员代码技能,学会一个就能月薪上万!

    今天小编我给大家整理了一份10个程序员常用的代码简写技术 xff0c 看懂一种是入门 xff0c 全懂就是大神 xff0c 你能知道几个呢 xff1f 这篇文章分享之前我还是要推荐下我自己的前端群 xff1a 733581373 xff0c
  • android 9.0 中关于OTA 升级的注意事项

    droid 分区查看 emcc 7 x 8 x 一 要确定有多少个分区 xff1f 详细解析 xff1a major 表示主设备号 minor 表示次设备号 blocks 表示的是block的数目 name 是指的设备名称 例如 xff1a
  • ubuntu设置虚拟显示器且远程连接

    版本 ubuntu 20 04 安装虚拟显示器 sudo apt install xserver xorg core hwe 18 04 sudo apt install xserver xorg video dummy hwe 18 04
  • FFmpeg视频解码流程详解及demo

    本文主要讲解FFmpeg的视频解码具体流程 xff0c API使用 xff0c 以及相关结构体介绍 最后再以一个非常简单的demo演示将一个mp4格式的视频文件解码为原始数据yuv文件 FFmpeg解码流程有2套API接口 xff0c 本文
  • crontab执行jar包时,Could not find or load main class(找不到或者加载不到主类)

    crontab执行jar包时 xff0c Could not find or load main class 找不到或者加载不到主类 在linux服务器上配置crontab时 xff0c 子账户执行不报错 xff0c 但是切到root账户
  • 检测Android模拟器

    package com lisn check emulator lib import java io BufferedInputStream import java io BufferedOutputStream import java i