Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android開發者指南(1) —— Android Debug Bridge(adb)

Android開發者指南(1) —— Android Debug Bridge(adb)

編輯:Android開發實例

前言

  本章內容為開發者指南(Dev Guide)/Developing/Tools/adb,這是一篇非常優秀的譯稿,翻譯來自"移動雲_文斌"。
 

 

正文

  Android Debug Bridge

  Android調試橋接器,簡稱adb,是用於管理模擬器或真機狀態的萬能工具,采用了客戶端-服務器模型,包括三個部分:

  * 客戶端部分,運行在開發用的電腦上,可以在命令行中運行adb命令來調用該客戶端,像ADB插件和DDMS這樣的Android工具也可以調用adb客戶端。

  * 服務端部分,是運行在開發用電腦上的後台進程,用於管理客戶端與運行在模擬器或真機的守護進程通信。

  * 守護進程部分,運行於模擬器或手機的後台。

  當啟動adb客戶端時,客戶端首先檢測adb服務端進程是否運行,如果沒有運行,則啟動服務端。當服務端啟動時,它會綁定到本地的TCP5037端口,並且監聽從adb客戶端發來的命令——所有的adb客戶端都使用5037端口與adb服務端通信。

  接下來服務端與所有正在運行的模擬器或手機連接。它通過掃描5555-5585之間的奇數號端口來搜索模擬器或手機,一旦發現adb守護進程,就通過此端口進行連接。需要說明的是,每一個模擬器或手機使用一對有序的端口,偶數號端口用於控制台連接,奇數號端口用於adb連接,例如:

Emulator 1, console: 5554
Emulator 1, adb: 5555
Emulator 2, console: 5556
Emulator 2, adb: 5557 ...

         即如果模擬器與adb在5555端口連接,則其與控制台的連接就是5554端口。

         當服務端與所有的模擬器建立連接之後,就可以使用adb命令來控制或者訪問了。因為服務端管理著連接並且可以接收到從多個adb客戶端的命令,所以可以從任何一個客戶端或腳本來控制任何模擬器或手機設備。

         下文介紹了可以用來管理模擬器或手機的這些adb命令。如果是在Eclipse並且安裝了ADT插件的環境下開發Android應用程序,就不需要從命令行使用adb了,ADT插件已經提供了透明的集成。不過,還是可以在調試等需要的時候直接使用adb。

 

  使用adb命令

         從開發用電腦的命令行或腳本文件中使用adb命令的用法是:

      adb [-d|-e|-s <serialNumber>] <command>

         當使用的時候,程序會調用adb客戶端。因為adb客戶端不需要關聯到任何模擬器,所以如果有多個模擬器或手機正在運行,就需要使用-d參數指定要操作的是哪一個,更多關於這些選項參數的使用可以參見Directing Commands to a Specific Emulator/Device Instance。

 

  查詢模擬器或手機狀態

         了解adb服務端連接的模擬器或手機可以幫助更好的使用adb命令,這可以通過devices命令列舉出來:

 adb devices

         執行結果是adb為每一個設備輸出以下狀態信息:

  * 序列號(serialNumber) — 由adb創建的使用控制台端口號的用於唯一標識一個模擬器或手機設備的字符串,格式是 <設備類型>-<端口號>,例如: emulator-5554

 * 狀態(state) — 連接狀態,其值是:

 offline — 未連接或未響應

 device —已經連接到服務商。注意這個狀態並不表示Android系統已經完全啟動起來,系統啟動的過程中已經可以連接adb,但這個狀態是正常的可操作狀態。

每一個設備的輸出形如:

 [serialNumber] [state]

下面是 devices 命令和其執行結果:

$ adb devices
List of devices attached 
emulator-5554  device
emulator-5556  device
emulator-5558  device

如果沒有模擬器或手機在運行,該狀態返回的是no device。

 

  操作指定的模擬器或手機

         如果有多個模擬器或手機正在運行,當使用adb命令的時候就需要指定目標設備,這可以通過使用-s選項參數實現,用法是:

adb -s <serialNumber> <command> 

         即可以在adb命令中使用序列號指定特定的目標,前文已經提到的devices命令可以實現查詢設備的序列號信息。

         例如:

adb -s emulator-5556 install helloWorld.apk

      需要注意的是,如果使用了-s而沒有指定設備的話,adb會報錯。

 

  安裝應用程序

    可以使用adb從開發用電腦中復制應用程序並且安裝到模擬器或手機上,使用install命令即可,在這個命令中,必須指定待安裝的.apk文件的路徑:

