检测Android模拟器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wei11556/article/details/83272058
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");

猜你喜欢

转载自blog.csdn.net/wei11556/article/details/83272058