2010/11/11

android monkey 用法範例

文章原來源已遺失,好像類似情形不少,所以無法貼原文網址,原作者叫「俊傑」,感謝他:

Android 中Monkey的用法

簡介

Monkey是一個命令行工具,可以運行在模擬器裡或實際設備中。它向系統發送偽隨機的用戶事件流,實現對正在開發的應用程序進行壓力測試。Monkey包括許多選項,它們大致分為四大類:
  • 基本配置選項,如設置嘗試的事件數量。
  • 運行約束選項,如設置只對單獨的一個包進行測試。
  • 事件類型和頻率。
  • 調試選項。
在Monkey運行的時候,它生成事件,並把它們發給系統。 同時,Monkey還對測試中的系統進行監測,對下列三種情況進行特殊處理:
  • 如果限定了Monkey運行在一個或幾個特定的包上,那麼它會監測試圖轉到其它包的操作,並對其進行阻止。
  • 如果應用程序崩潰或接收到任何失控異常,Monkey將停止並報錯。
  • 如果應用程序產生了應用程序不響應(application not responding)的錯誤,Monkey將會停止並報錯。
按照選定的不同級別的反饋信息,在Monkey中還可以看到其執行過程報告和生成的事件。 Monkey基本用法 可以通過開發機器上的命令行或腳本來啟動Monkey。 由於Monkey運行在模擬器/設備環境中,所以必須用其環境中的shell來進行啟動。 可以通過在每條命令前加上adb shell來達到目的,也可以進入Shell後直接輸入Monkey命令。 基本語法如下: $ adb shell monkey [options] 如果不指定 options,Monkey將以無反饋模式啟動,並把事件任意發送到安裝在目標環境中的全部包。 下面是一個更為典型的命令行示例,它啟動指定的應用程序,並向其發送500個偽隨機事件: $ adb shell monkey -p your.package.name -v 500 命令選項參考 下表中列出了Monkey命令行可用的全部選項。
  • --help
    列出簡單的用法。
  • -v
    命令行的每一個-v將增加反饋信息的級別。Level 0(缺省值)除啟動提示、測試完成和最終結果之外,提供較少信息。Level 1提供較為詳細的測試信息,如逐個發送到Activity的事件。Level 2提供更加詳細的設置信息,如測試中被選中的或未被選中的Activity。
    事件
  • -s
    偽隨機數生成器的seed值。如果用相同的seed值再次運行Monkey,它將生成相同的事件序列。
  • --throttle
    在事件之間插入固定延遲。通過這個選項可以減緩Monkey的執行速度。如果不指定該選項,Monkey將不會被延遲,事件將儘可能快地被產成。
  • --pct-touch
    調整觸摸事件的百分比(觸摸事件是一個down-up事件,它發生在屏幕上的某單一位置)。
  • --pct-motion
    調整動作事件的百分比(動作事件由屏幕上某處的一個down事件、一系列的偽隨機事件和一個up事件組成)。
  • --pct-trackball
    調整軌跡事件的百分比(軌跡事件由一個或幾個隨機的移動組成,有時還伴隨有點擊)。
  • --pct-nav
    調整「基本」導航事件的百分比(導航事件由來自方向輸入設備的up/down/left/right組成)。
  • --pct-majornav
    調整「主要」導航事件的百分比(這些導航事件通常引發圖形界面中的動作,如:5-way鍵盤的中間按鍵、回退按鍵、菜單按鍵)
  • --pct-syskeys
    調整「系統」按鍵事件的百分比(這些按鍵通常被保留,由系統使用,如Home、Back、Start Call、End Call及音量控制鍵)。
  • --pct-appswitch
    調整啟動Activity的百分比。在隨機間隔裡,Monkey將執行一個startActivity()調用,作為最大程度覆蓋包中全部Activity的一種方法。
  • --pct-anyevent
    調整其它類型事件的百分比。它包羅了所有其它類型的事件,如:按鍵、其它不常用的設備按鈕、等等。
    約束限制
  • -p
    如果用此參數指定了一個或幾個包,Monkey將只允許系統啟動這些包裡的Activity。如果你的應用程序還需要訪問其它包裡的Activity(如選擇取一個聯繫人),那些包也需要在此同時指定。如果不指定任何包,Monkey將允許系統啟動全部包裡的Activity。要指定多個包,需要使用多個 -p選項,每個-p選項只能用於一個包。
  • -c
    如果用此參數指定了一個或幾個類別,Monkey將只允許系統啟動被這些類別中的某個類別列出的Activity。如果不指定任何類別,Monkey將選 擇下列類別中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多個類別,需要使用多個-c選項,每個-c選 項只能用於一個類別。
    調試
  • --dbg-no-events
    設置此選項,Monkey將執行初始啟動,進入到一個測試Activity,然後不會再進一步生成事件。為了得到最佳結果,把它與-v、一個或幾個包約 束、以及一個保持Monkey運行30秒或更長時間的非零值聯合起來,從而提供一個環境,可以監視應用程序所調用的包之間的轉換。
  • --hprof
    設置此選項,將在Monkey事件序列之前和之後立即生成profiling報告。這將會在data/misc中生成大文件(~5Mb),所以要小心使用它。
  • --ignore-crashes
    通常,當應用程序崩潰或發生任何失控異常時,Monkey將停止運行。如果設置此選項,Monkey將繼續向系統發送事件,直到計數完成。
  • --ignore-timeouts
    通常,當應用程序發生任何超時錯誤(如「Application Not Responding」對話框)時,Monkey將停止運行。如果設置此選項,Monkey將繼續向系統發送事件,直到計數完成。
  • --ignore-security-exceptions
    通常,當應用程序發生許可錯誤(如啟動一個需要某些許可的Activity)時,Monkey將停止運行。如果設置了此選項,Monkey將繼續向系統發送事件,直到計數完成。
  • --kill-process-after-error
    通常,當Monkey由於一個錯誤而停止時,出錯的應用程序將繼續處於運行狀態。當設置了此選項時,將會通知系統停止發生錯誤的進程。注意,正常的(成功的)結束,並沒有停止啟動的進程,設備只是在結束事件之後,簡單地保持在最後的狀態。
  • --monitor-native-crashes
    監視並報告Android系統中本地代碼的崩潰事件。如果設置了--kill-process-after-error,系統將停止運行。
  • --wait-dbg
    停止執行中的Monkey,直到有調試器和它相連接。
