JdwpPacket

public final class JdwpPacket
extends Object

java.lang.Object
   ↳ com.android.tradefed.device.server.jdwp.chunkhandler.JdwpPacket


JDWP 封包,位於某處 ByteBuffer 的開頭。

這樣我們就能使用封包解碼結果,將「指標」包裝至資料中。

這裡的任何作業都不會同步處理。如果多個執行緒會存取相同的 ByteBuffer,則需要外部同步處理。

使用建構函式建立空白封包,或使用「findPacket()」將 JdwpPacket 包裝在現有資料周圍。

摘要

常數

int JDWP_HEADER_LEN

公用建構函式

JdwpPacket(ByteBuffer buf)

在「buf」中建立新的空白封包。

公用方法

void consume()

使用 JDWP 封包。

void copy(ByteBuffer into)

輔助函式,可將封包複製到新緩衝區。

static JdwpPacket findPacket(ByteBuffer buf)
static JdwpPacket findPacketHeader(ByteBuffer buf)
void finishPacket(int cmdSet, int cmd, int payloadLength)

完成使用 newPacket() 建立的封包。

int getId()

傳回封包的 ID。

int getLength()

Return the length of a packet.

static int getPacketLength(ByteBuffer buf)

當「buf」包含 JdwpPackets 時,前 4 個位元組是封包的長度。

ByteBuffer getPayload()

傳回位元組緩衝區的切片,位置在 JDWP 標頭之後,位於區塊標頭的開頭。

boolean is(int cmdSet, int cmd)
boolean isEmpty()

如果這個 JDWP 封包沒有資料,則傳回「true」。

boolean isError()

如果這個 JDWP 封包是回覆,且錯誤代碼不為零,則傳回「true」。

boolean isReply()

如果這個 JDWP 封包標記為回覆,則傳回「true」。

void log(String action)
void move(ByteBuffer buf)

「移動」封包資料,從我們所在的緩衝區移至目前位置的 buf。

void setPayload(ByteBuffer buf)

將封包的酬載替換為緩衝區。

String toString()
void write(SocketChannel chan)

將封包寫入「chan」。

常數

JDWP_HEADER_LEN

public static final int JDWP_HEADER_LEN

常數值: 11 (0x0000000b)

公用建構函式

JdwpPacket

public JdwpPacket (ByteBuffer buf)

在「buf」中建立新的空白封包。

參數
buf ByteBuffer

公用方法

消耗

public void consume ()

使用 JDWP 封包。

在進入和退出時,「位置」位於緩衝區資料的結尾。

取得副本

public void copy (ByteBuffer into)

將封包複製到新緩衝區的輔助函式。

參數
into ByteBuffer

findPacket

public static JdwpPacket findPacket (ByteBuffer buf)

參數
buf ByteBuffer

傳回
JdwpPacket

findPacketHeader

public static JdwpPacket findPacketHeader (ByteBuffer buf)

參數
buf ByteBuffer

傳回
JdwpPacket

finishPacket

public void finishPacket (int cmdSet, 
                int cmd, 
                int payloadLength)

完成使用 newPacket() 建立的封包。

這項作業一律會建立指令封包,並使用序列中的下一個序號。

我們必須將「payloadLength」做為引數,因為我們無法在 getPayload() 傳回的「slice」中查看位置。我們可以從區塊標頭中找出位置,但 JDWP 封包中可能有多個區塊。

結束時,「position」會指向資料結尾。

參數
cmdSet int

cmd int

payloadLength int

getId

public int getId ()

傳回封包的 ID。如果是回覆封包,這可讓我們將回覆與原始要求相符。

傳回
int

getLength

public int getLength ()

傳回封包長度。包括標頭,因此空封包長度為 11 個位元組。

傳回
int

getPacketLength

public static int getPacketLength (ByteBuffer buf)

如果「buf」包含 JdwpPacket,前 4 個位元組就是封包的長度。這個輔助函式會讀取前 4 個位元組,並驗證長度是否至少為 JDWP 標頭的大小。

參數
buf ByteBuffer:假設包含 jdwp 封包的緩衝區。

傳回
int 如果長度無效,則為 -1,否則為封包長度。

getPayload

public ByteBuffer getPayload ()

傳回位元組緩衝區的切片,位置在 JDWP 標頭之後,也就是區塊標頭的開頭。如果大小已知,緩衝區的限制會設為酬載大小;如果這是正在建構的封包,限制會設為緩衝區結尾。

完全不會檢查封包,而是處理空白緩衝區。

傳回
ByteBuffer

is

public boolean is (int cmdSet, 
                int cmd)

參數
cmdSet int

cmd int

傳回
boolean

isEmpty

public boolean isEmpty ()

如果這個 JDWP 封包沒有資料,則傳回「true」。

傳回
boolean

isError

public boolean isError ()

如果這個 JDWP 封包是回覆,且錯誤代碼不為零,則傳回「true」。

傳回
boolean

isReply

public boolean isReply ()

如果這個 JDWP 封包標記為回覆,則傳回「true」。

傳回
boolean

log

public void log (String action)

參數
action String

移動

public void move (ByteBuffer buf)

將封包資料「移出」我們所在的緩衝區,並移至目前位置的 buf。

參數
buf ByteBuffer

setPayload

public void setPayload (ByteBuffer buf)

將封包的酬載替換為緩衝區。目前位置不會變更。

參數
buf ByteBuffer

toString

public String toString ()

傳回
String

寫出好文

public void write (SocketChannel chan)

Write our packet to "chan".

JDWP 封包從位移 0 開始,並在 mBuffer.position() 結束。

參數
chan SocketChannel