ByteScope

Android ADB Toolbox

小さな adb 作業を 11 個ぶんボタンに。ワイヤレスデバッグ、スクリーンショット、文字入力、ディープリンク、画面サイズ、プロキシ、プロパティ、クラッシュ記録。

コマンドはすべて USB ケーブル越しに実行され、出力はこのタブに留まります。アップロードは一切なく、スクリーンショットやエクスポートはブラウザがあなたのディスクへ直接書き込みます。

ブラウザの対応を確認中…

ワイヤレスデバッグ(Wi-Fi 経由の adb)

端末の ADB デーモンを TCP ポート 5555 に切り替え、デスクトップのターミナル用の接続コマンドを表示します。両方の機器が同じネットワークにいる必要があり、この切り替えは端末を再起動すると失われます。

adb tcpip 5555

このセクションを使うには端末を接続してください。上のコマンドはどのシェルでも使えます。

スクリーンショット

端末自身の screencap で PNG を撮り、フル解像度のままケーブル越しに取り出します。DRM 保護されたコンテンツは黒くなります。コンポジタがそのフレームを誰にも渡さないためです。

screencap -p

このセクションを使うには端末を接続してください。上のコマンドはどのシェルでも使えます。

文字入力とキー送信

端末でフォーカスがある場所に、adb と同じ input text で入力します。長いパスワード、URL、指で打ちたくないテスト用データに便利です。

input text 'hello world' input keyevent 3

このセクションを使うには端末を接続してください。上のコマンドはどのシェルでも使えます。

画面サイズと密度の偽装(wm size)

端末に別の画面のふりをさせます。実機でレイアウトを別のブレークポイントで見る最も安い方法です。ブレークポイントが反応するのは dp(ピクセル × 160 ÷ dpi)なので、各プリセットは両方を設定します。

wm size 1080x2340 wm density 420 wm size reset wm density reset

このセクションを使うには端末を接続してください。上のコマンドはどのシェルでも使えます。

開発者向けスイッチ

端末の開発者オプションにあるスイッチを、6 つのメニューをたどらずに: アニメーション速度、タップ表示、ポインタ座標、アクティビティを保持しない、右から左のレイアウトの強制。

settings put global window_animation_scale 0.0 settings put system show_touches 1

このセクションを使うには端末を接続してください。上のコマンドはどのシェルでも使えます。

端末プロキシ(mitmproxy、Charles、Fiddler)

端末の HTTP スタックをあなたのマシン上のプロキシに向けます。通信キャプチャの手順書が必ず最初に説明する配線を 1 行にしたものです。解除はワンプレスで、この節の最初のボタンにしてあるのには理由があります。

settings put global http_proxy 10.0.0.5:8080 settings put global http_proxy :0

このセクションを使うには端末を接続してください。上のコマンドはどのシェルでも使えます。

システムプロパティ(getprop)

プロパティ表の全体(多くの端末で 1000 件超)を検索できます。この端末は何かに答える 15 件は上に固定表示。ここに入力した文字は端末に届きません。検索はこのタブ内で行われます。

getprop

このセクションを使うには端末を接続してください。上のコマンドはどのシェルでも使えます。

デバッグ可能なアプリのデータベース

デバッグビルドのプライベートデータ領域にある SQLite ファイルを一覧し、root なしで取り出します。run-as の有用な半分です。shell はアプリのデータを読めませんが、アプリ自身の uid なら読めて、run-as は 1 コマンド分だけその uid を貸してくれます。

run-as com.example.app ls -l databases run-as com.example.app cat 'databases/app.db'

このセクションを使うには端末を接続してください。上のコマンドはどのシェルでも使えます。

最近のクラッシュと ANR

うまくいかなかったことをためておくプラットフォーム自身のリングバッファ、DropBoxManager を読みます。アプリのクラッシュ、ANR、ネイティブクラッシュ、Log.wtf、カーネルの tombstone が時刻付きで入っています。

dumpsys dropbox dumpsys dropbox --print data_app_crash

このセクションを使うには端末を接続してください。上のコマンドはどのシェルでも使えます。

画面録画

録画はここではなくミラーリングと同じページにあります。どちらも画面についての機能であり、screenrecord の実装は 2 つより 1 つのほうが安全だからです。プロセスはあらゆる経路で止めなければ、誰も見ていないままエンコードを続けます。

screenrecord --time-limit 180 --bit-rate 20000000 /sdcard/out.mp4

