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 객체에는 getClientData()를 통해 액세스되는 자체 ClientData가 있습니다.

요약

공개 생성자

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

클라이언트 VM이 DDM을 인식하는 경우 true를 반환합니다.

boolean isDebuggerAttached()

디버거가 현재 클라이언트에 연결되어 있으면 true를 반환합니다.

boolean isHeapUpdateEnabled()

힙 업데이트가 사용 설정되었는지 여부를 반환합니다.

boolean isThreadUpdateEnabled()

스레드 업데이트가 사용 설정되었는지 여부를 반환합니다.

boolean isValid()

ClientImpl이 애플리케이션 VM에 대한 유효한 연결을 가지고 있는지 여부를 반환합니다.

void kill()

VM에 종료 메시지를 전송합니다.

void listViewRoots(DebugViewDumpHandler replyHandler)
void notifyVmMirrorExited()

디버거 VM 미러가 DDMLib 뒤에서 종료되어 다양한 경합 또는 영구 Client 손실 조건이 발생할 수 있습니다.

void packetFailed(JdwpPacket reply)

이전 요청이 실패했습니다.

void read()

채널에서 데이터를 읽습니다. 하나의 스레드에서만 호출해야 합니다.

void register(Selector sel)

선택기로 클라이언트를 등록합니다. 클라이언트 생성 직후에 호출해야 합니다.

void requestAllocationDetails()

enablenull로 설정된 enableAllocationTracker(boolean) 호출 이후 발생한 모든 할당에 관한 정보를 전송하도록 VM에 요청을 보냅니다.

void requestAllocationStatus()

할당 추적의 사용 설정 상태를 전송하도록 VM에 요청을 전송합니다.

void requestMethodProfilingStatus()

메서드 프로파일링의 사용 설정 상태를 전송하도록 VM에 요청을 전송합니다.

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)

클라이언트 소켓 채널을 닫습니다. Google과 연결된 디버거가 있으면 디버거도 닫습니다.

채널을 닫으면 선택기에서 자동으로 등록이 취소됩니다. 하지만 실제로 이동하고 파일 설명자가 닫히도록 허용하기 전에 선택기 루프를 반복해야 합니다. 호출자가 이를 관리해야 합니다.

매개변수
notify boolean: 리스너에게 변경사항을 알릴지 여부입니다.

ddmSeen

public boolean ddmSeen ()

MonitorThread는 DDM 요청이나 응답을 확인하면 이를 호출합니다. 이전에 DDM 패킷을 본 적이 없다면 상태를 ST_READY로 진행하고 'false'를 반환합니다. 그렇지 않으면 true를 반환합니다.

이 아이디어는 모니터링 스레드가 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)

이 클라이언트의 할당 추적기를 사용 설정하거나 사용 중지합니다.

사용 설정하면 VM이 할당 정보를 추적하기 시작합니다. requestAllocationDetails() 호출은 VM이 사용 설정과 요청 사이에 발생한 모든 할당에 관한 정보를 전송하도록 합니다.

매개변수
enable boolean

executeGarbageCollector

public void executeGarbageCollector ()

클라이언트가 가비지 컬렉터를 실행하도록 강제합니다.

getClientData

public ClientData getClientData ()

이 클라이언트 정보가 포함된 ClientData 객체를 반환합니다.

반환 값
ClientData

getDebuggerListenPort

public int getDebuggerListenPort ()

이 클라이언트의 디버거 포트를 반환합니다.

반환 값
int

getDevice

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를 보내고 응답을 기다립니다.

기기/프로세스 측면: a) zygote를 포크하고 PID로 ADB를 업데이트합니다. b) 디버거 포트가 연결된 경우 APNM을 전송합니다 ('<pre-initialize>'). c) 실제 애플리케이션 및 패키지에 프로세스를 바인딩합니다. d) 디버거 포트가 연결된 경우 업데이트된 APNM을 전송합니다.

위의 두 실행 시퀀스는 완전히 병렬로 실행되며, 유일한 제약 조건은 a)가 2) 전에 발생한다는 것입니다.

반환 값
JdwpPacket

initializeHeapUpdateStatus

public void initializeHeapUpdateStatus ()

isDdmAware

public boolean isDdmAware ()

클라이언트 VM이 DDM을 인식하는 경우 true를 반환합니다.

여기에서의 호출은 연결이 설정된 후에만 허용됩니다.

반환 값
boolean

isDebuggerAttached

public boolean isDebuggerAttached ()

디버거가 현재 클라이언트에 연결되어 있으면 true를 반환합니다.

반환 값
boolean

isHeapUpdateEnabled

public boolean isHeapUpdateEnabled ()

힙 업데이트가 사용 설정되었는지 여부를 반환합니다.

반환 값
boolean

isThreadUpdateEnabled

public boolean isThreadUpdateEnabled ()

스레드 업데이트가 사용 설정되었는지 여부를 반환합니다.

반환 값
boolean

isValid

public boolean isValid ()

ClientImpl이 애플리케이션 VM에 대한 유효한 연결을 가지고 있는지 여부를 반환합니다.

반환 값
boolean

kill

public void kill ()

VM에 종료 메시지를 전송합니다. VM이 비정상 종료된 상태인 경우 반드시 작동하지는 않습니다.

listViewRoots

public void listViewRoots (DebugViewDumpHandler replyHandler)

매개변수
replyHandler DebugViewDumpHandler

notifyVmMirrorExited

public void notifyVmMirrorExited ()

디버거 VM 미러가 DDMLib 뒤에서 종료되어 다양한 경합 또는 영구 Client 손실 조건이 발생할 수 있습니다. 현재 연결된 디버거가 종료되고 VM 미러 연결이 종료된다는 것을 DDMLib에 알려야 합니다.

packetFailed

public void packetFailed (JdwpPacket reply)

이전 요청이 실패했습니다. DDM이 아닌 클라이언트와 통신할 때 HELO 메시지에 대한 예상 응답입니다.

매개변수
reply JdwpPacket

읽기

public void read ()

채널에서 데이터를 읽습니다. 하나의 스레드에서만 호출해야 합니다.

데이터를 사용할 수 있는 것으로 알려져 있고 아직 버퍼에 전체 패킷이 없는 경우 호출됩니다. 버퍼가 가득 찼다면 확장합니다.

register

public void register (Selector sel)

선택기로 클라이언트를 등록합니다. 클라이언트 생성 직후에 호출해야 합니다.

매개변수
sel Selector

requestAllocationDetails

public void requestAllocationDetails ()

enablenull로 설정된 enableAllocationTracker(boolean) 호출 이후 발생한 모든 할당에 관한 정보를 전송하도록 VM에 요청을 보냅니다. 비동기식입니다.

할당 정보는 ClientData.getAllocations()에서 액세스할 수 있습니다. 새 데이터를 사용할 수 있다는 알림은 마스크 Client.CHANGE_HEAP_ALLOCATIONS가 포함된 changeMask와 함께 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int)를 통해 수신됩니다.

requestAllocationStatus

public void requestAllocationStatus ()

할당 추적의 사용 설정 상태를 전송하도록 VM에 요청을 전송합니다. 이는 비동기식입니다.

할당 상태는 ClientData.getAllocationStatus()로 액세스할 수 있습니다. 새 상태를 사용할 수 있다는 알림은 마스크 Client.CHANGE_HEAP_ALLOCATION_STATUS가 포함된 changeMask와 함께 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int)를 통해 수신됩니다.

requestMethodProfilingStatus

public void requestMethodProfilingStatus ()

메서드 프로파일링의 사용 설정 상태를 전송하도록 VM에 요청을 전송합니다. 이는 비동기식입니다.

할당 상태는 ClientData.getAllocationStatus()로 액세스할 수 있습니다. 새 상태를 사용할 수 있다는 알림은 마스크 Client.CHANGE_HEAP_ALLOCATION_STATUS가 포함된 changeMask와 함께 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int)를 통해 수신됩니다.

requestNativeHeapInformation

public boolean requestNativeHeapInformation ()

네이티브 힙 업데이트 요청을 전송합니다. 비동기식입니다.

네이티브 힙 정보는 ClientData.getNativeAllocationList()로 액세스할 수 있습니다. 새 데이터를 사용할 수 있다는 알림은 마스크 Client.CHANGE_NATIVE_HEAP_DATA가 포함된 changeMask와 함께 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int)를 통해 수신됩니다.

반환 값
boolean

requestThreadStackTrace

public void requestThreadStackTrace (int threadId)

스레드 스택 트레이스 업데이트 요청을 전송합니다. 비동기식입니다.

스레드 정보는 ClientData.getThreads()ThreadInfo.getStackTrace()에서 액세스할 수 있습니다.

새 데이터를 사용할 수 있다는 알림은 마스크 Client.CHANGE_THREAD_STACKTRACE가 포함된 changeMask와 함께 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int)를 통해 수신됩니다.

매개변수
threadId int

requestThreadUpdate

public void requestThreadUpdate ()

스레드 업데이트 요청을 전송합니다. 비동기식입니다.

스레드 정보는 ClientData.getThreads()로 액세스할 수 있습니다. 새 데이터를 사용할 수 있다는 알림은 마스크 Client.CHANGE_THREAD_DATA가 포함된 changeMask와 함께 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int)를 통해 수신됩니다.

setHeapInfoUpdateEnabled

public void setHeapInfoUpdateEnabled (boolean enabled)

매개변수
enabled boolean

setHeapSegmentUpdateEnabled

public void setHeapSegmentUpdateEnabled (boolean enabled)

매개변수
enabled boolean

setHeapUpdateEnabled

public void setHeapUpdateEnabled (boolean enabled)

힙 업데이트를 사용 설정하거나 사용 중지합니다.

true인 경우 GC로 인해 클라이언트가 힙 정보를 전송합니다.

힙 정보는 ClientData.getVmHeapData()로 액세스할 수 있습니다.

새 데이터를 사용할 수 있다는 알림은 값 Client.CHANGE_HEAP_DATA이 포함된 changeMask와 함께 AndroidDebugBridge.clientChanged(com.android.tradefed.device.server.ClientImpl, int)를 통해 수신됩니다.

매개변수
enabled boolean: 사용 설정 플래그

setThreadUpdateEnabled

public void setThreadUpdateEnabled (boolean enabled)

스레드 업데이트를 사용 설정하거나 사용 중지합니다.

true인 경우 VM이 스레드 정보를 전송할 수 있습니다. 스레드 정보는 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 패킷을 전송합니다.

이상적으로는 단일 채널 쓰기로 이 작업을 수행할 수 있습니다. 그렇지 않으면 이 패킷이 완료될 때까지 다른 사람이 채널에 쓰는 것을 방지해야 하므로 채널에서 동기화합니다.

또 다른 목표는 불필요한 버퍼 복사를 방지하는 것이므로 JdwpPacket의 ByteBuffer에서 직접 작성합니다.

매개변수
packet JdwpPacket