ClientImpl

public class ClientImpl
extends JdwpAgent implements Client

java.lang.Object
com.android.tradefed.device.server.jdwp.JdwpAgent
com.android.tradefed.device.server.ClientImpl


Это представляет собой одного клиента, обычно процесс Dalvik VM.

Этот класс предоставляет доступ к базовой информации о клиенте, а также к методам выполнения действий на клиенте.

Более подробную информацию, обычно обновляемую в режиме реального времени, можно получить через класс ClientData . Каждый объект Client имеет собственный ClientData доступ к которому осуществляется через getClientData() .

Краткое содержание

Публичные конструкторы

ClientImpl ( DeviceImpl device, SocketChannel chan, int pid)

Создайте объект для нового клиентского соединения.

Публичные методы

void captureView (String viewRoot, String view, DebugViewDumpHandler handler)
void close (boolean notify)

Закройте канал клиентского сокета.

boolean ddmSeen ()

MonitorThread вызывает этот метод, когда видит запрос или ответ DDM.

void dumpDisplayList (String viewRoot, String view)
void dumpViewHierarchy (String viewRoot, boolean skipChildren, boolean includeProperties, boolean useV2, DebugViewDumpHandler handler)
void enableAllocationTracker (boolean enable)

Включает или выключает средство отслеживания распределения для этого клиента.

void executeGarbageCollector ()

Заставляет клиента запустить свой сборщик мусора.

ClientData getClientData ()

Возвращает объект ClientData , содержащий информацию о клиенте.

int getDebuggerListenPort ()

Возвращает порт отладчика для этого клиента.

IDevice getDevice ()

Возвращает IDevice , на котором работает этот клиент.

DeviceImpl getDeviceImpl ()

Возвращает DeviceImpl на котором работает этот клиент.

JdwpPacket getJdwpPacket ()

Возвращает информацию о первом полном пакете JDWP в буфере.

void initializeHeapUpdateStatus ()
boolean isDdmAware ()

Возвращает true если клиентская виртуальная машина поддерживает DDM.

boolean isDebuggerAttached ()

Возвращает true если отладчик в данный момент подключен к клиенту.

boolean isHeapUpdateEnabled ()

Возвращает информацию о том, включено ли обновление кучи.

boolean isThreadUpdateEnabled ()

Возвращает, включено ли обновление потока.

boolean isValid ()

Возвращает, имеет ли данный ClientImpl допустимое соединение с виртуальной машиной приложения.

void kill ()

Отправляет сообщение об уничтожении виртуальной машины.

void listViewRoots ( DebugViewDumpHandler replyHandler)
void notifyVmMirrorExited ()

Зеркала отладчика виртуальных машин могут выходить за пределы DDMLib, что приводит к различным состояниям гонки или постоянной потере Client .

void packetFailed ( JdwpPacket reply)

Предыдущий запрос завершился неудачей.

void read ()

Чтение данных из нашего канала должно осуществляться только из одного потока.

void register (Selector sel)

Регистрирует клиента с помощью селектора, должен вызываться сразу после создания клиента.

void requestAllocationDetails ()

Отправляет запрос виртуальной машине на отправку информации обо всех выделениях, которые произошли с момента вызова enableAllocationTracker(boolean) со значением enable , равным null .

void requestAllocationStatus ()

Отправляет запрос виртуальной машине на отправку статуса включения отслеживания распределения.

void requestMethodProfilingStatus ()

Отправляет запрос виртуальной машине на отправку статуса включения метода профилирования.

boolean requestNativeHeapInformation ()

Отправляет запрос на обновление собственной кучи.

void requestThreadStackTrace (int threadId)

Отправляет запрос на обновление трассировки стека потока.

void requestThreadUpdate ()

Отправляет запрос на обновление потока.

void setHeapInfoUpdateEnabled (boolean enabled)
void setHeapSegmentUpdateEnabled (boolean enabled)
void setHeapUpdateEnabled (boolean enabled)

Включает или отключает обновление кучи.

void setThreadUpdateEnabled (boolean enabled)

Включает или выключает обновление потока.

