AdbHelper

public final class AdbHelper
extends Object

java.lang.Object
   ↳ com.android.tradefed.device.server.AdbHelper


處理要求和連線至 adb 的輔助類別。

AndroidDebugBridge 是用於連線至 adb 的公開 API,而 AdbHelper 則負責處理低階作業。

目前使用的是自旋等待非阻塞式 I/O。選取器效率較高,但就我們目前執行的作業而言,似乎有點過度。

摘要

巢狀類別

class AdbHelper.AdbResponse

ADB 的回應。 

常數

String HOST_TRANSPORT

欄位

public static final Charset DEFAULT_CHARSET

公用方法

static void createForward(InetSocketAddress adbSockAddr, IDevice device, String localPortSpec, String remotePortSpec)

在本地和遠端通訊埠之間建立通訊埠轉送。

static AdbCommandRejectedException createHiddenException(String message, boolean errorDuringDeviceSelection)
static AdbCommandRejectedException createHiddenException(String message)
static byte[] createJdwpForwardRequest(int pid)

建立轉送至 jdwp 程序的連接埠轉送要求。

static SocketChannel createPassThroughConnection(InetSocketAddress adbSockAddr, String deviceSerialNumber, int pid)

從主機到裝置上的通訊埠,建立並連線新的直通通訊端。

static void createReverse(InetSocketAddress adbSockAddr, IDevice device, String remotePortSpec, String localPortSpec)

在遠端和本機通訊埠之間建立通訊埠反向。

static void executeRemoteCommand(InetSocketAddress adbSockAddr, String command, IDevice device, IShellOutputReceiver rcvr, long maxTimeToOutputResponse, TimeUnit maxTimeUnits)

在裝置上執行殼層指令並擷取輸出內容。

static void executeRemoteCommand(InetSocketAddress adbSockAddr, AdbHelper.AdbService adbService, String command, IDevice device, IShellOutputReceiver rcvr, long maxTimeout, long maxTimeToOutputResponse, TimeUnit maxTimeUnits, InputStream is)

在裝置上執行遠端指令並擷取輸出內容。

static void executeRemoteCommand(InetSocketAddress adbSockAddr, String command, IDevice device, IShellOutputReceiver rcvr, long maxTimeout, long maxTimeToOutputResponse, TimeUnit maxTimeUnits)

在裝置上執行殼層指令並擷取輸出內容。

static byte[] formAdbRequest(String payloadString)

建立 ASCII 字串,前面加上四個十六進位數字。

static String getFeatures(IDevice device)

從裝置查詢一組支援的功能。

static RawImage getFrameBuffer(InetSocketAddress adbSockAddr, IDevice device, long timeout, TimeUnit unit)

從裝置擷取緩衝區,並設定逾時時間。

static String getHostFeatures()

從 ADB 主機查詢一組支援的功能。

static SocketChannel open(InetSocketAddress adbSockAddr, IDevice device, int devicePort)

從主機建立並連線至裝置上的通透插座和連接埠。

static SocketChannel rawAdbService(InetSocketAddress socketAddress, IDevice device, String command, AdbHelper.AdbService service)

在遠端裝置上叫用服務。

static SocketChannel rawExec(InetSocketAddress socketAddress, IDevice device, String executable, String[] parameters)

在遠端裝置上叫用 host:exec 服務。

static AdbHelper.AdbResponse readAdbResponse(SocketChannel chan, boolean readDiagString)

在指令執行後讀取 ADB 的回應。

static void reboot(String into, InetSocketAddress adbSockAddr, IDevice device)

重新啟動裝置。

static void removeForward(InetSocketAddress adbSockAddr, IDevice device, String localPortSpec)

移除本機通訊埠與遠端通訊埠之間的通訊埠轉送。

static void removeReverse(InetSocketAddress adbSockAddr, IDevice device, String remotePortSpec)

移除遠端通訊埠與本機通訊埠之間的通訊埠反向。

static void root(InetSocketAddress adbSockAddr, IDevice device)

要求 adb 精靈在裝置上成為根使用者。

static void setDevice(SocketChannel adbChan, IDevice device)

取得 IDevice 後,請擷取序號,並告知 adb 與該裝置通訊。

