[Android(安卓)学习笔记] 判断 Android(安卓)设备是否为模拟器
16lz
2021-01-24
源码
#include #include #include #include #include #include typedef void(*FunType)(void);void (*asmcheck)(void);int detect() { int a = 0; char code[] = "\xF0\x41\x2D\xE9" "\x00\x70\xA0\xE3" "\x0F\x80\xA0\xE1" "\x00\x40\xA0\xE3" "\x01\x70\x87\xE2" "\x00\x50\x98\xE5" "\x01\x40\x84\xE2" "\x0F\x80\xA0\xE1" "\x0C\x80\x48\xE2" "\x00\x50\x88\xE5" "\x0A\x00\x54\xE3" "\x02\x00\x00\xAA" "\x0A\x00\x57\xE3" "\x00\x00\x00\xAA" "\xF6\xFF\xFF\xEA" "\x04\x00\xA0\xE1" "\xF0\x81\xBD\xE8"; void *exec = mmap(NULL, (size_t) getpagesize(), PROT_EXEC | PROT_READ | PROT_WRITE , MAP_ANONYMOUS | MAP_SHARED, -1, (off_t) 0); memcpy(exec, code, sizeof(code) + 1); asmcheck = (FunType) exec; asmcheck(); __asm __volatile ( "mov %0,r0 \n" :"=r"(a) ); munmap(exec, getpagesize()); return a;}JNIEXPORT jint JNICALL Java_com_android_util_SimulatorChecker_check (JNIEnv *env, jobject object) { int isSim = detect(); return (jint)isSim;}
只有当 check 方法返回是 10, 判断设备为真机, 否则为模拟器.
Android.mk
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := simulator_checkerLOCAL_SRC_FILES := com_android_util_SimulatorChecker.ccLOCAL_CPPFLAGS := -Os# -fvisibility=hiddenLOCAL_CFLAGS := -Os#-fvisibility=hiddenLOCAL_CFLAGS += -Wno-psabiLOCAL_CFLAGS += -funwind-tables -gLOCAL_CFLAGS := -funwind-tables -Wl,--no-merge-exidx-entries#-fpermissiveLOCAL_LDLIBS += -llog -ldl -landroidinclude $(BUILD_SHARED_LIBRARY)
Application.mk
APP_LOCAL_PATH :=$(call my-dir)APP_ABI := armeabi-v7a armeabiAPP_STL := stlport_staticAPP_STL := gnustl_staticAPP_OPTIM := releaseAPP_CPPFLAGS += -Wno-error=format-security
参考资料:
Android模拟器识别技术
利用cache特性检测Android模拟器
Android模拟器识别技术
Android 检测设备是否为模拟器
更多相关文章
- 关于 android RIL 调试
- android模拟器设置代理上网
- react-native android 环境配置
- Android开发(一)拨打电话程序
- Android-中常用方法集锦
- 《android 利用自带技术解析json字符》
- Arcgis for Android(安卓)开发环境配置(Android(安卓)Studio篇)
- 从android模拟器中提取文件系统
- Android涂鸦技术及刮刮乐示例分析