模拟器详解
模擬器所使用的由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所在的目錄。
你可以在單一的模擬器上運行測試你的應用,你也可以根據需求,啟動多個模擬器,然后分別在它們上面運行測試你的應用,你可以應用模擬器內置的一些命令去模擬GSM電話呼叫或在模擬器之間發送SMS信息,你也可以設定網絡重定向,從而使得模擬器之間彼此可以互相通訊等等。
// 顯示所有創建的模擬器
root@ithouge-OptiPlex-780:~# android list avds Available Android Virtual Devices:Name: 4.0GoogleAPIPath: /root/.android/avd/4.0GoogleAPI.avdTarget: Google APIs (Google Inc.)Based on Android 4.0 (API level 14)ABI: armeabi-v7aSkin: WVGA800Sdcard: 1024M ---------Name: 3.2Path: /root/.android/avd/3.2.avdTarget: Android 3.2 (API level 13)ABI: armeabiSkin: WXGA ---------Name: platform4.1Path: /root/.android/avd/platform4.1.avdTarget: Android 4.1 (API level 16)ABI: armeabi-v7aSkin: WVGA800 ---------Name: 4.0Path: /root/.android/avd/4.0.avdTarget: Android 4.0 (API level 14)ABI: armeabi-v7aSkin: HVGASdcard: 1024M ---------Name: 2.3.3Path: /root/.android/avd/2.3.3.avdTarget: Android 2.3.3 (API level 10)ABI: armeabiSkin: HVGASdcard: 1024M ---------Name: 2.3.3GoogleAPIPath: /root/.android/avd/2.3.3GoogleAPI.avdTarget: Google APIs (Google Inc.)Based on Android 2.3.3 (API level 10)ABI: armeabiSkin: WVGA800Sdcard: 1024MSD卡模擬
你可以創建一個硬盤鏡像,然后在模擬器啟動的時候加載它,通過這種方式在模擬器上模擬SD卡的屬性,為了達到這個目的,你可以在創建模擬器的時候指定一個SD卡鏡像,或者你也可以使用mksdcard工具創建一個SD卡鏡像。
值得注意的是你只能在模擬器啟動的時候加載一個硬盤鏡像,當然,你也不能在模擬器運行的時候移除模擬的SD卡,但是,你可以通過adb或模擬器從模擬的SD卡里瀏覽,導入,導出甚至刪除數據。
模擬器支持SDHC類型的卡,創建SD卡鏡像的大小也必須大于128bit。
用多種方法可以創建SD卡鏡像,最簡單的方式AVD管理工具,在創建AVD的時候創建一個SD卡,并指定其大小。當然你也可以通過android命令行工具在創建AVD的時候指定參數-c,從而創建SD卡鏡像。
命令行格式:
-c選項后面接收的是大小,另外,-c選項可以用于指定SD卡鏡像的路徑。
默認情況下AVD加載其默認目錄下的SD卡鏡像,當然你也可以在模擬器啟動的時候也可以指定自定義的SD卡,命令行格式:
// 啟動某個模擬器
emulator -avd []在開發工程中你會不斷的更新代碼,生成APK包,然后安裝到模擬器上測試,模擬器每次重新啟動的時候都會從user-data硬盤分區恢復應用數據以及狀態。為了確保你每次更新應用后能正常的運行,你也許需要刪除模擬器的user-data分區,為了實現這個目的,你可以在啟動模擬器的時候指定參數-wipe-data.
//啟動一個模擬器,并且清空模擬器里的數據(恢復出廠化)
模擬器都是通過掛載硬盤鏡像來模擬真機上的閃存分區。
為了正常運行,模擬器需要加載一些特定的硬盤鏡像文件,默認情況下,模擬器在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:默認鏡像文件。
在模擬器啟動的時候,如果在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>的形式存在,以下的網絡地址是實現分配好的:
所有運行的模擬器都采用統一個地址分配策略,這也就是說,如果你有兩個模擬器同時運行,那么每個模擬器具有自己的路由,各自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 gprsValue 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
總結
- 上一篇: 基于vue的英语单词App
- 下一篇: [css3动画教程]:逐帧自适应精灵图