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

前言html

  本章內容爲開發者指南(Dev Guide)/Developing/Tools/adb,這是一篇很是優秀的譯稿,翻譯來自"移動雲_文斌",歡迎訪問它的博客:"http://blog.csdn.net/caowenbin",再次感謝"移動雲_文斌" !期待你一塊兒參與翻譯Android的相關資料,聯繫我over140@gmail.com。
 android

 

聲明sql

  歡迎轉載,但請保留文章原始出處:)
 shell

    農民伯伯:http://over140.blog.51cto.com/數據庫

    Android中文翻譯組:http://goo.gl/6vJQl
 服務器

 

正文網絡

  Android Debug Bridgedom

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

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

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

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

  當啓動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  ...

         即若是模擬器與adb5555端口鏈接,則其與控制檯的鏈接就是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開發環境,就不須要直接使用adbaapt命令來安裝應用程序了,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>

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

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

tcp:<portnum>

local:<UNIX domain socket name>

dev:<character device name>

jdwp:<pid>

ppp <tty> [parm]...

經過USB運行UPP

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

[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

相關文章
相關標籤/搜索