1. 程式人生 > >【Android-Emulator】Android模擬器介紹和基本使用

【Android-Emulator】Android模擬器介紹和基本使用

接下來講解的是ANDROID模擬器的介紹和使用,最後還有PC電腦和ANDROID模擬器訪問模擬器之間tcp/udp通訊,寫這篇文章大部分是從網路上獲取的資訊,希望對大家有幫助

1、Android模擬器介紹

Android中提供了一個模擬器來模擬ARM核的移動裝置。Android的模擬器是基於QEMU開發的,QEMU是一個有名的開源虛擬機器專案(詳見http://bellard.org/qemu/),它可以提供一個虛擬的ARM移動裝置。Android模擬器被命名為goldfish,用來模擬包括下面一些功能的ARM SoC:

* ARM926ej-S CPU

* Thumb support

* MMC

* RTC

* Keyboard

* USB Gadget

* Framebuffer

* TTY driver

* NAND FLASH

Android模擬器所對應的原始碼主要在external/qemu目錄下。如果你想將Android移植到其他裝置上,熟悉它目前所針對的模擬器環境可以提供一些參考。

對於應用程式的開發者,模擬器提供了很多開發和測試時的便利。無論在Windows下還是Linux下,Android模擬器都可以順利執行,並且Google提供了Eclipse外掛,可將模擬器整合到Eclipse的IDE環境。當然,你也可以從命令列啟動Android模擬器。

這款模擬器功能非常齊全,電話本、通話等功能都可正常使用(當然你沒辦法真的從這裡打電話)。甚至其內建的瀏覽器和Google Maps都可以聯網。使用者可以使用鍵盤輸入,滑鼠點選模擬器按鍵輸入,甚至還可以使用滑鼠點選、拖動螢幕進行操縱。

當然模擬器畢竟是模擬器,和真實的機子還是存在差別的,

android模擬器和真機的不同之處:

* 不支援呼叫和接聽實際來電;但可以通過控制檯模擬電話呼叫(呼入和撥出)
    * 不支援USB連線

* 不支援相機/視訊捕捉

* 不支援音訊輸入(捕捉);但支援輸出(重放)

* 不支援擴充套件耳機

* 不能確定連線狀態

* 不能確定電池電量水平和交流充電狀態

* 不能確定SD卡的插入/彈出

* 不支援藍芽

2、建立和啟動Android模擬器

要玩GPhone的模擬器,當然需要先去(如果打不開就用)上面下載Android的SDK,解壓出來後在SDK的根目錄下有一個tools資料夾,裡面就是模擬器和一些非常有用的工具。(SDK詳細的安裝過程請參照http://blog.csdn.net/magicyu2/archive/2009/11/02/4755747.aspx

要正確的啟動模擬,你必須先要建立一個 AVD( Android Virtual Device 虛擬裝置 ) ,你可以利用AVD建立基於不同版本的模擬器,下面就介紹如何建立AVD:

(1)       檢視當前支援版本(在列出的版本中我們需要記住id值,這個值在第2步中使用):

[email protected]:~$ android list target

你可以看到幾個Available Android targets,比如:Name: Android 1.6,他們有各自的id號。

(2)       建立AVD:

[email protected]:~$ android create avd -n magicyu -t 2

-n後面接需要建立avd的名字,-t後面接需要建立虛擬器的型別,2即為步驟(1)中得到的型別id號。

(3)       檢視是否建立成功(如果成功會顯示剛才我們建立的avd資訊):

[email protected]:~$ android list avd

(4)       啟動模擬器:

[email protected]:~$ emulator @magicyu 或者

emulator -avd magicyu

其中@和-avd後接的是你建立過的avd名字

(5)       選擇啟動的面板

[email protected]:~$ emulator -avd magicyu -skin QVGA

skin後面接所要啟動面板的型別,所有的型別可以在<SDK>/ platforms/android-1.*/skins目錄下找到,*為所指的版本。如在1.6版本的SDK下有HVGA,QVGA,  WVGA800,WVGA854幾種。按Ctrl+F11,可以直接改變模擬器的橫縱擺放。

執行Eclipse,Window->Android SDK and AVD Manager,就能得到如下的介面,選擇新建即可新建一個AVD。

 eclipse_create_avd

3、Android模擬器的一些工具

(1)adb:

ADB(Android Debug Bridge)是Android 提供的一個通用的除錯工具,藉助這個工具,我們可以管理裝置或手機模擬器的狀態還可以進行以下的操作:

a、快速更新裝置或手機模擬器中的程式碼,如應用或Android系統升級;

b、在裝置上執行shell命令;

c、管理裝置或手機模擬器上的預定埠;

d、在裝置或手機模擬器上覆制或貼上檔案

一些常用的操作:

進入Shell: adb shell

通過上面的命令,就可以進入裝置或模擬器的shell環境中,在這個Linux Shell中,你可以執行各種Linux 的命令,另外如果只想執行一條shell命令,可以採用以下的方式:

adb shell [command]

如:adb shell dmesg會打印出核心的除錯資訊。

(Android的linux shell做了大量精簡,很多linux常用指令都不支援)

上傳檔案: adb push <PC檔案> </tmp/...>

下載檔案: adb pull </tmp/...> <PC檔案>

安裝程式: adb install <*.apk>

解除安裝軟體: adb shell rm /data/app/<*.apk>

補充一點,通過adb安裝的軟體(*.apk)都在"/data/app/"目錄下,所以安裝時不必制定路徑,解除安裝只需要簡單的執行"rm"就行。

結束adb: adb kill-server

顯示android模擬器狀態:

adb devices (埠資訊)

adb get-product (裝置型號)

adb get-serialno (序列號)

等待正在執行的裝置: adb wait-for-device

埠轉發: adb forward adb forward tcp:5555 tcp:1234

(將預設埠TCP 5555轉發到1234埠上)

檢視bug報告: adb bugreport

adb shell sqlite3 訪問資料庫SQLite3

adb shell logcat -b radio 記錄無線通訊日誌: 一般來說,無線通訊的日誌非常多,在執行時沒必要去記錄,但我們還是可以通過命令,設定記錄

應用程式配置檔案:

"AndroidManifest.xml"中

"<category android:name="android.intent.category.LAUNCHER" />"

決定是否應用程式是否顯示在Panel上

(2)am指令(在shell內使用am來載入android應用):

am [start|instrument]   

am start [-a <ACTION>]

  [-d <DATA_URI>]

  [-t <MIME_TYPE>]    

  [-c <CATEGORY> [-c <CATEGORY>] ...] 

  [-e <EXTRA_KEY> <EXTRA_VALUE> [-e <EXTRA_KEY> <EXTRA_VALUE> ...]

  [-n <COMPONENT>] [-D] [<URI>]       

am instrument [-e <ARG_NAME> <ARG_VALUE>]

  [-p <PROF_FILE>]          

  [-w] <COMPONENT>

啟動瀏覽器:

am start -a android.intent.action.VIEW -d http://www.google.cn/

撥打電話:

am start -a android.intent.action.CALL -d tel:10086

啟動google map直接定位到北京:

am start -a android.intent.action.VIEW geo:0,0?q=beijing

(3)為模擬器加上SD卡:

emulator -sdcard <path>/sdcard.img

下面我們再來說說如何建立"sdcard.img"檔案:

“tools”目錄下還有另外一個很好用的工具mksdcard,一看名字就知道——make sdcard。對,就用它來建立一個“SD卡”。

命令為:

mksdcard 1024M D:/sdcard.img

OK,這樣一個容量為1G的SD卡就建立完畢了。

使用SDCard:

建立: mksdcard <1024M> <sdcard.img>
(bytes(default),K,M)

連線到模擬器: emulator -sdcard <path/sdcard.img>

傳檔案到SDCard: adb push <目錄/audio.mp3> </sdcard/audio.mp3>

(4)Android模擬器打電話發簡訊

GPhone的模擬器有個特有的號碼:15555218135,這個就類似我們實體手機的SIM卡號碼啦。要實現撥號,用手機?當然不行!

更簡單,三步:

1.開啟終端

2.連線: telnet localhost 5554(5554是你開啟模擬器後上面顯示的數字)

3.命令:gsm call 15555218135

look!是不是模擬器上顯示來電了?接聽/結束通話和實體手機一樣。

發簡訊也一樣簡單,重複上面1,2兩步,第三部命令改一下:

sms send 15555218135 Hello,this is a Message.

4、Android模擬器主要命令引數介紹

emulator [-<option> [<value>]] ... [-<qemu args>]
下面的表總結了可用的引數

Help

-help列印模擬器引數列表。

-help-all列印所有啟動引數明細。

-help-<option>列印指定啟動引數的資訊。

-help-debug-tags列印所有被-debug <tags>開啟的列表。

-help-disk-images列印正在使用的磁碟映象資訊。

-help-environment列印模擬器環境變數資訊。 

-help-keys列印當前的鍵盤對映。

-help-keyset-file列印一個自定義的鍵盤對映檔案的定義。

Disk Images

-cache <filepath>使用<filepath> 指定網路快取分割槽映象。

自定義,您可以指定一個當前工作目錄的相對路徑。如果沒有指定快取檔案,模擬器會指定一個零時檔案作為快取檔案。更多資訊請參考-help-disk-images.

-data <filepath>使用<filepath>作為使用者資料磁碟映象。

自定義,您可以指定一個當前工作目錄的相對路徑。如果-data沒有被使用,模擬器會在<datadir>指定的目錄下尋找名叫"userdata-qemu.img"的映象檔案。預設情況下,模擬器會尋找~/.android (on Linux/Mac)或者C:/Documents and Settings/<user>/Local Settings/Application Data/Android (on Windows)。

如果您使用了-data <filepath>,但是檔案並不存在,模擬器將建立同名檔案。

更多資訊請參見執行多個模擬器例項和-help-disk-images。

-image <filepath>使用<filepath>作為系統映象。

自定義,您可以指定一個當前工作目錄的相對路徑。預設為<system>/system.img。
-initdata <filepath>

重寫使用者資料映象時,(使用 -wipe-data),複製此檔案內容到新使用者資料檔案映象中。預設方式下,模擬器拷貝<system>/userdata.img。

自定義,您可以指定一個當前工作目錄的相對路徑。參見-wipe-data。

更多資訊請參見-help-disk-images。

-kernel <filepath>使用<filepath>作為模擬器核心。自定義,您可以指定一個當前工作目錄的相對路徑。

-nocache啟動模擬器時無快取分割槽。參見-cache <file>。

-ramdisk <filepath>使用<filepath>作為虛擬記憶體映象。預設為<system>/ramdisk.img. 自定義,您可以指定一個當前工作目錄的相對路徑。更多資訊請參見-help-disk-images。

-sdcard <filepath>使用<file>作為SD卡映象。預設為<system>/sdcard.img. 自定義,您可以指定一個當前工作目錄的相對路徑。更多資訊請參見-help-disk-images。

-system <dirpath>在指定的<dir>下搜尋系統、虛擬記憶體和使用者資料映象檔案。<dir>為當前路徑的相對目錄。

-wipe-data重至使用者資料映象檔案。(that is, the file specified by -datadir and -data, or the default file). 模擬器刪除所有使用者資料,然後複製右-inidata引數指定的資料到映象檔案,在啟動之前。參見-initdata. 更多資訊請參見-help-disk-images。

Debug

-debug <tags>開啟/關閉指定tag的除錯資訊。

<tags>是一個被空格/逗號/縱列所分割的除錯組建名稱列表。更多資訊參見-help-debug-tags。

-debug-<tag>開啟/關閉指定tag的除錯資訊。使用-help-debug-tags獲得您可以指定為<tag>的除錯元件列表。

-debug-no-<tag>關閉指定tag的除錯資訊。

-logcat <logtags>開啟指定tag的日誌輸出。如果環境變數ANDROID_LOG_TAGS被指定且不為空,她的值將成為日誌輸出的預設值。

-shell建立一個擁有root許可權的命令列視窗。即使模擬器的UI介面無法使用了,您依然可以使用命令列視窗。按Ctr-c鍵中斷模擬器執行。

-shell-serial <device>開啟具有root許可權的指令碼視窗。<device>必須是一個QEMU型別的裝置。參見'serial -dev'在http://www.bellard.org/qemu/qemu-doc.html#SEC10上關於裝置型別的列表資訊。這兒有一些例子:

·         -shell-serial stdio is identical to -shell

·         -shell-serial tcp::4444,server,nowait 讓您的shell可以通過4444埠通訊。

·         -shell-serial fdpair:3:6 讓模擬器可以使用3 (in)和6(out)磁碟機。

·         -shell-serial fdpair:0:1 uses the normal stdin and stdout fds, except that QEMU won't tty-cook the data.

-show-kernel <name>顯示核心資訊。

-trace <name>Enable code profiling (press F9 to start), written to a specified file.

-verbose開啟冗長輸出。Equivalent to -debug-init. 您可以定義ANDROID_VERBOSE環境變數作為冗長輸出引數。定義你想用到的引數,用逗號分割。這樣可以省略像-debug-<tags>這樣的引數。下面是一個設定ANDROID_VERBOSE的例子,它帶有-debug-init和 -debug-modem 引數:

ANDROID_VERBOSE=init,modem更多資訊參見<-help-debug-tags>.

Media
-audio <backend>使用指定的音訊後端。

-audio-in <backend>使用指定的音訊輸入後端。

-audio-out <backend>使用指定的音訊輸出後端。

-noaudio在當前虛擬機器例項中關閉音訊支援。

-radio <device>重新定向收音機介面到本地的位元組裝置。

-useaudio開啟模擬器例項的音訊支援。預設為開啟。

Network

-dns-server <servers>使用指定的DNS伺服器。<servers>必須是以逗號分割,多於4個的伺服器名或IP地址。

-http-proxy <proxy>配置TCP連線使用HTTP/HTTPS代理。

http://<username>:<password>@<server>:<port> 字首http://可以被忽略。如果-http-proxy <proxy>未被指定,模擬器將尋找http_proxy環境變數,並且自動尋找所有符號格式要求的<proxy> 值。

-netdelay <delay>設定網路延遲預設值為none。參見Network Delay Emulation中關於<delay>的值。

-netfast快捷的 -netspeed full -netdelay none

-netspeed <speed>指定模擬器網路速度為<speed>.預設值為full。參見表格Network Speed Emulation 中的<speed>值。

-port <port>指定模擬器網路埠為<port>.控制檯埠號必須介於5554和5584之間,並且<port>+1必須留作ADB使用。

-report-console <socket>啟動前向第三方同志此模擬器例項的網路埠。<socket> 必須是以下幾種格式

tcp:<port>[,server][,max=<seconds>]

unix:<port>[,server][,max=<seconds>]

更多資訊參見 -help-report-console
System

-cpu-delay <delay>降低模擬器CPU的速度到<delay>。<delay>支援0到100的整數。注意<delay>與具體的時鐘或其他的絕對頻率無關。它只表現為一種抽象的,相對於當前模擬器執行狀況的速度調節。

-gps <device>重定向NMEA GPS到位元組裝置。

使用此引數通知模擬器模擬一個NMEA-compatible GPS,連線到一個擴充套件的裝置或socket埠。<device>格式必須符合QEMU-specific所指定的裝置格式。更多資訊參見'serial -dev' 和 http://www.bellard.org/qemu/qemu-doc.html#SEC10.

-nojni在Dalvik執行時關閉JNI檢查

-qemu傳遞引數到qemu。

-qemu -h關閉qemu幫助。

-timezone <timezone>設定模擬器時區為<timezone>,替換為系統時區。<timezone>必須按照時區格式指定。比如:"America/Los_Angeles","Europe/Paris"

-version顯示模擬器版本號。

UI

-dpi-device <dpi>修改模擬器的解析度適配物理裝置。預設值為165。參見-scale.

-no-boot-anim關閉模擬器啟動時的動畫。禁用啟動動畫可以加快啟動速度。

-no-window關閉模擬器的繪製視窗。

-scale <scale>調整模擬器視窗。<scale> 是介於0.1到3的數字,它是調整螢幕的比例因子。您也可以指定一個DPI值,在新增dpi字首的情況下。Auto引數告訴模擬器選擇自己最合適的尺寸。

-raw-keys關閉Unicode鍵盤reverse-mapping.

-noskin不使用任何模擬器面板。

-keyset <file>用指定的鍵盤設定檔案代替預設。指定宿主鍵盤和模擬器之間的鍵盤對映檔案。更多資訊參見-help-keyset。

-onion <image>用圖片覆蓋螢幕。不支援JPEG,只支援PNG

-onion-alpha <percent>指定onion面板透明值(百分比) 預設為50.

-onion-rotation <position>指定onion面板旋轉。<position> 必須是 0, 1, 2, 3中的一個。

-skin <skinID>啟動模擬器,搭配指定面板。

-skindir <dir>在指定目錄<dir>下搜尋面板

PC電腦和Android模擬器訪問及模擬器之間tcp/udp通訊

Android系統預設只能通過IP(10.0.2.2)單向訪問PC電腦,而PC電腦不能通過IP來直接訪問Android模擬器系統。要想實現PC電腦和Android模擬器系統以及Android模擬器之間相互通訊必須藉助埠重定向(redir)來實現。

先說說埠重定向所需要的telnet客戶端安裝:
windows:
安裝telnet客戶端。如果沒有安裝,可以在windows程式管理中的開啟或關閉系統功能下找到telnet客戶端選單項來啟用telnet客戶端功能。
linux:
自行安裝telnet客戶端。

一、PC電腦不能直接訪問Android模擬器系統的原因
Android系統為實現通訊將PC電腦IP設定為10.0.2.2,自身為10.0.2.15/127.0.0.1。然而PC電腦並沒有為Android模擬器系統指定IP,所以PC只能通過埠重定向來實現和Android模擬器的通訊。

二、PC電腦和Android模擬器系統之間通訊

1、執行模擬器

2、開啟window 命令列,執行:

telnet localhost 5554

5554是模擬器的埠(位於Android模擬器視窗標題欄),執行之後會進入android console

3、在console下執行:

格式:redir add < udp/tcp >:< pc埠 >:< 模擬器埠 >
例如:redir add udp:2888:2888 
     redir add tcp:2888:2888

執行此命令之後,會把PC 2888 埠接收到的tcp/udp資料轉到模擬器的2888埠。

三、多個Android模擬器系統之間通訊

1、啟動模擬器emulator-5554和emulator-5556

2、開啟dos視窗執行telnet localhost 5554連線到模擬器5554

3、成功連線後,繼續執行:redir add tcp:5000:6000將PC埠5000繫結到模擬器5554的埠6000上。

4、此時模擬器5556通過向PC電腦埠5000(即地址:10.0.2.2:5000)傳送tcp/udp資料包跟模擬器5554通訊。

5、同理根據步驟2、3來實現PC電腦對模擬器5556的埠轉發。

新增成功後,我們可以用redir list命令來列出已經新增的對映埠,redir del可以進行刪除。

相信只要理解了PC電腦和Android模擬器系統之間通訊,便知道怎麼實現多個模擬器之間通訊。