adb install <path_to_apk>

    關於創建可安裝的應用的更多信息,請參見Android Asset Packaging Tool (aapt).

    注意,如果使用了安裝有ADT插件的Eclipse開發環境,就不需要直接使用adb或aapt命令來安裝應用程序了,ADT插件可以自動完成這些操作。

 

  轉發端口

         可以使用forward 命令轉發端口 — 將特定端口上的請求轉發到模擬器或手機的不同的端口上。下例是從6100端口轉到7100端口:

      adb forward tcp:6100 tcp:7100

         也可以使用UNIX命名的socket標識:

      adb forward tcp:6100 local:logd 

 

  與模擬器或手機傳輸文件

    可以使用adb的 pull 和 push 命令從模擬器或手機中復制文件,或者將文件復制到模擬器或手機中。與 install 命令不同,它僅能復制.apk文件到特定的位置, pull 和 push 命令可以復制任意文件夾和文件到模擬器或手機的任何位置。

從模擬器或手機中復制一個文件或文件夾(遞歸的)使用:

adb pull <remote> <local>

    復制一個文件或文件夾(遞歸的)到模擬器或手機中使用:

adb push <local> <remote>

    在這個命令中<local>和<remote>引用的是文件或文件夾的路徑,在開發用電腦上的是local,在模擬器或手機上的是remote。

    例如:

adb push foo.txt /sdcard/foo.txt

 

  adb命令列表

         下表列出了所有adb支持的命令及其說明:

類別

命令

說明

備注

可選項

-d

命令僅對USB設備有效

如果有多個USB設備就會返回錯誤

-e

命令僅對運行中的模擬器有效

如果有多個運行中的模擬器就會返回錯誤

-s <serialNumber>

命令僅對adb關聯的特定序列號的模擬器或手機有效(例如 "emulator-5556").

如果不指定設備就會返回錯誤

一般項

devices

輸出所有關聯的模擬器或手機設備列表

參見 Querying for Emulator/Device Instances 以獲得更多信息。

help

輸出adb支持的命令

 

version

輸出adb的版本號

 

調試項

logcat [<option>] [<filter-specs>]

在屏幕上輸出日志信息

 

bugreport

為報告bug,在屏幕上輸出dumpsys, dumpstate和 logcat數據

 

jdwp

輸出有效的JDWP進程信息

可以使用 forward jdwp:<pid> 轉換端口以連接到指定的 JDWP 進程,例如:

adb forward tcp:8000 jdwp:472

jdb -attach localhost:8000

數據項

install <path-to-apk>

安裝應用程序(用完整路徑指定.apk文件)

 

pull <remote> <local>

從開發機COPY指定的文件到模擬器或手機

 

push <local> <remote>

從模擬器或手機COPY文件到開發機

 

端口和網絡項

forward <local> <remote>

從本地端口轉換連接到模擬器或手機的指定端口

端口可以使用以下格式表示:

l tcp:<portnum>

l local:<UNIX domain socket name>

l dev:<character device name>

l jdwp:<pid>

ppp <tty> [parm]...

通過USB運行UPP

l <tty> —PPP流中的tty。例如:/dev/omap_csmi_ttyl。

l [parm]... — 0到多個PPP/PPPD 選項, 例如 defaultroute, local, notty等等。

注意不用自動啟動PPP連接

 

腳本項

get-serialno

輸出adb對象的序列號

參見 Querying for Emulator/Device Instances以獲得更多信息。

get-state

輸出adb設備的狀態

wait-for-device

阻塞執行直到設備已經連接,即設備狀態是 device.

可以在其他命令前加上此項,那樣的話adb就會等到模擬器或手機設備已經連接才會執行命令,例如:

 

注意該命令並不等待系統完全啟動,因此不能追加需要在系統完全啟動才能執行的命令,例如install 命令需要Android包管理器支持,但它必須在系統完全啟動後才有效。下面的命令

 

會在模擬器或手機與adb發生連接後就執行install,但系統還沒有完全啟動,所以會引起錯誤。

服務端項

start-server

檢測adb服務進程是否啟動,如果沒啟動則啟動它。

 

kill-server

終止服務端進程

 

Shell

shell

在目標模擬器或手機上啟動遠程SHELL

參見 Issuing Shell Commands以獲得更多信息。