画面ミラーリングのページで録画する →

ブラウザが ADB でできないこと

実装待ちの機能一覧ではありません。プラットフォームかブラウザのサンドボックスが不可能にしていることで、回避策を探し始める前に理由を知る価値があります。

  • adb forward / adb reverse

    ポート転送には TCP のリスナーが必要で、ウェブページはそれになれません。どのブラウザでもタブにサーバソケットはなく、これは設計上の話です。つまりあなたのマシンの localhost:8080 が向く先がありません。ここはデスクトップの adb の担当です。

  • adb backup / adb restore

    adb backup は Android 12 で非推奨になり、それより前から多くのアプリが allowBackup=false で対象外にしていました。現代の端末で作られるのはほぼ空のアーカイブです。本当に欲しいファイルを取り出すのはファイルブラウザの仕事です。

  • fastboot

    fastboot は別の USB インターフェース上の別のプロトコルで、Android ではなくブートローダーが話します。WebUSB で実装は可能ですが ADB のコードは何も流用できないため、ここのチェックボックスではなく独立したツールの領分です。

  • input text (non-ASCII)

    input text が出せるのは仮想キーボードのキーマップにある文字、つまり印字可能な ASCII だけです。これはプラットフォームのコマンドの制約で、デスクトップの adb でも日本語は打てません。

  • adb root / su

    adb root は eng または userdebug ビルドでしか動かず、su は root 化された端末にしかありません。このページのすべてはどちらも不要な前提で作られており、だからこそ一部は丁寧に拒否します。

ここにあるそれ以外はすべて、市販の端末で USB デバッグを有効にしただけの状態で、通常の ADB シェル越しに動きます。インストールするものはありません。

このツールについて・FAQ・関連ツール

このツールについて

Android 端末を USB で Chromium 系ブラウザにつなぐと、このページは毎回調べ直しているような adb shell コマンド 11 種をボタンにして、その出力を読める形にします。デーモンを Wi-Fi に切り替える、私生活が写らないステータスバーでスクリーンショットを撮る、文字を打ってハードウェアキーを押す、ディープリンクを投げて起動結果を読む、画面サイズを別のものだと思わせる、開発者向けスイッチを切り替える、端末をデバッグ用プロキシに向ける、1200 件を超えるシステムプロパティを検索する、デバッグビルドのデータベースを取り出す、最近のクラッシュと ANR を読む。各セクションは実際に走るコマンドをそのまま表示するので、持ち帰ってターミナルで使えます。端末には何もインストールせず、アップロードもありません。サーバのない静的なページです。

ワイヤレスデバッグと、ブラウザにできない 1 つのこと

このページは端末の ADB デーモンを TCP ポート 5555 に切り替え、端末自身の IP アドレスを読めます。どちらもすでにある USB 接続の上を通るからです。できないのは、そのポートへ接続することです。ウェブページには生の TCP ソケットがありません。fetch が話すのは HTTP で ADB のハンドシェイクは HTTP ではなく、WebSocket は相手が WebSocket サーバである必要があり ADB デーモンはそうではなく、WebTransport が必要とする QUIC エンドポイントでもありません。これを変えるフラグも権限ダイアログもオリジントライアルも存在せず、サンドボックスが設計どおりに働いているだけです。だからこの機能の正直な形は、スイッチを入れてデスクトップのターミナル用に adb connect 192.168.1.23:5555 を渡すウィザードであり、同じ理屈で adb forward はここに現れません。

通知が写り込まないスクリーンショット

screencap -p が撮影し、バイト列はフル解像度のままケーブル越しに戻ってきます。撮ったあとに何らかの手段で転送する必要がない点で、すでに端末のスクリーンショットより楽です。知っておく価値があるのは隣にある機能です。SystemUI のデモモードは、固定時刻・充電マークなしの満充電・電波満タン・通知アイコンなしでステータスバーを固定するプラットフォーム自身の仕組みで、ストア掲載用の画像はこうして作られています。間違えやすい点が 2 つあり、このページは両方を扱います。sysui_demo_allowed が有効でなければモードは無視されるので、闇にブロードキャストを投げる代わりにその設定を調べます。そしてデモモードを入れたままの端末は何かが解除するまで偽の時刻を表示し続けるので、解除ボタンは常に見えています。

端末への文字入力と、日本語が不可能な理由

