模拟器是否能够代替真机的兼容测试 您所在的位置:网站首页 模拟器模仿真机下载 模拟器是否能够代替真机的兼容测试

模拟器是否能够代替真机的兼容测试

2024-06-02 22:04| 来源: 网络整理| 查看: 265

平时测试过程中,经常有组内同学们问,使用模拟器测试完之后,是否可以代替真机的兼容测试了。

先来看看模拟器和真机的直观区别:

多点触摸(比如两个手指放大文本字体大小)网络通话(没有真实的呼入和呼出)摄像(无法调起摄像,无法验证拍照类功能人脸识别)USB连接WiFi(没有不同的网络环境)各种网络制式蓝牙音频输入/捕捉

另外:

Android具有的一些特点

Android模拟器用的是原生标准的Android系统。市面上的真机定制化非常多,比如国内小米的MIUI,魅族的Flyme等等,而模拟器都是Android的原生系统,即相当于市面上的Nexus和Pixel手机的系统,因此国内使用原生Android系统手机的用户非常少见Android模拟器上安装的apk签名是debug模式的。发布应用到市场上要使用开发者正式的签名。Android模拟器上用px像素可以正常显示,真机上必须用dpi让系统自动识别才能达到预期效果。所以真机上有可能布局变得面目全非,和模拟器上不一致。Android模拟器不能确定电池电量水平和充电状态。Android模拟器不能确定SD卡的插入/弹出。Android模拟器都是模拟的硬件。所以在硬件上基本不会出现兼容性问题,但是市场上的真机大多数都是采用不同的cpu,不同的显示屏等。Android模拟器不会被刷机,但真实的Android设备会存在刷机。模拟器上发布程序后会自己启动程序弹出界面,真机上通过电脑安装后则不会弹出来。Android模拟器不支持呼叫和接听实际来电。只能通过控制台模拟电话呼入和呼出。

iOS具有的一些特点

iOS模拟器和真机的分辨率不同。故和真机的显示效果不一样。iOS模拟器没有硬件限制。比如内存,所以会有应用出现在模拟器上很快,真机很慢的情况,原因是真机的内存被用完了模拟器不会被越狱,真机会被越狱,越狱后的真机会有兼容性问题iOS有些framework只支持模拟器,不支持真机。

综合来讲,模拟器只是实现了真机的大部分功能,但绝对不能代替真机测试,任何应用在上线前都应该在实体机上进行验收测试。尤其是只有真机才能反应出最真实的性能测试情况,有没有发热,严重流量占用,耗电量消耗等等。另外模拟器的性能和调试效率,相比真机,会低很多,测试效率比较低。

 

 

如果希望有一些反欺诈监控,需要获取设备返回的一些信息来鉴别设备的真伪,判断是否模拟器,也有一些方法。

1、native方式

通过代码读取设备中的配置和硬件相关信息。

a) diskstats,获取闪存的分区状态信息

int fd = open(“/proc/diskstats”, O_RDONLY);

bytes = read(fd,buf, bytes);

区别:真机下都有mmcblk0分区,但是模拟器没有分区信息。

b) socket,ioctl,读取mac地址

sockfd =socket(AF_INET, SOCK_DGRAM, 0);

ioctl(sockfd,SIOCGIFCONF, (char*)&ifc);

ioctl(sockfd,SIOCGIFADDR, &ifr[i])

ioctl(sockfd,SIOCGIFHWADDR, (char*)&ifr[i])

区别:真机可以获取wlan0的ip和mac地址,模拟器只能获取eth0的ip和mac地址;

c) 有用的prop信息

__system_property_get(key,buf);

区别: 模拟器没有ro.boot.serialno和ro.serialno属性,真机中为机器序列号。

模拟器ro.hardware属性为goldfish,真机为各自的型号。

d) cpu信息

int fd = open(“/proc/cpuinfo”, O_RDONLY);

bytes = read(fd,buf, bytes);

区别:模拟器中cpuinfo的硬件为Goldfish。

e) drivers

int fd = open(“/proc/tty/drivers”, O_RDONLY);

区别:模拟器中包含goldfish的驱动

f) 模拟器特有文件

int fd = open(“/dev/socket/qemud”, O_RDONLY);

int fd = open(“/dev/qemu_pipe”, O_RDONLY);

区别:模拟器专有的文件,真机中没有。

二,通过Java层的代码获取

a) IMEI和IMSI

IMEI移动设备国际身份码。

IMSI  IMSI国际移动用户识别码,储存在SIM卡中

finalTelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);

String imei =tm.getDeviceId();

String imsi =tm.getSubscriberId();

设备1:354273055927169 / null(无卡)

设备2:862966024243759 / 460011040618938

模拟器:000000000000000 / 310260000000000

b) Serial序列号

String serial =android.os.Build.SERIAL;

设备1:4df78680771b117b

设备2:OBAI5HDQZPDIRCQG

模拟器:unknown

c) android_id

String android_id= Secure.getString(getContentResolver(), Secure.ANDROID_ID);

设备和模拟器都有,16位。

d) Mac地址

WifiManagerwifimanage=(WifiManager)getSystemService(Context.WIFI_SERVICE);  WifiInfo wifiinfo=wifimanage.getConnectionInfo();

设备1:88:32:9b:1e:49:20

设备2:f8:a4:5f:fd:56:17

模拟器:null



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有