static void setDevice(SocketChannel adbChan, String deviceSerialNumber)

告訴 adb 與特定裝置通訊

static void write(SocketChannel chan, byte[] data, int length, int timeout)

寫入資料,直到寫入「資料」中的所有資料、達到選用長度、逾時或連線失敗為止。

static void write(SocketChannel chan, byte[] data)

寫入資料,直到「資料」中的所有資料都寫入完畢,或是連線失敗或逾時為止。

常數

HOST_TRANSPORT

public static final String HOST_TRANSPORT

常數值: "host:transport:"

欄位

DEFAULT_CHARSET

public static final Charset DEFAULT_CHARSET

公用方法

createForward

public static void createForward (InetSocketAddress adbSockAddr, 
                IDevice device, 
                String localPortSpec, 
                String remotePortSpec)

在本地和遠端通訊埠之間建立通訊埠轉送。

參數
adbSockAddr InetSocketAddress:要連線至 adb 的通訊端位址

device IDevice:要進行通訊埠轉送的裝置

localPortSpec String:要轉送的本機通訊埠規格,格式應為 tcp:

remotePortSpec String:要轉送的遠端通訊埠規格,可以是下列其中一種:tcp: localabstract: localreserved: localfilesystem: dev: jdwp: (僅限遠端)

擲回
TimeoutException 連線逾時時。
AdbCommandRejectedException 如果 adb 拒絕指令
如果連線發生 I/O 錯誤。

createHiddenException

public static AdbCommandRejectedException createHiddenException (String message, 
                boolean errorDuringDeviceSelection)

參數
message String

errorDuringDeviceSelection boolean

傳回
AdbCommandRejectedException

createHiddenException

public static AdbCommandRejectedException createHiddenException (String message)

參數
message String

傳回
AdbCommandRejectedException

createJdwpForwardRequest

public static byte[] createJdwpForwardRequest (int pid)

建立轉送至 jdwp 程序的連接埠轉送要求。這會傳回包含「####jwdp:{pid}」的陣列。

參數
pid int:裝置上的 jdwp 程序 PID。

傳回
byte[]

createPassThroughConnection

public static SocketChannel createPassThroughConnection (InetSocketAddress adbSockAddr, 
                String deviceSerialNumber, 
                int pid)

從主機到裝置上的通訊埠,建立並連線新的直通通訊端。

參數
deviceSerialNumber String:要連線的裝置序號。可以為空值或空白,在這種情況下,連線會連至第一個可用的裝置。

pid int:要連線的程序 PID。

傳回
SocketChannel

擲回
TimeoutException 連線逾時時。
AdbCommandRejectedException 如果 adb 拒絕指令
如果連線發生 I/O 錯誤。

createReverse

public static void createReverse (InetSocketAddress adbSockAddr, 
                IDevice device, 
                String remotePortSpec, 
                String localPortSpec)

在遠端和本機通訊埠之間建立通訊埠反向。

參數
adbSockAddr InetSocketAddress:要連線至 adb 的通訊端位址

device IDevice:要進行通訊埠反向作業的裝置

remotePortSpec String:要反向連線的遠端通訊埠規格,可以是下列其中一種:tcp: localabstract: localreserved: localfilesystem: dev: jdwp: (僅限遠端)

localPortSpec String:本機通訊埠規格,格式應為 tcp:

擲回
TimeoutException 連線逾時時。
AdbCommandRejectedException 如果 adb 拒絕指令
如果連線發生 I/O 錯誤。

executeRemoteCommand

public static void executeRemoteCommand (InetSocketAddress adbSockAddr, 
                String command, 
                IDevice device, 
                IShellOutputReceiver rcvr, 
                long maxTimeToOutputResponse, 
                TimeUnit maxTimeUnits)

在裝置上執行殼層指令並擷取輸出內容。我們會在rcvr上架後盡快提供給你。

參數
adbSockAddr InetSocketAddressERROR(/InetSocketAddress) 至 adb。

command String:要執行的殼層指令

device IDevice:要執行指令的 IDevice

rcvr IShellOutputReceiver:接收殼層指令輸出的 IShellOutputReceiver