input text はこのページで最も繊細なコマンドです。送る文字列はあなたのもので、しかも 2 つの解釈器を通ります。1 つは端末のシェルで、そこでは a; reboot は 2 つのコマンドになります。もう 1 つは input 自身で、キーボードに届く前に %s を空白へ変えます。そこで文字列はシングルクォートで囲んだ 1 語として送られ、その中では空白・&;$・バッククォート・パイプはすべてただのバイトになります。例外は 3 つだけ明示的に扱います。アポストロフィはエスケープせずキー送信で打つ、改行は Enter にする、s の直前の % は別コマンドに切り離してプラットフォームに食べられないようにする。直せないのは文字集合です。input text は印字可能な ASCII しか知らない仮想キーボードのキーマップに行き着くので、日本語・中国語・アクセント付き文字は何も出ません。これは ADB コマンドの制約で、デスクトップの adb でも打てません。

ディープリンクと、-W が実際に教えてくれること

am start -W -a android.intent.action.VIEW -d <url> は、自分のインテントフィルタがその URL を本当に受け取るのかを確かめる最速の方法で、このページは応答をきちんと読みます。Status: ok なら勝ったアクティビティと起動時間、unable to resolve Intent ならそれ自体が答えであってエラーではなく、たいていそれこそが試したかったことです。細かいが重要な点が 2 つ。URL は & や ? を正当に含む種類の文字列であり、クォートされていない & はコマンドをバックグラウンドに回してクエリの半分を黙って落とします。手で打ったディープリンクのテストが「動かない」ように見える典型的な理由です。そしてアプリがすでに前面にあったときは、端末は警告を出して起動時間を一切印字しません。このページは安心させるような 0 ms を見せる代わりに、そう書きます。

画面サイズの偽装と、戻る道

wm size 1080x2340wm density 420 は端末に別の画面のふりをさせます。実機でレイアウトを別のブレークポイントで見る、最も安い方法です。ブレークポイントが反応するのは密度非依存ピクセル、つまりピクセル × 160 ÷ dpi なので、ここのプリセットは両方の数値を設定し、それが作る dp 幅(320、360、411、480、800)で名前を付けています。そして警告です。これがこのページで唯一本物の危険です。上書きは再起動を越えて残り、*すべて*の描画サイズを変えます。それを直すために開く設定アプリも同じです。密度を間違えるとボタンが画面外に出て、端末から端末を直せなくなります。だから復元ボタンはプリセットの隣に常にあり、確認ダイアログは実行前に wm size resetwm density reset を示し、どちらもこのページが上書きしたかどうかに関わらず効きます。

開発者向けスイッチと、忘れるプロキシ

アニメーション倍率、タップ表示、ポインタ座標、アクティビティを保持しない、右から左のレイアウトの強制は、どれも settings put 1 回の距離にあります。このページは書く*前*に現在値を読むので、記録される取り消しコマンドは実際にそこにあった値です。プロキシは同じ仕組みで、はるかに大きな落とし穴です。settings put global http_proxy 10.0.0.5:8080 は端末の HTTP スタックをノート PC の mitmproxy や Charles に向けます。それを設定したまま建物を出ると、端末はどこでもインターネットに繋がりません。別の Wi-Fi でも、モバイル通信でもです。しかも端末側に理由はどこにも出ません。だからこのセクションでは解除が最後ではなく最初のボタンで、settings put global http_proxy :0 を解毒剤として表示し、このページが設定していないプロキシにも解除ボタンが効きます。

プロパティ、アプリのデータベース、クラッシュ記録

最後の 3 セクションは読み取り専用で、デバッグの行き着く先はだいたいここです。プロパティブラウザは getprop の全体(現代の端末で 1000 件超)を検索し、この端末が何かに答える 15 件を上に固定し、キーを並べ替えた JSON をエクスポートするので 2 台の差分がきれいに取れます。アプリのデータベースのセクションは run-as を使います。1 コマンド分だけシェルにアプリ自身の uid を貸す仕組みなので、デバッグビルドの SQLite ファイルを root なしで一覧・取り出しできます。リリースビルドはプラットフォームが拒否し、このページは汎用のエラーではなくそのどちらなのかを書きます。クラッシュのセクションは DropBoxManager を読みます。これが「root なしで ANR トレースを読む方法」の実際の答えです。現代のビルドでは /data/anr を shell ユーザーが読めませんが、同じトレースが drop box にあり、dumpsys が渡してくれます。

