檢測Android模擬器
阿新 • • 發佈:2018-12-27
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");