maxTimeToOutputResponse long:指令輸出之間的時間上限。如果指令輸出之間經過的時間較長,這個方法會擲回 ShellCommandUnresponsiveException。如果值為 0,表示方法會無限期等待指令輸出內容,且絕不會擲回。

maxTimeUnits TimeUnit:非零 maxTimeToOutputResponse 值所用的單位。

擲回
TimeoutException 如果傳送指令時連線逾時。
AdbCommandRejectedException 如果 adb 拒絕指令
ShellCommandUnresponsiveException 如果殼層指令在超過 maxTimeToOutputResponse 的時間內未傳送任何輸出內容。
如果連線發生 I/O 錯誤。

另請參閱:

executeRemoteCommand

public static void executeRemoteCommand (InetSocketAddress adbSockAddr, 
                AdbHelper.AdbService adbService, 
                String command, 
                IDevice device, 
                IShellOutputReceiver rcvr, 
                long maxTimeout, 
                long maxTimeToOutputResponse, 
                TimeUnit maxTimeUnits, 
                InputStream is)

在裝置上執行遠端指令並擷取輸出內容。輸出內容會在rcvr抵達時交給他。這項指令是由 adbService 參數所識別的遠端服務執行。

參數
adbSockAddr InetSocketAddressERROR(/InetSocketAddress) 至 adb。

adbService AdbHelper.AdbService:用於執行指令的 AdbHelper.AdbService

command String:要執行的殼層指令

device IDevice:要執行指令的 IDevice

rcvr IShellOutputReceiver:接收殼層指令輸出的 IShellOutputReceiver

maxTimeout long:執行完整指令的逾時時間上限。值為 0 表示沒有逾時。

maxTimeToOutputResponse long:指令輸出之間的時間上限。如果指令輸出之間經過的時間較長,這個方法會擲回 ShellCommandUnresponsiveException。如果值為 0,表示方法會無限期等待指令輸出內容,且絕不會擲回。

maxTimeUnits TimeUnit:非零 maxTimeoutmaxTimeToOutputResponse 值的單位。

is InputStream:選用 ERROR(/InputStream),可在叫用指令後和擷取回應前串流。

擲回
TimeoutException 如果傳送指令時連線逾時。
AdbCommandRejectedException 如果 adb 拒絕指令
ShellCommandUnresponsiveException 如果殼層指令在超過 maxTimeToOutputResponse 的時間內未傳送任何輸出內容。
如果連線發生 I/O 錯誤。

另請參閱:

executeRemoteCommand

public static void executeRemoteCommand (InetSocketAddress adbSockAddr, 
                String command, 
                IDevice device, 
                IShellOutputReceiver rcvr, 
                long maxTimeout, 
                long maxTimeToOutputResponse, 
                TimeUnit maxTimeUnits)

在裝置上執行殼層指令並擷取輸出內容。我們會在rcvr上架後盡快提供給你。

參數
adbSockAddr InetSocketAddressERROR(/InetSocketAddress) 至 adb。

command String:要執行的殼層指令

device IDevice:要執行指令的 IDevice

rcvr IShellOutputReceiver:接收殼層指令輸出的 IShellOutputReceiver

maxTimeout long:指令傳回的時間上限。如果值為 0,表示不會套用逾時上限。

maxTimeToOutputResponse long:指令輸出之間的時間上限。如果指令輸出之間經過的時間較長,這個方法會擲回 ShellCommandUnresponsiveException。如果值為 0,表示方法會無限期等待指令輸出內容,且絕不會擲回。

maxTimeUnits TimeUnit:非零 maxTimeoutmaxTimeToOutputResponse 值的單位。

擲回
TimeoutException 如果傳送指令時連線逾時。
AdbCommandRejectedException 如果 adb 拒絕指令
ShellCommandUnresponsiveException 如果殼層指令在超過 maxTimeToOutputResponse 的時間內未傳送任何輸出內容。
如果連線發生 I/O 錯誤。

另請參閱:

formAdbRequest

public static byte[] formAdbRequest (String payloadString)

建立 ASCII 字串,前面加上四個十六進位數字。開頭的「####」是其餘字串的長度,以 ASCII 十六進位編碼 (大小寫不限)。

