導入:timeout検証、ちゃんとやってますか?
Androidアプリで通信処理を書いていると、
だいたいこんな要求が来ます。
「通信がタイムアウトしたときの挙動を確認したいです」
「回線が悪いときでも落ちませんか?」
ただ、実機で自然にtimeoutを起こすのって、
正直かなり難しいですよね。
そこで使えるのが ProxyMan です。
この記事では、ProxyManで通信を意図的にtimeoutさせる方法を、
実務でそのまま使えるレベルまで掘り下げます。
先に結論です。
- ProxyManなら通信遅延・無応答を人工的に作れる
- BreakpointとScriptingが鍵
- timeout検証は「必ず」やるべき
なぜtimeout検証が重要なのか
普段の開発では、
通信が正常に返ってくる前提でコードを書きがちです。
しかし実際のユーザー環境では、
- 地下鉄
- 電波の弱い場所
- バックグラウンド制限
などで、通信が返らないケースが普通に起きます。
timeout時の挙動を未検証のままリリースすると、
以下のような事故が起きがちです。
- ローディングが永遠に消えない
- リトライが無限ループ
- UIが固まる
ProxyManでできること(timeout観点)
ProxyManは単なる通信閲覧ツールではありません。
- 通信を途中で止める
- レスポンスを遅延させる
- レスポンスを返さない
これらを使うことで、
ほぼ確実にtimeoutを再現できます。
前提:ProxyManで通信が見えている状態
この記事では、以下が完了している前提で進めます。
- Android端末がProxyMan経由で通信している
- HTTPS通信が復号できている
ここができていない場合、
まずは通常のWebView / API通信確認から行ってください。
方法① Breakpointで通信を止める(最も簡単)
一番手軽なのが、この方法です。
ProxyManで、
特定のリクエストにBreakpointを設定します。
手順
- 対象リクエストを右クリック
- Enable Breakpoint
- そのまま何もしない
これだけで、
通信はサーバーに届かず、レスポンスも返りません。
結果、Android側では
timeout待ち状態になります。
向いている用途
- readTimeoutの検証
- UIの待機状態確認
方法② Responseを遅延させる
「完全に止める」のではなく、
遅い通信を再現したい場合はこちらです。
Delay機能を使う
ProxyManのResponse設定で、
人工的にDelayを入れます。
- Delay: 10s / 20s / 30s
これで、
- ギリギリtimeoutしない
- ちょうどtimeoutする
といった境界条件を検証できます。
方法③ Scriptで完全に制御する(上級)
ProxyManのScript機能を使うと、
意図的にレスポンスを返さないことも可能です。
async function onResponse(context, response) {
// 何も返さず待ち続ける
await new Promise(() => {});
}
これを使うと、
確実にtimeoutが発生します。
Android側で確認すべきポイント
OkHttpのtimeout設定
OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build()
どのtimeoutが効いているかを、
ProxyManでの操作と合わせて確認します。
エラーの拾い方
timeout時は、
- IOException
- SocketTimeoutException
になることが多いです。
よくあるハマりポイント
① timeoutまで待っていない
意外と多いです。
ちゃんと秒数を計ってください。
② UIスレッドで待っている
通信待ち中にUIスレッドを止めると、
timeout以前に固まります。
③ retry処理が邪魔をする
自動リトライが入っていると、
timeoutしたように見えません。
実務での使いどころ
- 通信失敗時のUI確認
- リトライ仕様の検証
- エラーメッセージ表示確認
セキュリティ・運用上の注意
- debugビルド限定で行う
- Proxy設定は検証後に戻す
- スクリプトは必ず無効化
よくある質問
Q. エミュレータでも再現できる?
できますが、実機の方が安定します。
Q. WebView通信も同じ?
同じです。ProxyManから見ると区別はありません。
まとめ
- ProxyManでtimeoutは簡単に作れる
- Breakpointが最速
- timeout検証は必須作業
迷ったら:通信を止めてみる。
それが一番確実です。


コメント