mcpField
W
webview-footguns

webview-footguns

github.com/maxrave-dev開発1.7k62 回インストール1 週間前に更新
リポジトリ

webview-footguns について

webview-footgunsは、KotlinやCompose MultiplatformアプリのAndroid WebViewを保守する開発者向けのリファレンススキルです。実運用に基づく3つの障害パターンと対処法、コードベースで検証するコマンドをまとめています。

主な機能

  1. 01Android WebViewの障害ガイド3件
  2. 02動作パターンと失敗原因
  3. 03修正を検証するコマンド

活用シーン

  1. 01WebView起動の遅延やANRの診断
  2. 02低メモリ端末でのレンダラープロセス終了への対処
  3. 03ComposeでのWebViewライフサイクル管理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/maxrave-dev/kotlin-footguns --skill webview-footguns

インストール後、Claude Code で/webview-footgunsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
webview-in-androidview-lifecycle.md
webview-renderer-gone-takes-the-app.md
webview-startup-off-the-main-thread.md

詳細

WebView の落とし穴

本番環境の Kotlin と Compose Multiplatform アプリから掘り起こした 3 つの罠を、references/ にそれぞれ 1 つの短いファイルとしてまとめています。各ファイルには、動作するパターン、落とし穴(実際に発生する具体的な失敗とその理由)、およびユーザー自身のツリーに対して実行するコマンドを記載した「検証方法」セクションがあります。

このインデックスの使い方。 これから書こうとしているコード、または調査中の症状に照らして、以下の項目を確認してください。それぞれにトピックと、参照すべき症状が記載されています。コードや修正を提案する前に、該当する可能性のあるファイルをすべて Read ツールで読んでください。各ファイルは 150 行未満です。「検証方法」のコマンドに元のプロジェクトのパスが記載されている場合は、ユーザーのツリー内の対応するパスに置き換えてください。

相互参照。 一覧にないファイル内にバッククォートで囲まれた落とし穴の名前がある場合は、同じスキルの別の領域にあります。../*/references/<name>.md を glob で検索して開いてください。

低 RAM のスマートフォン:起動とレンダラーの終了

  • webview-startup-off-the-main-thread — プロセス内で最初に作られる WebView、またはほぼすべての android.webkit API の初回呼び出しでは、呼び出し元のスレッド上で WebView の起動処理が行われます。Cookie ストアでさえ、処理が戻る前にプロバイダーとそのネイティブライブラリを読み込みます。すでにメモリ不足の 3~4 GB のスマートフォンでは、この処理によって UI が数秒間ブロックされ、ANR または強制終了に至りました。プレースホルダーを表示しながらバックグラウンドの Executor で起動する方法、ライブラリが保護していない Executor、ゲートを通す前に行われる Cookie 呼び出し、およびその後もメインスレッドで実行される処理について説明します。Android 専用です。WebView を含む画面を開くと、低価格帯のスマートフォンだけで数秒間フリーズする場合、ANR のスタックトレースが WebView のコンストラクター内で終わる場合、または開発用スマートフォンでは再現しないのに、ウェブのサインイン画面に進むとアプリが終了する場合に参照してください。
  • webview-renderer-gone-takes-the-app — メモリを解放するためにシステムが WebView のレンダラープロセスを終了したとき、そのレンダラー終了コールバックを処理しないクライアントを持つ WebView は、アプリ全体も終了またはクラッシュさせます。ネイティブコードから終了するため Kotlin の例外は発生せず、JVM のみを監視するクラッシュレポーターには何も記録されません。メモリ不足の場合は何も記録されず、ユーザーにはアプリが突然消えたように見えます。アプリが作成するすべてのクライアントで true を返すこと、終了したインスタンスを再読み込みせず置き換える理由、新しい WebView を作成する Retry の実装方法、および意図的にレンダラーを終了させてテストする方法について説明します。Android 専用です。クラッシュダッシュボードが空のまま、メモリの少ないスマートフォンのユーザーからウェブ画面でアプリが消えるという報告がある場合、システムが他のアプリと一緒にアプリを強制終了する場合、またはバックグラウンドから戻るとウェブ画面が真っ白になる場合に参照してください。

Compose で WebView をホストする

  • webview-in-androidview-lifecycle — Compose の AndroidView で WebView をホストするには、単純な factory だけでは得られない 4 つの要素が必要です。利用可能な WebView プロバイダーがないデバイスでコンストラクターが例外を投げた場合のフォールバック、コンポジションから外れたときの明示的な destroy、自身のセットアップが例外を投げた WebView の destroy、そして view は再作成される可能性があるため、view ではなく画面を開くたびに紐づく副作用です。また、Cookie ストアのブロッキングする flush と、Cookie があるにもかかわらず null を返す getter についても説明します。Android 専用です。スマートウォッチや WebView プロバイダーの読み込みに失敗するスマートフォンでウェブ画面を開くとアプリがクラッシュする場合、ウェブ画面を離れてもメモリ使用量が高いままの場合、Retry でユーザーがサインアウトされる場合、ANR のスタックトレースが Cookie ストアの flush 内で終わる場合、または Cookie の読み取り時に null ポインターエラーが発生する場合に参照してください。デバッグビルドでは getCookie(...) must not be null、難読化されたリリースビルドでは null のオブジェクト参照に対する Object.getClass() 呼び出しとして現れます。

コメント