shell [<shellCommand>]

在目標模擬器或手機上執行shellCommand然後退出遠程SHELL

 

  執行Shell命令

         Adb提供了shell來在模擬器或手機上運行各種各樣的命令,這些命令的二進制形式存在於這個路徑中:

/system/bin/...

         無論是否進入adb遠程shell,都可以使用 shell 命令來執。

         在未進入遠程shell的情況下可以按下述格式執行單條命令:

adb [-d|-e|-s {<serialNumber>}] shell <shellCommand>

         啟動遠程shell使用下面的格式:       

adb [-d|-e|-s {<serialNumber>}] shell

    退出遠程shell時使用CTRL+D 或 exit 終止會話。

    以下是可以使用的shell命令的更多信息。

 

  從遠程shell檢查sqlite3 數據庫

         通過遠程shell,可以使用sqlite3命令行程序來管理由應用程序創建的SQLite數據庫。 sqlite3 工具包含很多有用的命令,例如 .dump 用於輸出表格的內容,.schema 用於為已經存在的表輸出 SQL CREATE 語句。 並且該工具也提供了聯機執行SQLite命令的能力。

         使用 sqlite3時,向前文描述的那樣進入模擬器的遠程shell,然後使用sqlite3 命令。也可以在調用 sqlite3時指定數據庫的全路徑。SQLite3數據庫存儲在/data/data/<package_name>/databases/路徑下。

         示例:

$ adb -s emulator-5554 shell
# sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db
SQLite version 3.3.12
Enter ".help" for instructions
.... enter commands, then quit...
sqlite> .exit 

         一旦運行了 sqlite3,就可以使用 sqlite3 命令,退出並返回遠程shell可以使用 exit 或 CTRL+D。

 

  使用Monkey進行UI或應用程序測試

         Monkey是運行於模擬器或手機上的一個程序,通過生成偽隨機的大量的系統級的用戶事件流來模擬操作,包括單擊、觸摸、手勢等。從而為正在開發中的應用程序通過隨機響應進行壓力測試。

         最簡單使用monkey的方式是通過下面的命令行,它可以運行指定的應用程序並向其發送500個偽隨機事件。

$ adb shell monkey -v -p your.package.name 500

     關於monkey更多的選項及詳細信息,請參見UI/Application Exerciser Monkey

 

  其他Shell命令

         下表列出了很多有效的adb shell命令,完整的列表可以通過啟動模擬器並且使用adb –help命令獲取。

adb shell ls /system/bin

         幫助對於大部分命令是有效的。

Shell 命令

描述

備注

dumpsys

在屏幕上顯示系統數據

The Dalvik Debug Monitor Service (DDMS) 工具提供了更易於使用的智能的調試環境。

dumpstate

將狀態輸出到文件

logcat [<option>]... [<filter-spec>]...

輸出日志信息

dmesg

在屏幕上輸出核心調試信息

start

啟動或重新啟動模擬器或手機

 

stop

停止模擬器或手機

 

 

  使用logcat查看日志

         Android日志系統提供了從眾多應用程序和系統程序中收集和查看調試信息的機制,這些信息被收集到一系統循環緩沖區中,可以 logcat 命令查看和過濾。

 

  使用 logcat 命令

         查看和跟蹤系統日志緩沖區的命令logcat的一般用法是:

[adb] logcat [<option>] ... [<filter-spec>] ...

   下文介紹過濾器和命令選項,詳細內容可參見Listing of logcat Command Options

     可以在開發機中通過遠程shell的方式使用logcat命令查看日志輸出:

$ adb logcat

     如果是在遠程shell中可直接使用命令:

# logcat

 

  過濾日志輸出

         每一條日志消息都有一個標記和優先級與其關聯。

  標記是一個簡短的字符串,用於標識原始消息的來源 (例如"View" 來源於顯示系統)。

  優先級是下面的字符,順序是從低到高:

  V — 明細 (最低優先級)

  D — 調試

  I — 信息

  W — 警告

  E — 錯誤

  F — 嚴重錯誤

  S — 無記載 (最高優先級,沒有什麼會被記載)

     通過運行logcat ,可以獲得一個系統中使用的標記和優先級的列表,觀察列表的前兩列,給出的格式是<priority>/<tag>。

     這裡是一個日志輸出的消息,優先級是“I”,標記是“ActivityManager”:

