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 |
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 |