JdwpPacket

public final class JdwpPacket
extends Object

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


位于某个 ByteBuffer 开头的 JDWP 数据包。

这样一来,我们便可使用数据包的解码结果来封装指向数据的“指针”。

此处的任何操作都不会同步。如果多个线程将访问同一 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()

返回数据包的长度。

static int getPacketLength(ByteBuffer buf)

如果“buf”包含 JdwpPacket,则前 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

公共方法

consume

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 数据包中可以包含多个块。

退出时,“位置”指向数据的末尾。

参数
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)

将数据包写入“chan”。

JDWP 数据包从偏移量 0 开始,到 mBuffer.position() 结束。

参数
chan SocketChannel