void startMethodTracer ()
boolean startOpenGlTracing ()
void startSamplingProfiler (int samplingInterval, TimeUnit timeUnit)
void stopMethodTracer ()
boolean stopOpenGlTracing ()
void stopSamplingProfiler ()
String toString ()

Возвращает строковое представление объекта ClientImpl .

void toggleMethodProfiling ()

Этот метод устарел. Вместо него используйте startMethodTracer() , stopMethodTracer() , startSamplingProfiler(int, TimeUnit) или stopSamplingProfiler() .

void update (int changeMask)
void updateHeapInfo ()

Запускает одно обновление кучи.

Защищенные методы

void send ( JdwpPacket packet)

Отправьте DDM-пакет клиенту.

Публичные конструкторы

ClientImpl

public ClientImpl (DeviceImpl device, 
                SocketChannel chan, 
                int pid)

Создайте объект для нового клиентского соединения.

Параметры
device DeviceImpl : устройство, к которому принадлежит этот клиент

chan SocketChannel : ERROR(/SocketChannel) .

pid int : клиентский pid.

Публичные методы

captureView

public void captureView (String viewRoot, 
                String view, 
                DebugViewDumpHandler handler)

Параметры
viewRoot String

view String

handler DebugViewDumpHandler

закрывать

public void close (boolean notify)

Закройте канал клиентского сокета. Если с нами связан отладчик, закройте и его.

Закрытие канала автоматически отменяет его регистрацию в селекторе. Однако нам необходимо пройти цикл селектора, прежде чем он фактически освободит их и позволит закрыть файловые дескрипторы. Ожидается, что вызывающий код сделает это сам.

Параметры
notify boolean : уведомлять ли слушателей об изменении.

ddmSeen

public boolean ddmSeen ()

MonitorThread вызывает этот метод, когда получает запрос или ответ DDM. Если пакет DDM ещё не был получен, мы переводим состояние в состояние ST_READY и возвращаем «false». В противном случае просто возвращаем «true».

Идея состоит в том, чтобы сообщить MonitorThread о первом появлении DDM-пакета, чтобы мы могли отправить широковещательное сообщение обработчикам при установлении клиентского соединения. Этот метод синхронизирован, поэтому широковещательное сообщение отправляется только один раз.

Возврат
boolean

dumpDisplayList

public void dumpDisplayList (String viewRoot, 
                String view)

Параметры
viewRoot String

view String

dumpViewHierarchy

public void dumpViewHierarchy (String viewRoot, 
                boolean skipChildren, 
                boolean includeProperties, 
                boolean useV2, 
                DebugViewDumpHandler handler)

Параметры
viewRoot String

skipChildren boolean

includeProperties boolean

useV2 boolean

handler DebugViewDumpHandler

enableAllocationTracker

public void enableAllocationTracker (boolean enable)

Включает или выключает средство отслеживания распределения для этого клиента.

Если эта функция включена, виртуальная машина начнёт отслеживать информацию о выделении памяти. Вызов requestAllocationDetails() заставит виртуальную машину отправить информацию обо всех выделениях, произошедших между включением и запросом.

Параметры
enable boolean

выполнитьGarbageCollector

public void executeGarbageCollector ()

Заставляет клиента запустить свой сборщик мусора.

получитьКлиентскиеДанные

public ClientData getClientData ()

Возвращает объект ClientData , содержащий информацию о клиенте.

Возврат
ClientData

getDebuggerListenPort

public int getDebuggerListenPort ()

Возвращает порт отладчика для этого клиента.

Возврат
int

получить устройство

public IDevice getDevice ()

Возвращает IDevice , на котором работает этот клиент.

Возврат
IDevice

getDeviceImpl

public DeviceImpl getDeviceImpl ()

Возвращает DeviceImpl на котором работает этот клиент.

Возврат
DeviceImpl

getJdwpPacket

public JdwpPacket getJdwpPacket ()

Возвращает информацию о первом полном пакете JDWP в буфере.

Если у нас еще нет полного пакета, возвращаем null.

