版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
Android 判断App运行在模拟器还是真机上的最终解决方案
最近公司搞了一波送福利的活动,被人用模拟器恶意刷注册量了.
后来我经过研究和实测,得出以下方法,目前还没有发现有模拟器能突破这个检测,方法如下:
方法使用:
-
if(Android_ID_Utils.notHasBlueTooth()
-
||Android_ID_Utils.notHasLightSensorManager(
this)
-
||Android_ID_Utils.isFeatures()
-
||Android_ID_Utils.checkIsNotRealPhone()
-
||Android_ID_Utils.checkPipes()){
-
ToastUtils.ToastLong(
this,
"检查到您的设备违规,将限制您的所有功能使用!");
-
return;
-
}
方法实体:
-
/*
-
*作者:赵星海
-
*时间:2019/2/21 17:50
-
*用途:判断蓝牙是否有效来判断是否为模拟器
-
*返回:true 为模拟器
-
*/
-
public static boolean notHasBlueTooth() {
-
BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter();
-
if (ba ==
null) {
-
return
true;
-
}
else {
-
// 如果有蓝牙不一定是有效的。获取蓝牙名称,若为null 则默认为模拟器
-
String name = ba.getName();
-
if (TextUtils.isEmpty(name)) {
-
return
true;
-
}
else {
-
return
false;
-
}
-
}
-
}
-
-
/*
-
*作者:赵星海
-
*时间:2019/2/21 17:55
-
*用途:依据是否存在光传感器来判断是否为模拟器
-
*返回:true 为模拟器
-
*/
-
public 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;
-
}
-
}
-
-
/*
-
*作者:赵星海
-
*时间:2019/2/21 17:56
-
*用途:根据部分特征参数设备信息来判断是否为模拟器
-
*返回:true 为模拟器
-
*/
-
public 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);
-
}
-
-
/*
-
*作者:赵星海
-
*时间:2019/2/21 17:58
-
*用途:根据CPU是否为电脑来判断是否为模拟器
-
*返回:true 为模拟器
-
*/
-
public static boolean checkIsNotRealPhone() {
-
String cpuInfo = readCpuInfo();
-
if ((cpuInfo.contains(
"intel") || cpuInfo.contains(
"amd"))) {
-
return
true;
-
}
-
return
false;
-
}
-
/*
-
*作者:赵星海
-
*时间:2019/2/21 17:58
-
*用途:根据CPU是否为电脑来判断是否为模拟器(子方法)
-
*返回:String
-
*/
-
public 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;
-
}
-
-
/*
-
*作者:赵星海
-
*时间:2019/2/21 17:50
-
*用途:检测模拟器的特有文件
-
*返回:true 为模拟器
-
*/
-
private
static String[] known_pipes = {
"/dev/socket/qemud",
"/dev/qemu_pipe"};
-
public 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;
-
}
-
如果您有什么建议的话,欢迎留言评论.谢谢.