接下來看一個實例 Monkey 的用法是$ adb shell monkey -p your.package.name -v 500 首先,我們要找到應用程序在Emulator中所對應的包名,我一開始是一個個目錄找的,前7步完成了這項工作,最終發現應用程序包都在 data/data下,你可以在shell中cd data/data,然後ls查看當前Emulator中的所有應用程序包。 假如我們想對SDK中的APIDemos做壓力測試,
  1. 在Eclipse中新建工程,將

    F:\android-sdk-windows\platforms\android-2.0\samples\ApiDemos添加到工程中點擊運行,此時,他的APK應該加載到了Emulator上

  2. 在命令行輸入adb shell

  3. 輸入ls查看當前文件夾下的目錄,執行結果如下

    C:\Documents and Settings\Administrator>adb shell
    # ls
    ls
    sqlite_stmt_journals
    config
    cache
    sdcard
    d
    etc
    system
    sys
    sbin
    proc
    init.rc
    init.goldfish.rc
    init
    default.prop
    data
    root
    dev

  4. 應用程序包都在data下,我們輸入cd data進入data文件夾,如下

    # cd data
    cd data
    
  5. 輸入ls查看文件夾下的內容,如下所示:

    # ls
    ls
    misc
    local
    data
    app-private
    app
    property
    anr
    backup
    dontpanic
    dalvik-cache
    system
    lost+found

  6. 還有個data,所有的應用程序就在這個data下了,進入這個data,然後輸入ls如下:

    # cd data
    cd data
    # ls
    ls
    com.android.mms
    com.android.providers.applications
    com.android.globalsearch
    com.android.calculator2
    com.android.spare_parts
    com.android.gesture.builder
    com.android.music
    com.android.sdksetup
    com.android.packageinstaller
    com.android.fallback
    com.android.providers.settings
    com.android.providers.drm
    com.android.development
    com.android.providers.telephony
    com.android.inputmethod.pinyin
    com.android.htmlviewer
    com.android.settings
    com.android.netspeed
    com.android.providers.userdictionary
    com.android.browser
    com.android.contacts
    com.android.alarmclock
    com.android.camera
    com.android.providers.contacts
    jp.co.omronsoft.openwnn
    com.android.launcher
    com.android.phone
    com.android.soundrecorder
    com.google.android.providers.enhancedgooglesearch
    com.svox.pico
    com.android.customlocale
    com.android.term
    com.android.providers.downloads
    com.android.providers.media
    com.android.email
    android.tts
    com.android.inputmethod.latin
    com.android.server.vpn
    com.example.android.apis

  7. 最後一個就是我們剛才加載的APIDemo的應用程序包

  8. 可以直接輸入monkey -p com.example.android.apis -v 50,結果如下,也可以退出shell,在命令行輸入,adb shell monkey -p com.example.android.apis -v 50 ,運行過程中,Emulator中的應用程序在不斷地切換畫面,可以看一下,呵呵:)

    # monkey -p com.example.android.apis -v 50
    monkey -p com.example.android.apis -v 50
    :Monkey: seed=0 count=50
    :AllowPackage: com.example.android.apis
    :IncludeCategory: android.intent.category.LAUNCHER
    :IncludeCategory: android.intent.category.MONKEY
    // Event percentages:
    //   0: 15.0%
    //   1: 10.0%
    //   2: 15.0%
    //   3: 25.0%
    //   4: 15.0%
    //   5: 2.0%
    //   6: 2.0%
    //   7: 1.0%
    //   8: 15.0%
    :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.categ
    ory.LAUNCHER;launchFlags=0x10000000;component=com.example.android.apis/.ApiDemos
    ;end
        // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.in
    tent.category.LAUNCHER] cmp=com.example.android.apis/.ApiDemos } in package com.
    example.android.apis
    :Sending Pointer ACTION_MOVE x=-4.0 y=2.0
    :Sending Pointer ACTION_UP x=0.0 y=0.0
        // Allowing start of Intent { cmp=com.example.android.apis/.ApiDemos } in pa
    ckage com.example.android.apis
    :Sending Pointer ACTION_DOWN x=207.0 y=282.0
    :Sending Pointer ACTION_UP x=189.0 y=289.0
        // Allowing start of Intent { cmp=com.example.android.apis/.app.Intents } in
    package com.example.android.apis
    :Sending Pointer ACTION_DOWN x=95.0 y=259.0
    :Sending Pointer ACTION_UP x=95.0 y=259.0
    :Sending Pointer ACTION_DOWN x=295.0 y=223.0
    :Sending Pointer ACTION_UP x=290.0 y=213.0
    :Sending Pointer ACTION_MOVE x=-5.0 y=3.0
    :Dropped: keys=0 pointers=0 trackballs=0 flips=0
    ## Network stats: elapsed time=3799ms (3799ms mobile, 0ms wifi, 0ms not connecte
    d)
    // Monkey finished

