模拟器详解

模拟器所使用的由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卡的插入/拔出状态
不支持蓝牙

转载于:https://www.cnblogs.com/ithouge/archive/2012/12/08/ithouge_android_emulator.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值