參數
payloadString String

傳回
byte[]

getFeatures

public static String getFeatures (IDevice device)

從裝置查詢一組支援的功能。

參數
device IDevice:要進行通訊埠轉送的裝置

傳回
String

擲回
TimeoutException 連線逾時時。
AdbCommandRejectedException 如果 adb 拒絕指令
如果連線發生 I/O 錯誤。

getFrameBuffer

public static RawImage getFrameBuffer (InetSocketAddress adbSockAddr, 
                IDevice device, 
                long timeout, 
                TimeUnit unit)

從裝置擷取緩衝區,並設定逾時時間。如果逾時值為 0,表示會永久等候。

參數
adbSockAddr InetSocketAddress

device IDevice

timeout long

unit TimeUnit

傳回
RawImage

擲回
TimeoutException 連線逾時時。
AdbCommandRejectedException 如果 adb 拒絕指令
如果連線發生 I/O 錯誤。

getHostFeatures

public static String getHostFeatures ()

從 ADB 主機查詢一組支援的功能。

傳回
String

擲回
TimeoutException 連線逾時時。
AdbCommandRejectedException 如果 adb 拒絕指令
如果連線發生 I/O 錯誤。

開啟

public static SocketChannel open (InetSocketAddress adbSockAddr, 
                IDevice device, 
                int devicePort)

建立並連線新的直通通訊端,從主機連線至裝置上的通訊埠。

參數
device IDevice:要連線的裝置。可以為空值,在這種情況下,連線會連至第一個可用裝置。

devicePort int:要開啟的通訊埠

傳回
SocketChannel

擲回
TimeoutException 連線逾時時。
如果連線發生 I/O 錯誤。
AdbCommandRejectedException 如果 adb 拒絕指令

rawAdbService

public static SocketChannel rawAdbService (InetSocketAddress socketAddress, 
                IDevice device, 
                String command, 
                AdbHelper.AdbService service)

在遠端裝置上叫用服務。傳回已連線至執行中程序的 Socket 管道。

ddlmib 會放棄傳回的 SocketChannel 所有權,且必須在用完後明確關閉。

參數
device IDevice:要連線的裝置。可以為空值,在這種情況下,連線會連至第一個可用裝置。

command String:要執行的指令

service AdbHelper.AdbService:用於執行指令的 AdbHelper.AdbService

傳回
SocketChannel

擲回
IOException
com.android.ddmlib.TimeoutException
com.android.ddmlib.AdbCommandRejectedException
AdbCommandRejectedException
TimeoutException

rawExec

public static SocketChannel rawExec (InetSocketAddress socketAddress, 
                IDevice device, 
                String executable, 
                String[] parameters)

在遠端裝置上叫用 host:exec 服務。傳回已連線至執行中程序的 Socket 管道。請注意,exec 服務不會區分 stdout 和 stderr,因此從通訊端讀取的任何內容都可能來自任一輸出,且可能會交錯。

ddlmib 會放棄傳回的 SocketChannel 所有權,且必須在用完後明確關閉。

參數
device IDevice:要連線的裝置。可以為空值,在這種情況下,連線會連至第一個可用裝置。

executable String:要執行的可執行檔絕對路徑

parameters String:執行可執行檔時提供的參數

傳回
SocketChannel

擲回
IOException
com.android.ddmlib.TimeoutException
com.android.ddmlib.AdbCommandRejectedException
AdbCommandRejectedException
TimeoutException

readAdbResponse

public static AdbHelper.AdbResponse readAdbResponse (SocketChannel chan, 
                boolean readDiagString)

讀取指令後來自 Android 偵錯橋接器的回應。

參數
chan SocketChannel:連線至 ADB 的通訊端管道。

readDiagString boolean:如果為 true,我們預期 OKAY 回應後會接續診斷字串。否則,我們只會預期診斷字串會接在 FAIL 後面。

傳回
AdbHelper.AdbResponse

擲回
TimeoutException 連線逾時時。
如果連線發生 I/O 錯誤。

重開。

public static void reboot (String into, 
                InetSocketAddress adbSockAddr, 
                IDevice device)

重新啟動裝置。