2010/11/10

windows 上跑 adb 簡介

Android 基本上都可以透過 adb 從外面跟 DUT 溝通,可以參考 http://developer.android.com/guide/developing/tools/adb.html 的說明。
adb 只是 Android SDK 的一個工具,可以從 http://dl.google.com/android/android-sdk_r07-windows.zip 下載,或是從 http://developer.android.com/sdk/index.html 查最新的版本

網頁上文件說的很複雜,因為那是教人寫 Android Application 的文件,基本上最簡單的做法就是:
0. 安裝 windows 端的 android usb driver,這一步可能你們已經安裝了,可以把 DUT 插到 PC 上看能不能抓到裝置就知道了,若是未認得的裝置,再來安裝usb driver
1. 從上面的網址下載 SDK
2. 解開壓縮檔,譬如放在 android-sdk-windows 下
3. 直接進入 android-sdk-windows\tools 下用 cmd mode 的視窗(就是執行cmd.exe) 執行adb 即可

底下簡介一下 adb 的使用,當然都是在 cmd mode 下執行, 為了方便我底下說明,把要安裝的 TestSuite.apk 放在 C:\ android-sdk-windows\tools 下,可以依實際位置修改底下的命令:
  • C:\ android-sdk-windows\tools > adb devices <-- 查連接的 android devices,請先接一台就好
  • C:\ android-sdk-windows\tools > adb shell ls / <-- 遠端在 DUT 上的命令,假設只有連接一台,這個命令範例類似 dir C:\ 之意
  • C:\ android-sdk-windows\tools > adb push .\TestSuite.apk /data/TestSuite.apk <-- 將 TestSuite 從外面放到 DUT 上
  • C:\ android-sdk-windows\tools > adb install /data/TestSuite.apk <-- 要執行過上面的命令才能執行此命令。安裝後那台 DUT 就可以看到 TestSuite 的應用程式圖示
  • C:\ android-sdk-windows\tools > adb pull /proc/meminfo <-- 這樣可以抓到 DUT 上的 /proc/meminfo 這個檔,那是抓的當時 DUT 記憶體使用狀況
  • C:\ android-sdk-windows\tools > adb logcat <-- DUT 在執行應用程式時,通常會產生一堆的 標準log, 可以用這個命令抓下來,但是這個命令不會停止,若要離開請用 Ctrl-C 中斷它
  • C:\ android-sdk-windows\tools > adb reboot recovery <-- 可以讓 DUT 重開機進入 Recovery mode


Windows 上的 usb driver, 可以自 http://dl.google.com/android/repository/usb_driver_r03-windows.zip 取得,問題是網路上很難查到這樣的網址,這邊公佈一下我找的方法:

