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

この Client が実行されている IDevice を返します。

DeviceImpl getDeviceImpl()

この Client が実行されている 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 に kill メッセージを送信します。

void listViewRoots(DebugViewDumpHandler replyHandler)
void notifyVmMirrorExited()

デバッガ VM ミラーが DDMLib の背後で終了し、さまざまな競合状態や永続的な Client 損失状態につながる可能性があります。

void packetFailed(JdwpPacket reply)

以前のリクエストでエラーが発生しました。

void read()

チャンネルからデータを読み取ります。1 つのスレッドからのみ呼び出す必要があります。

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)

クライアント ソケット チャネルを閉じます。関連付けられているデバッガがある場合は、それも閉じます。

チャンネルを閉じると、セレクタから自動的に登録解除されます。ただし、実際に処理を続行してファイル記述子を閉じることができるようになる前に、セレクタ ループを反復処理する必要があります。呼び出し元がそれを管理することが想定されています。

パラメータ
notify boolean: 変更をリスナーに通知するかどうか。

ddmSeen

public boolean ddmSeen ()

MonitorThread は、DDM リクエストまたはレスポンスを検出すると、このメソッドを呼び出します。DDM パケットをまだ受信していない場合は、状態を ST_READY に進めて「false」を返します。それ以外の場合は、true を返します。

このアイデアは、DDM パケットを最初に確認したときに MonitorThread に通知し、クライアント接続が確立されたときにハンドラにブロードキャストを送信できるようにすることです。このメソッドは同期されているため、ブロードキャストは 1 回だけ送信されます。

戻り値
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 ()

この Client が実行されている IDevice を返します。

戻り値
IDevice

getDeviceImpl

public DeviceImpl getDeviceImpl ()

この Client が実行されている DeviceImpl を返します。

戻り値
DeviceImpl

getJdwpPacket

public JdwpPacket getJdwpPacket ()

バッファ内の最初の完全な JDWP パケットの情報を返します。

完全なパケットがまだない場合は、null を返します。

JDWP ハンドシェイクをまだ受信していない場合は、ここでそれを監視し、受信したことを認めずに消費します。受信すると「HELO」メッセージを送信します。これが IOException をスローする理由です。

接続の確立に関するオペレーションの順序は次のとおりです。

ホスト側: 1) adb track-jdwp 2) アプリプロセスを含む PID の更新されたリストを受信します。3) デバッガポートを開いて転送し、デバイスに接続します。4)ハンドシェイクを実行します。5)HELO を送信し、応答を待ちます。

デバイス/プロセス側: a) 接合子をフォークし、PID で ADB を更新します。b) デバッガポートが接続されている場合は APNM を送信します(「<pre-initialize>」)。c) プロセスを実際のアプリとパッケージにバインドします。d) デバッガポートが接続されている場合は、更新された APNM を送信します。

上記の 2 つの実行シーケンスは完全に並行して実行されます。唯一の制約は、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

中断 中止 止めて

public void kill ()

VM に kill メッセージを送信します。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 ()

チャンネルからデータを読み取ります。1 つのスレッドからのみ呼び出す必要があります。

これは、データが利用可能であることがわかっていて、バッファにまだ完全なパケットがない場合に呼び出されます。バッファが最大容量に達している場合は、バッファを拡張します。

register

public void register (Selector sel)

クライアントをセレクタに登録します。クライアントの作成直後に呼び出す必要があります。

パラメータ
sel Selector

requestAllocationDetails

public void requestAllocationDetails ()

VM にリクエストを送信して、enablenull に設定された enableAllocationTracker(boolean) の呼び出し以降に発生したすべての割り当てに関する情報を送信します。これは非同期です。

割り当て情報には 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() を使用します。

メソッド プロファイリングの状態を切り替えます。

update

public void update (int changeMask)

パラメータ
changeMask int

updateHeapInfo

public void updateHeapInfo ()

単一のヒープ更新をトリガーします。

保護されたメソッド

送信

protected void send (JdwpPacket packet)

クライアントに DDM パケットを送信します。

理想的には、1 回のチャネル書き込みでこれを行うことができます。そうならない場合は、このパケットが完了するまで他のユーザーがチャンネルに書き込むのを防ぐ必要があります。そのため、チャンネルで同期します。

もう 1 つの目標は、不要なバッファコピーを避けることです。そのため、JdwpPacket の ByteBuffer から直接書き込みます。

パラメータ
packet JdwpPacket