參數
into String:要重新啟動進入的模式 (復原、開機載入程式)。或空值,僅重新啟動。

adbSockAddr InetSocketAddress

device IDevice

擲回
TimeoutException 連線逾時時。
AdbCommandRejectedException 如果 adb 拒絕指令
如果連線發生 I/O 錯誤。

removeForward

public static void removeForward (InetSocketAddress adbSockAddr, 
                IDevice device, 
                String localPortSpec)

移除本機通訊埠與遠端通訊埠之間的通訊埠轉送。

參數
adbSockAddr InetSocketAddress:要連線至 adb 的通訊端位址

device IDevice:要移除通訊埠轉送的裝置

localPortSpec String:轉送的本機通訊埠規格,格式應為 tcp:

擲回
TimeoutException 連線逾時時。
AdbCommandRejectedException 如果 adb 拒絕指令
如果連線發生 I/O 錯誤。

removeReverse

public static void removeReverse (InetSocketAddress adbSockAddr, 
                IDevice device, 
                String remotePortSpec)

移除遠端通訊埠與本機通訊埠之間的通訊埠反向。

參數
adbSockAddr InetSocketAddress:要連線至 adb 的通訊端位址

device IDevice:要移除通訊埠反向的裝置

remotePortSpec String:反向指定遠端通訊埠,可以是下列其中一種:tcp: localabstract: localreserved: localfilesystem: dev: jdwp: (僅限遠端)

擲回
TimeoutException 連線逾時時。
AdbCommandRejectedException 如果 adb 拒絕指令
如果連線發生 I/O 錯誤。

public static void root (InetSocketAddress adbSockAddr, 
                IDevice device)

要求 adb 精靈在裝置上成為根使用者。這項作業可能會無聲無息地失敗,而且只能在開發人員建構版本中成功。詳情請參閱「adb root」。如要確認是否成功,可以檢查「echo \$USER_ID」的 executeRemoteCommand 結果,如果結果為 0,表示 adbd 以根身分執行。

參數
adbSockAddr InetSocketAddress

device IDevice

擲回
TimeoutException 連線逾時時。
AdbCommandRejectedException 如果 adb 拒絕指令
如果連線發生 I/O 錯誤。

setDevice

public static void setDevice (SocketChannel adbChan, 
                IDevice device)

假設 IDevice 抓取序號,並告知 adb 與該裝置通訊。

參數
adbChan SocketChannel:與 ADB 的通訊端連線。

device IDevice:要與之對話的裝置。

擲回
TimeoutException 連線逾時時。
AdbCommandRejectedException 如果 adb 拒絕指令
如果連線發生 I/O 錯誤。

setDevice

public static void setDevice (SocketChannel adbChan, 
                String deviceSerialNumber)

告訴 adb 與特定裝置通訊

參數
adbChan SocketChannel:與 adb 的通訊端連線

deviceSerialNumber String:要通訊的裝置序號,如果為空值,則預設選取的裝置是 adb 選取的裝置。

擲回
TimeoutException 連線逾時時。
AdbCommandRejectedException 如果 adb 拒絕指令
如果連線發生 I/O 錯誤。

寫出好文

public static void write (SocketChannel chan, 
                byte[] data, 
                int length, 
                int timeout)

寫入作業會持續進行,直到「資料」中的所有資料都寫入完畢、達到選用長度、逾時或連線失敗為止。如果所有資料都已寫入,則傳回「true」。

參數
chan SocketChannel:要寫入的已開啟通訊端。

data byte:要傳送的緩衝區。

length int:要寫入的長度,或 -1 (傳送整個緩衝區)。

timeout int:逾時值。如果逾時時間為零,表示「永久等候」。

擲回
TimeoutException 連線逾時時。
如果連線發生 I/O 錯誤。

寫出好文

public static void write (SocketChannel chan, 
                byte[] data)

寫入資料,直到「資料」中的所有資料都寫入完畢,或是連線失敗或逾時為止。

這會使用預設逾時值。

參數
chan SocketChannel:要寫入的已開啟通訊端。

data byte:要傳送的緩衝區。

擲回
TimeoutException 連線逾時時。
如果連線發生 I/O 錯誤。