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");