Если мы ещё не получили рукопожатие JDWP, мы отслеживаем его здесь и принимаем, не признавая этого. После получения мы отправляем сообщение «HELO», поэтому может возникнуть исключение IOException.

Обратите внимание на порядок операций по установлению соединения:

На стороне хоста: 1) adb track-jdwp 2) Получить обновленный список PID, содержащих процесс приложения. 3) Открыть/перенаправить порт отладчика и подключиться к устройству. 4) Выполнить рукопожатие. 5) Отправить HELO и дождаться ответа.

Сторона устройства/процесса: а) Создать зиготу и обновить ADB с помощью PID. б) Отправить APNM, если подключен порт отладчика («<pre-initialize>»). в) Привязать процесс к фактическому приложению и пакету. г) Отправить обновлённый APNM, если подключен порт отладчика.

Две указанные выше последовательности выполнения выполняются полностью параллельно, с единственным ограничением: а) происходит раньше 2).

Возврат
JdwpPacket

initializeHeapUpdateStatus

public void initializeHeapUpdateStatus ()

isDdmAware

public boolean isDdmAware ()

Возвращает true если клиентская виртуальная машина поддерживает DDM.

Звонок сюда разрешен только после установления соединения.

Возврат
boolean

isDebuggerAttached

public boolean isDebuggerAttached ()

Возвращает true если отладчик в данный момент подключен к клиенту.

Возврат
boolean

isHeapUpdateEnabled

public boolean isHeapUpdateEnabled ()

Возвращает информацию о том, включено ли обновление кучи.

Возврат
boolean

Смотрите также:

isThreadUpdateEnabled

public boolean isThreadUpdateEnabled ()

Возвращает, включено ли обновление потока.

Возврат
boolean

isValid

public boolean isValid ()

Возвращает, имеет ли данный ClientImpl допустимое соединение с виртуальной машиной приложения.

Возврат
boolean

убийство

public void kill ()

Отправляет сообщение об уничтожении виртуальной машины. Это не обязательно сработает, если виртуальная машина находится в аварийном состоянии.

listViewRoots

public void listViewRoots (DebugViewDumpHandler replyHandler)

Параметры
replyHandler DebugViewDumpHandler

notifyVmMirrorExited

public void notifyVmMirrorExited ()

Зеркала виртуальных машин отладчика могут выходить из-за DDMLib, что приводит к различным состояниям гонки или постоянной потере Client . Необходимо уведомить DDMLib о том, что текущий подключенный отладчик завершает работу и разрывает соединение с зеркалом виртуальной машины.

packetFailed

public void packetFailed (JdwpPacket reply)

Предыдущий запрос завершился сбоем. Это ожидаемый ответ на сообщение HELO при обращении к клиенту, не использующему DDM.

Параметры
reply JdwpPacket

читать

public void read ()

Чтение данных из нашего канала должно осуществляться только из одного потока.

Эта функция вызывается, когда известно, что данные доступны, но в буфере ещё нет полного пакета. Если буфер заполнен, его необходимо расширить.

регистр

public void register (Selector sel)

Регистрирует клиента с помощью селектора, должен вызываться сразу после создания клиента.

Параметры
sel Selector

requestAllocationDetails

public void requestAllocationDetails ()

Отправляет запрос виртуальной машине на получение информации обо всех выделениях памяти, произошедших с момента вызова enableAllocationTracker(boolean) со значением enable , равным null . Этот процесс выполняется асинхронно.

Информацию о выделении ресурсов можно получить с помощью ClientData.getAllocations() . Уведомление о доступности новых данных будет получено через AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) с changeMask содержащим маску Client.CHANGE_HEAP_ALLOCATIONS .

requestAllocationStatus

public void requestAllocationStatus ()

Отправляет запрос виртуальной машине на отправку статуса включения отслеживания распределения. Это происходит асинхронно.

Статус распределения можно получить с помощью ClientData.getAllocationStatus() . Уведомление о доступности нового статуса будет получено через AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) с changeMask содержащим маску Client.CHANGE_HEAP_ALLOCATION_STATUS .

requestMethodProfilingStatus

public void requestMethodProfilingStatus ()

