模拟器详解
模拟器所使用的由Android SDK管理提供的系统镜像包含有:Android Linux内核,本地静态库,虚拟机,以及各种Android包(Android 框架层以及事前预装的应用程序)。
模拟器所支持的一些类似真机的硬件属性:
1:ARMv5的CPU以及对应的MMU。
2:一个16-bit LCD的显示屏。
3:一个或多个键盘
4:一个具有输入和输出功能的声音芯片
5:闪存
6:一个GSM调制解调器,包括模拟的SIM卡
7:一个摄像头,通过开发机上的网络摄像头得到。
8:传感器,加速度传感器。
在使用模拟器之前,我们首先要创建AVD的配置文件,在每个配置文件里,指明了模拟器所使用的Android系统版本,以及设定了模拟器的硬件属性和模拟器所使用的皮肤。之后,你就可以指定专门的配置文件启动这个模拟器了。
每个虚拟机作为一个独立的设备运行,它包含有自己独立的数据存储,SD卡等等。在你指定AVD配置文件启动模拟器的时候,它便自动从AVD目录加载用户数据以及SD卡数据。默认情况下,模拟器将用户数据,SD卡数据,以及缓存存放在AVD所在的目录。
root@ithouge-OptiPlex-780:~/.android/avd/2.3.3GoogleAPI.avd# emulator -help Android Emulator usage: emulator [options] [-qemu args] options: -sysdir search for system disk images in -system read initial system image from -datadir write user data into -kernel use specific emulated kernel -ramdisk ramdisk image (default /ramdisk.img -image obsolete, use -system instead -initdata same as '-init-data ' -data data image (default /userdata-qemu.img -partition-size system/data partition size in MBs -cache cache partition image (default is temporary file) -cache-size cache partition size in MBs -no-cache disable the cache partition -nocache same as -no-cache -sdcard SD card image (default /sdcard.img -snapstorage file that contains all state snapshots (default /snapshots.img) -no-snapstorage do not mount a snapshot storage file (this disables all snapshot functionality) -snapshot name of snapshot within storage file for auto-start and auto-save (default 'default-boot') -no-snapshot perform a full boot and do not do not auto-save, but qemu vmload and vmsave operate on snapstorage -no-snapshot-save do not auto-save to snapshot on exit: abandon changed state -no-snapshot-load do not auto-start from snapshot: perform a full boot -snapshot-list show a list of available snapshots -no-snapshot-update-time do not do try to correct snapshot time on restore -wipe-data reset the user data image (copy it from initdata) -avd use a specific android virtual device -skindir search skins in (default /skins) -skin select a given skin -no-skin don't use any emulator skin -noskin same as -no-skin -memory physical RAM size in MBs -netspeed maximum network download/upload speeds -netdelay network latency emulation -netfast disable network shaping -trace enable code profiling (F9 to start) -show-kernel display kernel messages -shell enable root shell on current terminal -no-jni disable JNI checks in the Dalvik runtime -nojni same as -no-jni -logcat enable logcat output with given tags -no-audio disable audio support -noaudio same as -no-audio -audio use specific audio backend -raw-keys disable Unicode keyboard reverse-mapping -radio redirect radio modem interface to character device -port TCP port that will be used for the console -ports , TCP ports used for the console and adb bridge -onion use overlay PNG image over screen -onion-alpha <%age> specify onion-skin translucency -onion-rotation 0|1|2|3 specify onion-skin rotation -scale scale emulator window -dpi-device specify device's resolution in dpi (default 165) -http-proxy make TCP connections through a HTTP/HTTPS proxy -timezone use this timezone instead of the host's default -dns-server use this DNS server(s) in the emulated system -cpu-delay throttle CPU emulation -no-boot-anim disable animation for faster boot -no-window disable graphical window display -version display emulator version number -report-console report console port to remote socket -gps redirect NMEA GPS to character device -keyset specify keyset file name -shell-serial specific character device for root shell -tcpdump capture network packets to file -bootchart enable bootcharting -charmap use specific key character map -prop = set system property on boot -shared-net-id join the shared network, using IP address 10.1.2. -nand-limits enforce NAND/Flash read/write thresholds -memcheck enable memory access checking -gpu set hardware OpenGLES emulation mode -camera-back set emulation mode for a camera facing back -camera-front set emulation mode for a camera facing front -webcam-list lists web cameras available for emulation -screen set emulated screen mode -force-32bit always use 32-bit emulator -qemu args... pass arguments to qemu -qemu -h display qemu help -verbose same as '-debug-init' -debug enable/disable debug messages -debug- enable specific debug messages -debug-no- disable specific debug messages -help print this help -help-
你可以在单一的模拟器上运行测试你的应用,你也可以根据需求,启动多个模拟器,然后分别在它们上面运行测试你的应用,你可以应用模拟器内置的一些命令去模拟GSM电话呼叫或在模拟器之间发送SMS信息,你也可以设定网络重定向,从而使得模拟器之间彼此可以互相通讯等等。
// 显示所有创建的模拟器
root@ithouge-OptiPlex-780:~# android list avds Available Android Virtual Devices: Name: 4.0GoogleAPI Path: /root/.android/avd/4.0GoogleAPI.avd Target: Google APIs (Google Inc.) Based on Android 4.0 (API level 14) ABI: armeabi-v7a Skin: WVGA800 Sdcard: 1024M --------- Name: 3.2 Path: /root/.android/avd/3.2.avd Target: Android 3.2 (API level 13) ABI: armeabi Skin: WXGA --------- Name: platform4.1 Path: /root/.android/avd/platform4.1.avd Target: Android 4.1 (API level 16) ABI: armeabi-v7a Skin: WVGA800 --------- Name: 4.0 Path: /root/.android/avd/4.0.avd Target: Android 4.0 (API level 14) ABI: armeabi-v7a Skin: HVGA Sdcard: 1024M --------- Name: 2.3.3 Path: /root/.android/avd/2.3.3.avd Target: Android 2.3.3 (API level 10) ABI: armeabi Skin: HVGA Sdcard: 1024M --------- Name: 2.3.3GoogleAPI Path: /root/.android/avd/2.3.3GoogleAPI.avd Target: Google APIs (Google Inc.) Based on Android 2.3.3 (API level 10) ABI: armeabi Skin: WVGA800 Sdcard: 1024M
SD卡模拟
你可以创建一个硬盘镜像,然后在模拟器启动的时候加载它,通过这种方式在模拟器上模拟SD卡的属性,为了达到这个目的,你可以在创建模拟器的时候指定一个SD卡镜像,或者你也可以使用mksdcard工具创建一个SD卡镜像。
值得注意的是你只能在模拟器启动的时候加载一个硬盘镜像,当然,你也不能在模拟器运行的时候移除模拟的SD卡,但是,你可以通过adb或模拟器从模拟的SD卡里浏览,导入,导出甚至删除数据。
模拟器支持SDHC类型的卡,创建SD卡镜像的大小也必须大于128bit。
用多种方法可以创建SD卡镜像,最简单的方式AVD管理工具,在创建AVD的时候创建一个SD卡,并指定其大小。当然你也可以通过android命令行工具在创建AVD的时候指定参数-c,从而创建SD卡镜像。
命令行格式:
1 android create avd -n -t -c [K|M]
-c选项后面接收的是大小,另外,-c选项可以用于指定SD卡镜像的路径。
默认情况下AVD加载其默认目录下的SD卡镜像,当然你也可以在模拟器启动的时候也可以指定自定义的SD卡,命令行格式:
1 emulator -sdcard
// 启动某个模拟器
emulator -avd []
在开发工程中你会不断的更新代码,生成APK包,然后安装到模拟器上测试,模拟器每次重新启动的时候都会从user-data硬盘分区恢复应用数据以及状态。为了确保你每次更新应用后能正常的运行,你也许需要删除模拟器的user-data分区,为了实现这个目的,你可以在启动模拟器的时候指定参数-wipe-data.
//启动一个模拟器,并且清空模拟器里的数据(恢复出厂化)
root@ithouge-OptiPlex-780:~# emulator -wipe-data -avd 2.3.3GoogleAPI
模拟器都是通过挂载硬盘镜像来模拟真机上的闪存分区。
为了正常运行,模拟器需要加载一些特定的硬盘镜像文件,默认情况下,模拟器在AVD私有的数据存储区域搜索硬盘镜像文件,如果在模拟器运行的时候没有找到相应的镜像,那么它将会在AVD目录创建默认的镜像。
AVD默认存储位置: ~/.android/avd on OS X and Linux, C:\Documents and Settings\<user>\.android\ on Windows XP, and C:\Users\<user>\.android\ on Windows Vista.
例如模拟器4.0GoogleAPI.avd的文件:
1 root@ithouge-OptiPlex-780:~/.android/avd/4.0GoogleAPI.avd# ll 2 总用量 1268488 3 drwxr-xr-x 2 root root 4096 2012-12-05 10:02 ./ 4 drwxr-xr-x 8 root root 4096 2012-12-03 11:58 ../ 5 -rw------- 1 root root 530076 2012-12-05 10:03 cache.img 6 -rw------- 1 root root 5 2012-12-05 10:02 cache.img.lock 7 -rw-r--r-- 1 root root 319 2012-11-02 16:55 config.ini 8 -rw-r--r-- 1 root root 51 2012-12-04 17:48 emulator-user.ini 9 -rw-r--r-- 1 root root 1424 2012-12-05 10:02 hardware-qemu.ini 10 -rw------- 1 root root 5 2012-12-05 10:02 hardware-qemu.ini.lock 11 -rw-r--r-- 1 root root 1073741824 2012-12-05 10:18 sdcard.img 12 -rw------- 1 root root 5 2012-12-05 10:02 sdcard.img.lock 13 -rw-r--r-- 1 root root 3336960 2012-11-02 16:55 userdata.img 14 -rw------- 1 root root 221269980 2012-12-05 11:17 userdata-qemu.img 15 -rw------- 1 root root 5 2012-12-05 10:02 userdata-qemu.img.lock
模拟器用到的镜像文件可以分为三类:默认镜像文件,运行镜像文件以及临时镜像文件。
1:默认镜像文件。
在模拟器启动的时候,如果在AVD数据存储目录没有找到存在的用户数据镜像,那么它将通过复制SDK的系统默认镜像来创建一个新的用户数据镜像,这个默认的镜像是只读的。
在模拟器启动的时候可以指定参数-system <dir>指定自定义的数据镜像文件
2:运行镜像文件。
在模拟器运行的时候,它读取和写入的镜像有两种:用户数据镜像和SD卡镜像,这两个镜像文件分别用来模拟真机上的用户数据分区和可卸载的存储媒介。当然这些镜像有其默认的存储位置,同时也可以在启动模拟器的时候通过设置参数来自定义。
例如:
名为userdata-qemu.img的镜像,它是模拟器用来些运行用户数据的镜像。可以通过设定参数-data <filepath>自定义其存储路径,如果你只是指定了这个镜像的名称,那么模拟器会在其当前AVD目录搜索该文件。如果文件不存在,那么它会复制一份userdata.img镜像到你所指定的路径,并且在关闭模拟器的时候将用户数据存入其中。
每个模拟器都会用一个可写的用户数据镜像来存储用户和会话的数据,例如,它用这个镜像存储唯一用户安装的应用程序数据,设定,数据库以及文件。在模拟器启动的时候,它尝试去加载在上一个会话后所存储下来的用户数据镜像。如果在默认路径或自定义路径中找到了这个镜像,那么模拟器便会加载这个镜像,同时运行系统读取或写入用户数据。
如果这个镜像没有找到,那么模拟器会通过复制系统的用户数据镜像userdata.img来创建一个新的镜像,并且在关闭模拟器的时候将用户数据存入其中。
名为sdcard.img的镜像,它代表插入到模拟器中的SD卡,可以通过设定参数-sdcard <filepath>自定义该镜像。如果你只是指定了这个镜像的名称,那么模拟器会在其当前AVD目录搜索该文件。
3:临时镜像。
模拟器在启动的时候创建两个可写的镜像,并且在关闭的时候删除,它们是:
一个复制的可写的Android系统镜像
/cache分区镜像
模拟器是不允许重命名临时系统镜像,也不允许在模拟器关闭之后保存数据。
/cache分区镜像初始化是空的,它被用于浏览器缓存web界面和图片。在启动模拟器的时候可以设置参数-cache <file>,用于指明/cache镜像的名称,如果镜像文件不存在,模拟器会创建一个空的镜像文件。
你也可以在启动模拟器的时候使用参数-nocache,用来声明不使用缓存分区。
Emulator Networking(模拟器网络)
模拟器提供了强大的网络功能,这样你可以为你的应用设置复杂的模型以及测试环境。
Network Address Space(网络地址分配)
每个模拟器都运行在一个虚拟的路由/网关后面,这样可以使得你的模拟器独立于你的开发机的网络接口和设定。一个模拟器通过网络是不能扫描到你的开发机以及其他的模拟器。它仅仅能看到的是它通过以太网连接到路由器/防火墙.
每个模拟器的虚拟路由管理着10.0.2/24的网络地址。路由管理的所有的地址均是以10.0.2.<xx>的形式存在,以下的网络地址是实现分配好的:
10.0.2.1 路由网关地址 10.0.2.2 本机的环回地址的别名,(就像开发机的127.0.0.1环回地址) 10.0.2.3 首选DNS 10.0.2.4 / 10.0.2.5 / 10.0.2.6 可选的第二,第三,第四DNS服务器 10.0.2.15 模拟器自身的网络地址 127.0.0.1 模拟器自身的环回地址
所有运行的模拟器都采用统一个地址分配策略,这也就是说,如果你有两个模拟器同时运行,那么每个模拟器具有自己的路由,各自IP地址都是10.0.2.15。每个模拟器都由于虚拟的路由独立于其他的模拟器,即使它们在同一个网络里,也彼此看不到对方。
而且每个模拟器事先分配好的地址是模拟器所特有的,这也许和真机非常的不同。
运行在模拟器上的应用可以连接到网络,但是要经过模拟器,而不是直接通过硬件,在这里模拟器扮演的是一个普通应用的角色,这样也就是说你的模拟器以及你的应用程序,是受到一些限制的:
与模拟器的通讯可能会由于模拟器上安装的防火墙程序而阻塞
与模拟器的通讯可能会由于另外一连接到开发机的防火墙/路由而阻塞
模拟器的虚拟路由应该要能够处理所有对外的TCP和UDP的连接和信息。
根据开发环境的不同,模拟器也许对一些协议不支持,例如:ICMP协议。目前模拟器是不支持ICMP,多播协议的。
使用网络重定向
为了和隐藏在虚拟路由下的模拟器进行通讯,你需要在虚拟路由器上设定网络重定向,这样客户端才能通过路由器上的这个端口与模拟器建立连接,虚拟路由器负责将从这个端口接收/发送的数据转发到模拟器的端口。
设定这个网络重定向,需要需要设定虚拟路由器端口与模拟器端口/地址的一个对应关系,有两种方法可以设定网络重定向:模拟器控制台命令,直接用ADB命令。
有了网络重定向之后,我们就可以实现模拟器之间的互相通讯
为了让一个模拟器能和其他模拟器实现交互,你需要设定一些必要的网络重定向,
假设:
A是你的开发机
B是你的第一个模拟器,运行在A上
C是你的第二个模拟器,也运行在A上
并且你想在B上运行一个服务,之后C将要连接到这个服务上,那么我们可以这样设置:
设定运行在B上的服务监听10.0.2.15:<serverPort>
通过控制台设定一条重定向规则:A:localhost:<localPort> 到 B:10.0.2.15:<serverPort>
通过C连接到10.0.2.2:<localPort>
例如:你想在B上运行一个HTTP服务,你可以选择<serverPort>为80,且设定<localPort>为8080:
B就监听10.0.2.15:80
在B的控制台,设定一条重定向规则:redir add tcp:8080:80
然后C连接到10.0.2.2:8080
//连接到控制台
1 root@ithouge-OptiPlex-780:~# telnet localhost 5554 2 Trying 127.0.0.1... 3 Connected to localhost. 4 Escape character is '^]'. 5 Android Console: type 'help' for a list of commands 6 OK 7 help 8 Android console command help: 9 10 help|h|? print a list of commands 11 event simulate hardware events 12 geo Geo-location commands 13 gsm GSM related commands 14 cdma CDMA related commands 15 kill kill the emulator instance 16 network manage network settings 17 power power related commands 18 quit|exit quit control session 19 redir manage port redirections 20 sms SMS related commands 21 avd control virtual device execution 22 window manage emulator window 23 qemu QEMU-specific commands 24 sensor manage emulator sensors 25 26 try 'help ' for command-specific help 27 OK
模拟网络延迟
模拟器可以模拟各种网络延迟,这样的话你可以在各种更接近于真实环境下测试你的应用,你可以在模拟器启动的时候设定延迟参数,也可以在模拟器运行的时候通过控制台动态修改延时时间。
在模拟器启动的时候通过设定参数-netdelay <delay>设定延时时间,例如:
emulator -netdelay gprs
emulator -netdelay 40 100
也可以在模拟器运行的时候通过登录控制台执行network delay设定延时时间,例如:
network delay gprs Value Description Comments gprs GPRS (min 150, max 550) edge EDGE/EGPRS (min 80, max 400) umts UMTS/3G (min 35, max 200) none No latency (min 0, max 0) Emulate an exact latency (milliseconds). : Emulate an specified latency range (min, max milliseconds).
模拟网络速度限制
你也可以设定模拟器的各种网络传送速率,你可以在模拟器启动的时候设定网络传送速率或范围,你也可以在模拟器运行的时候通过控制台去动态的修改传送速率。
在模拟器启动的时候通过设定参数-netspeed <speed>设定其网络传送速率,例如:
emulator -netspeed gsm emulator -netspeed 14.4 80
也可以在模拟器运行的时候,通过登录到控制台,执行netspeed <speed>命令修改网络传送速率:
Value Description Comments gsm GSM/CSD (Up: 14.4, down: 14.4) hscsd HSCSD (Up: 14.4, down: 43.2) gprs GPRS (Up: 40.0, down: 80.0) edge EDGE/EGPRS (Up: 118.4, down: 236.8) umts UMTS/3G (Up: 128.0, down: 1920.0) hsdpa HSDPA (Up: 348.0, down: 14400.0) full no limit (Up: 0.0, down: 0.0) Set an exact rate used for both upload and download. :
模拟器的一些限制:
不支持拨打或接收真实的电话,但你可以通过模拟器控制台去模拟拨打或接收电话。
不支持USB连接
不支持连接耳机
不支持获取网络连接状态
不支持获取电池电量水平和交流充电状态
不支持获取SD卡的插入/拔出状态
不支持蓝牙