I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}

    如果想要減少輸出的內容,可以加上過濾器表達式進行限制,過濾器可以限制系統只輸出感興趣的標記-優先級組合。

    過濾器表達式的格式是tag:priority ... ,其中tag是標記, priority是最小的優先級, 該標記標識的所有大於等於指定優先級的消息被寫入日志。也可以在一個過濾器表達式中提供多個這樣的過濾,它們之間用空格隔開。

    下面給出的例子是僅輸出標記為“ActivityManager”並且優先級大於等於“Info”和標記為“MyApp”並且優先級大於等於“Debug”的日志:

adb logcat ActivityManager:I MyApp:D *:S

    上述表達式最後的 *:S 用於設置所有標記的日志優先級為S,這樣可以確保僅有標記為“View”(譯者注:應該為ActivityManager,原文可能是筆誤)和“MyApp”的日志被輸出,使用 *:S 是可以確保輸出符合指定的過濾器設置的一種推薦的方式,這樣過濾器就成為了日志輸出的“白名單”。

    下面的表達是顯示所有優先級大於等於“warning”的日志:

adb logcat *:W

    如果在開發用電腦上運行 logcat  (相對於運行運程shell而言),也可以通過ANDROID_LOG_TAGS環境變量設置默認的過濾器表達式:

export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"

    需要注意的是,如果是在遠程shell或是使用adb shell logcat 命令運行logcat , ANDROID_LOG_TAGS 不會導出到模擬器或手機設備上。

 

  控制日志格式

         日志消息在標記和優先級之外還有很多元數據字段,這些字段可以通過修改輸出格式來控制輸出結果, -v 選項加上下面列出的內容可以控制輸出字段:

  brief — 顯示優先級/標記和原始進程的PID (默認格式)

  process — 僅顯示進程PID

  tag — 僅顯示優先級/標記

  thread — 僅顯示進程:線程和優先級/標記

  raw — 顯示原始的日志信息,沒有其他的元數據字段

  time — 顯示日期,調用時間,優先級/標記,PID

  long —顯示所有的元數據字段並且用空行分隔消息內容

  可以使用 -v啟動 logcat來控制日志格式:

[adb] logcat [-v <format>]

  例如使用 thread 輸出格式:

adb logcat -v thread

  注意只能在 -v 選項中指定一種格式。

 

  Viewing Alternative Log Buffers

         Android日志系統為日志消息保持了多個循環緩沖區,而且不是所有的消息都被發送到默認緩沖區,要想查看這些附加的緩沖區,可以使用-b 選項,以下是可以指定的緩沖區:

  radio — 查看包含在無線/電話相關的緩沖區消息

  events — 查看事件相關的消息

  main — 查看主緩沖區 (默認緩沖區)

  -b 選項的用法:

[adb] logcat [-b <buffer>]

  例如查看radio緩沖區:

adb logcat -b radio

 

  查看stdoutstderr

         默認的,Android系統發送 stdout 和 stderr (System.out 和 System.err) 輸出到 /dev/null。 在 Dalvik VM進程,可以將輸出復制到日志文件,在這種情況下,系統使用 stdout 和 stderr標記寫入日志,優先級是I

         要想使用這種方式獲得輸出,需要停止運行中的模擬器或手機,然後使用命令 setprop 來允許輸出重定位,示例如下:

$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start

     系統會保留這一設置直到模擬器或手機退出,也可以在設備中增加/data/local.prop以使得這一設備成為默認配置。

 

  Logcat命令選項列表

選項

描述

-b <buffer>

加載不同的緩沖區日志,例如 event 或radiomain 緩沖區是默認項,參見Viewing Alternative Log Buffers.

-c

清空(刷新)所有的日志並且退出

-d

在屏幕上輸出日志並退出

-f <filename>

將日志輸出到文件<filename>,默認輸出是stdout.

-g

輸出日志的大小

-n <count>

設置最大的循環數據<count>,默認是4,需要-r選項

-r <kbytes>

每<kbytes>循環日志文件,默認是16,需要 -f 選項

-s

設置默認的過濾器為無輸出

-v <format>

設置輸出格式,默認的是brief,支持的格式列表參見Controlling Log Output Format.

 

  停止adb服務

         在某些情況下,可能需要終止然後重啟服務端進程,例如adb不響應命令的時候,可以通過重啟解決問題。

         使用kill-server可以終止服務端,然後使用其他的adb命令重啟。

 

  原文

         http://developer.android.com/guide/developing/tools/adb.html

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved