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()
이 클라이언트 정보가 포함된 |
int
|
getDebuggerListenPort()
이 클라이언트의 디버거 포트를 반환합니다. |
IDevice
|
getDevice()
이 클라이언트가 실행 중인 |
DeviceImpl
|
getDeviceImpl()
이 클라이언트가 실행 중인 |
JdwpPacket
|
getJdwpPacket()
버퍼에 있는 첫 번째 전체 JDWP 패킷의 정보를 반환합니다. |
void
|
initializeHeapUpdateStatus()
|
boolean
|
isDdmAware()
클라이언트 VM이 DDM을 인식하는 경우 |
boolean
|
isDebuggerAttached()
디버거가 현재 클라이언트에 연결되어 있으면 |
boolean
|
isHeapUpdateEnabled()
힙 업데이트가 사용 설정되었는지 여부를 반환합니다. |
boolean
|
isThreadUpdateEnabled()
스레드 업데이트가 사용 설정되었는지 여부를 반환합니다. |
boolean
|
isValid()
이 |
void
|
kill()
VM에 종료 메시지를 전송합니다. |
void
|
listViewRoots(DebugViewDumpHandler replyHandler)
|
void
|
notifyVmMirrorExited()
디버거 VM 미러가 DDMLib 뒤에서 종료되어 다양한 경합 또는 영구 |
void
|
packetFailed(JdwpPacket reply)
이전 요청이 실패했습니다. |
void
|
read()
채널에서 데이터를 읽습니다. 하나의 스레드에서만 호출해야 합니다. |
void
|
register(Selector sel)
선택기로 클라이언트를 등록합니다. 클라이언트 생성 직후에 호출해야 합니다. |
void
|
requestAllocationDetails()
enable이 |
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()
|
void
|
toggleMethodProfiling()
이 메서드는 지원 중단되었습니다.
대신 |
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 |
|
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 ()
enable이 null로 설정된 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 ()
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 |