これは自分のマシンに platform-tools を入れることの代わりではありません。コマンドを覚えていればターミナルのほうが速く、このページはそのコマンドを喜んで見せます。向いているのは、自分のものでない端末、自分のものでないマシン、そして SDK を入れる選択肢がない 5 分間です。ここから、Web ADB のハブに端末ダッシュボードとファミリーの残りがあり、logcat ビューアはいじっている間に端末が何を言っていたかを見せ、画面のページはディスプレイをミラーリングまたは録画します。

よくある質問

ブラウザからワイヤレスデバッグを使うには?

ここのスイッチを押すと端末の ADB デーモンが TCP 5555 で待ち受けを始めます。ページは端末の Wi-Fi アドレスを読み、パソコンのターミナルに貼り付ける `adb connect <ip>:5555` を出します。接続そのものはデスクトップの `adb` が行う必要があります。ブラウザのタブには生の TCP ソケットがなく、それを変えるフラグもありません。両方の機器が同じネットワークにいる必要があり、この切り替えは端末を再起動すると失われるので、次につないだときにまた押せばよいだけです。USB のみのデバッグに戻すには `adb usb` を実行するか、端末を再起動します。

input text で日本語や中国語が打てないのはなぜ?

`input text` にそれができないからです。このコマンドは Android の仮想キーボードの文字マップに行き着き、そこには印字可能な ASCII のキーしかないので、その範囲外の文字ではキーイベントがまったく生成されません。ビルドによっては明確に失敗し、別のビルドでは黙って何も打ちません。これは USB でもブラウザでもこのページでもなく、プラットフォームのコマンドの制約です。デスクトップの `adb shell input text` でも打てません。現実的な答えは端末側のキーボードアプリ、あるいはクリップボードです。このページは非 ASCII を最初に拒否し、送れない文字を名指しします。

端末に設定した ADB のプロキシを消すには?

`settings put global http_proxy :0` です。プロキシのセクションの解除ボタンはまさにそれを実行し、このページが設定したかどうかは問いません。`:0` であることが重要です。空文字列はいくつかのビルドでそのまま保存され、端末は何も役に立たないものを向いたままになりますが、`:0` はプラットフォーム自身の設定画面が書く値です。ケーブルを抜く前にやる価値があります。プロキシを設定したまま建物を出た端末は、どのネットワークでもインターネットに繋がらず、理由も示しません。この設定はグローバルなので、Wi-Fi だけでなくモバイル通信にも適用されます。

Android のデモモードとは何で、ステータスバーが変わらないのはなぜ?

デモモードは文書化された SystemUI の機能で、固定時刻・充電マークなしの 100% 電池・電波満タン・通知アイコンなしでステータスバーを固定します。ストア掲載用のスクリーンショットに未読メッセージが写らないようにするためのものです。送っても何も起きない場合、よくある理由はゲートです。SystemUI は `sysui_demo_allowed` が 1 でない限りすべてのデモのブロードキャストを無視し、これは初期状態では 1 ではありません。このページはその設定を調べ、戻し方を記録したうえで有効化を提案します。もう 1 つの理由はメーカーがレシーバーを外したビルドで、これはいくらブロードキャストしても直りません。

run-as が「not debuggable」と言うのはなぜ?

それがリリースビルドだからです。`run-as` がアプリの uid を貸してくれるのは、そのアプリのマニフェストが debuggable と宣言している場合だけです。Play ストアのアプリはすべてリリースビルドなので、このセクションはインストールしたものではなく自分でコンパイルしたものに対して使います。シェルからの回避方法はありません。他のアプリのプライベートなデータを読むには、同じアプリのデバッグビルドか root が必要です。メッセージが「パッケージが不明」と言う場合は、名前が違うか、いま見ているのとは別のユーザーや仕事用プロファイルにインストールされています。

  • Web ADB Toolkit

    端末ダッシュボード、shell ドロワー、その他すべての Web ADB ツール。

  • Android Screen Mirror

    同じケーブルで画面をライブミラーリング、または MP4 に録画。

  • Android Logcat Viewer

    レベル・タグ・正規表現フィルタ付きの全画面ログビューア。

  • adb shell コマンドリファレンス

    36 個の adb shell コマンドの構文・例・出力の読み方。各ページからそれを実行するツールへリンクします。

  • SQLite Viewer

    アプリから取り出したデータベースをブラウザで開く。