Отправляет запрос виртуальной машине на отправку статуса включения метода профилирования. Выполняется асинхронно.

Статус распределения можно получить с помощью ClientData.getAllocationStatus() . Уведомление о доступности нового статуса будет получено через AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) с changeMask содержащим маску Client.CHANGE_HEAP_ALLOCATION_STATUS .

requestNativeHeapInformation

public boolean requestNativeHeapInformation ()

Отправляет запрос на обновление собственной кучи. Это асинхронно.

Доступ к информации о собственной куче можно получить с помощью ClientData.getNativeAllocationList() . Уведомление о доступности новых данных будет получено через AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) с changeMask содержащим маску Client.CHANGE_NATIVE_HEAP_DATA .

Возврат
boolean

requestThreadStackTrace

public void requestThreadStackTrace (int threadId)

Отправляет запрос на обновление трассировки стека потока. Это происходит асинхронно.

Доступ к информации о потоке можно получить с помощью ClientData.getThreads() и ThreadInfo.getStackTrace() .

Уведомление о доступности новых данных будет получено через AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) с changeMask содержащим маску Client.CHANGE_THREAD_STACKTRACE .

Параметры
threadId int

requestThreadUpdate

public void requestThreadUpdate ()

Отправляет запрос на обновление потока. Это происходит асинхронно.

Доступ к информации о потоке можно получить с помощью ClientData.getThreads() . Уведомление о доступности новых данных будет получено через AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) с changeMask содержащим маску Client.CHANGE_THREAD_DATA .

setHeapInfoUpdateEnabled

public void setHeapInfoUpdateEnabled (boolean enabled)

Параметры
enabled boolean

setHeapSegmentUpdateEnabled

public void setHeapSegmentUpdateEnabled (boolean enabled)

Параметры
enabled boolean

setHeapUpdateEnabled

public void setHeapUpdateEnabled (boolean enabled)

Включает или отключает обновление кучи.

Если true , любой сборщик мусора заставит клиента отправить информацию о своей куче.

Доступ к информации о куче можно получить с помощью ClientData.getVmHeapData() .

Уведомление о доступности новых данных будет получено через AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int) с changeMask содержащим значение Client.CHANGE_HEAP_DATA .

Параметры
enabled boolean : флаг включения

setThreadUpdateEnabled

public void setThreadUpdateEnabled (boolean enabled)

Включает или выключает обновление потока.

Если true виртуальная машина сможет отправлять информацию о потоке. Информацию о потоке необходимо запрашивать с помощью requestThreadUpdate() .

Параметры
enabled boolean : флаг включения.

startMethodTracer

public void startMethodTracer ()

startOpenGlTracing

public boolean startOpenGlTracing ()

Возврат
boolean

startSamplingProfiler

public void startSamplingProfiler (int samplingInterval, 
                TimeUnit timeUnit)

Параметры
samplingInterval int

timeUnit TimeUnit

stopMethodTracer

public void stopMethodTracer ()

stopOpenGlTracing

public boolean stopOpenGlTracing ()

Возврат
boolean

stopSamplingProfiler

public void stopSamplingProfiler ()

toString

public String toString ()

Возвращает строковое представление объекта ClientImpl .

Возврат
String

toggleMethodProfiling

public void toggleMethodProfiling ()

Этот метод устарел.
Вместо этого используйте startMethodTracer() , stopMethodTracer() , startSamplingProfiler(int, TimeUnit) или stopSamplingProfiler() .

Переключает состояние профилирования метода.

обновлять

public void update (int changeMask)

Параметры
changeMask int

updateHeapInfo

public void updateHeapInfo ()

Запускает одно обновление кучи.

Защищенные методы

отправлять

protected void send (JdwpPacket packet)

Отправьте DDM-пакет клиенту.

В идеале это можно сделать с помощью записи в один канал. Если этого не происходит, нам придётся запретить кому-либо ещё записывать данные в этот канал до завершения пакета, поэтому мы синхронизируемся на этом канале.

Другая цель — избежать ненужных копий буфера, поэтому мы записываем данные непосредственно из ByteBuffer JdwpPacket.

Параметры
packet JdwpPacket