Connectを押すとプロファイルが一瞬回り、クライアントは切断を報告します。サポートがログを求め、スクリーンショットを添付しても、ハンドシェイクのどこで諦めたのか誰も言えないため、スレッドは二日止まります。一回の試行に絞り、狭い時間枠と最後に完了した段階を添えた報告なら、チケットは一往復で前に進みます。代わりに丸一日分の端末ログを送ると、多くの場合、相手が調べる場所を増やすだけです。

同じゲートウェイ上の二台の端末でも、プロトコル、証明書ストア、認証方式、通信ポリシーが一致しないことがあるため挙動は変わり得ます。自分の端末では動くというのは比較の出発点であって、Android側の不具合の証拠ではありません。

履歴一日分ではなく一回の試行を記録する

再現する前に、Androidのリリース、製造元と型番、クライアント名とバージョン、選んだプロファイル、接続しているネットワーク、タイムゾーン込みの時刻を書き留めます。バッテリーセーバーやData Saverが有効かどうかも記すのは、どちらも画面が消えた後のクライアントの動作を変えるからです。

次に、五つの結果のうち実際にどれを見ているのかを決めます。同意や権限のダイアログが完了しない、エンドポイントにまったく到達できない、認証が拒否される、ログイン成功後にインターフェース設定が失敗する、トンネルは上がるが特定のリソースだけ到達できない、のいずれかです。それぞれ担当も対処も異なり、混ぜたバンドルはやり直しを求められます。その間で当て推量をすることが、一時間のチケットを一週間の往復に変えます。

遷移も重要です。画面ロック後やWi-Fiからモバイルデータへの切り替え後にだけ失敗するなら、チケットの一行目にそれを書き、発生した分を記します。

まずクライアント自身のログを書き出す

最初の添付はオペレーティングシステムではなくアプリから取るべきです。ほとんどのクライアントは設定に診断ログや接続ログの書き出しがあり、バージョン文字列の長押しの裏に隠れていることもあり、その出力は自身の状態機械をすでに理解しています。興味深い行をチケット本文に打ち直すのではなく、出てきたものをそのまま使います。

最初のエラーとその直前のイベントを添付し、最後の切断行だけを載せないようにします。きれいな末尾は、検証に失敗した証明書チェーン、予期しない場所で解決された名前、設定されなかったインターフェースなど、本当の失敗がもっと前に起きたことを通常意味します。

名前を付けられる問いに対してだけlogcatを追加する

端末上のターミナルエミュレーターはシステムロガーではありません。Androidは各バッファを特権プロセスだけが全体を読める独立したリングストリームとして記録します。そのため通常のアプリが見えるのは自分の出力と限られた断片だけで、logcatが空だったという話は、プラットフォームが何を記録したかをほとんど証明しません。

サポートされる方法は自分が管理するコンピューターからの許可済みADBセッションで、開発者向けオプションとUSBデバッグを有効にし、ケーブルを接続し、端末でRSA指紋のダイアログを承認します。このプロンプトを閉じると、以降のコマンドはすべてunauthorizedで失敗し、記録は始まりません。

記録に時間をかける前に、端末が本当にそこにあるか確認します。adb devicesはシリアル番号に続いてdeviceという語を表示するはずで、offlineやunauthorizedと表示される場合は、まずケーブル、プロンプト、ドライバーを整える必要があります。

一覧に出たら、Connectを押す数秒前から記録を始め、クライアントが諦めた直後に止めます。意図して開始したライブ記録が二十分後のダンプより優れるのは、リングバッファがすでに回っていて、必要な序盤の行が消えているかもしれないからです:

adb logcat -v threadtime -b main,system,crash > attempt.txt

VPNという語ではなく時刻とタグで絞り込む

記録をvpnで検索するのは、失敗を説明する行を失う最速の方法です。証明書の検証、プロセスのクラッシュ、接続性の変化はVPNに触れないタグで記録されるため、キーワード絞り込みはノイズを残して証拠を捨てます。

まず時間枠、次に優先度、最後にタグで絞ります。既知の時点より後だけが必要なら、adb logcat -v threadtime -t '11-03 20:14:00.000'がその地点から直近の末尾を再生し、threadtime形式ならタイムスタンプをクライアント自身の書き出しと比較できます。

クライアントのパッケージが分かっているなら、タグを推測するのではなくそのプロセスを追います。adb shell pidof com.vendor.clientはPIDを返し、adb logcat --pid=1234 -v threadtimeはそのプロセスだけを出力しますが、adb logcat -gは各バッファが上書きを始める前にどれだけの余裕があるかを示します。

秘密情報を伏せてから、まとまりのある一つのバンドルを渡す

何かが自分のマシンから出る前に、パスワード、トークン、秘密鍵、セッションクッキー、完全な端末識別子を取り除きます。失敗を読めるものにするエラーコード、イベントの順序、アドレスの関係は、その線を越えて掃除した記録がまったく絞り込まなかった記録と同じくらい役に立たなくなるため残します。

そして複数のばらばらなファイルではなく、一つのバンドルとして送ります。中身はクライアントの書き出し、開始と停止時刻を名前にしたADBウィンドウ、失敗した段階の二行要約、このリスト冒頭の環境メモであり、一部を公開できない場合は提供元の非公開サポート窓口を使い、どのファイルがその窓口を必要とするかを伝えます。

送る前に四点を確認します。バンドルは丸一日ではなく一回の試行を対象にしていますか。クライアントとシステムのタイムスタンプは重なっていますか。そしてトークン、パスワード、完全な契約者識別子がまだ残っていませんか。最後の点を先に直し、新しいチケットを開くのではなく既存のチケットにファイルを添付して、引き継ぐ人が以前の文脈を保てるようにします。

関連記事