首先,取得 http://dl.google.com/android/repository/repository.xml,這個檔就是 android 的倉庫清單,剩下的就簡單了,譬如....裡面有一筆 <sdk:url>usb_driver_r03-windows.zip</sdk:url>,這樣就可以查到剛剛上面貼的 url: http://dl.google.com/android/repository/usb_driver_r03-windows.zip

2010/11/08

一個簡單的硬碟效能測試 -- dd

dd 是一個很特別的指令,尤其在 android 中並沒有 cp 存在,只有 dd....
當然,我會這樣說,就是可以用dd 來複製檔案,大家也都會 dd if=SOURCE of=TARGET 即可,底下再說一點點它特別之處

dd if=/dev/fd0 of=/home/sam/MBRboot.image bs=512 count=2
上面這樣可以將軟碟片的前面 512x2==1024 個 byte 讀出來,寫成一個新檔案叫 MBRboot.image

dd if=/dev/sda of=/home/sam/MBR.image bs=512 count=1
上面也是一樣道理,可以把硬體的開機磁區寫到一個新檔案叫 MBR.image

所謂的硬碟開機磁區,就是一個 partition table + boot code, 若您只需要 boot code, 可以用下面的方法:
dd if=/dev/sda of=/home/sam/MBR_boot.image bs=446 count=1

那還有沒有其他用法?
dd if=/dev/uramdom bs=1024 count=1000000 of=/home/sam/1Gb.file
dd if=/home/sam/1Gb.file bs=64k | dd of=/dev/null
上面的方法可以用來簡單測試硬碟效能,也就是你搭配將上面兩行寫成一個 shell, 再搭配 time 來量時間
若不想用 /dev/uramdom 也可以用 /dev/zero 來取代

如果想弄一個空的 1G 檔案出來,一般會寫成
dd if=/dev/zero of=1G-file bs=1M count=1024
可是啊,這樣真的就要寫「很久很久」,卻又有一個很簡單的方式,一瞬間就寫完了,真的是神奇
dd if=/dev/zero of=1G-file bs=1 count=0 seek=1G

2010/11/04

Android 開機過程 boot sequence

請見The Android boot process from power on一文

全部有幾個階段:
1. Power on and boot ROM code execution
2. The boot loader
3. The Linux kernel
4. The init process
5. Zygote and Dalvik
6. The system server
7. Boot completed

在 kernel 之前還算跟一般的 embedded linux 一樣,但是在 init 之後就完全走它自己的路。先來看前面步驟的示意圖










1. Power on and boot ROM code execution




  • A. The Boot ROM code will detect the boot media using a system register that maps to some physical balls on the asic. This is to determine where to find the first stage of the boot loader.
  • B. Once the boot media sequence is established the boot ROM will try to load the first stage boot loader to internal RAM. Once the boot loader is in place the boot ROM code will perform a jump and execution continues in the boot loader.

2. The boot loader



  • A. The first boot loader stage will detect and set up external RAM.
  • B. Once external RAM is available and the system is ready the to run something more significant the first stage will load the main boot loader and place it in external RAM.
  • C. The second stage of the boot loader is the first major program that will run. This may contain code to set up file systems, additional memory, network support and other things. On a mobile phone it may also be responsible for loading code for the modem CPU and setting up low level memory protections and security options.
  • D. Once the boot loader is done with any special tasks it will look for a Linux kernel to boot. It will load this from the boot media (or some other source depending on system configuration) and place it in the RAM. It will also place some boot parameters in memory for the kernel to read when it starts up.
  • E. Once the boot loader is done it will perform a jump to the Linux kernel, usually some decompression routine, and the kernel assumes system responsibility.

3. The Linux kernel

  • A. Once the memory management units and caches have been initialized the system will be able to use virtual memory and launch user space processes.
  • B. The kernel will look in the root file system for the init process (found under system/core/init in the Android open source tree) and launch it as the initial user space process.

4. The init process

  • A. The init process in Android will look for a file called init.rc. This is a script that describes the system services, file system and other parameters that need to be set up. The init.rc script is placed in system/core/rootdir in the Android open source project.
  • B. The init process will parse the init script and launch the system service processes.

5. Zygote and Dalvik

The Zygote is launched by the init process and will basically just start executing and initialize the Dalvik VM.

6. The system server

The system server is the first java component to run in the system. It will start all the Android services such as telephony manager and bluetooth. Start up of each service is currently written directly into the run method of the system server. The system server source can be found in the file frameworks/base/services/java/com/android/server/SystemServer.java in the open source project.

7. Boot completed

Once the System Server is up and running and the system boot has completed there is a standard broadcast action called ACTION_BOOT_COMPLETED. To start your own service, register an alarm or otherwise make your application perform some action after boot you should register to receive this broadcast intent.