mcpField
A
android-bridge

android-bridge

github.com/briqt生産性037 回インストール1 週間前に更新
リポジトリ

android-bridge について

android-bridgeは、接続したAndroid端末をCLIで操作するためのスキルです。画面の確認と操作を行うエージェント向けに、ネイティブアプリとFlutter・Composeで異なるUIツリーを使う認識・特定・操作・検証の手順を示します。

主な機能

  1. 01画面テキストと操作要素の取得
  2. 02ネイティブ・Flutter・Compose画面の確認
  3. 03タップ・スワイプ・ドラッグ・キー操作
  4. 04ASCIIとCJKテキストの入力
  5. 05端末接続とファイル転送

活用シーン

  1. 01Androidアプリ画面の操作自動化
  2. 02FlutterまたはComposeアプリのUIノード確認
  3. 03タップや文字入力後の画面変化の検証
  4. 04端末とローカル間のファイル転送

インストール

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

$npx skills add https://github.com/briqt/android-bridge --skill android-bridge

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

詳細

Android デバイス制御

android-bridge CLI を使って、接続された Android デバイスを操作します。すべての操作は 認識 → 特定 → 実行 → 検証 → エスカレーション のループに従います。唯一の信頼できる情報源は CLI であり、このファイルはエージェント向けのマニュアルです。

すべてのコマンドは、stderr の1行目に [profile: <name>] を出力します(成功・失敗を問いません。プロファイルがアクティブでない場合は [profile: default] がデフォルトです)。これは意図された動作です。アクティブなデバイスの確認に使ってください。stdout には結果が、stderr には診断情報が出力されます。

バージョンと機能の確認

このマニュアルには android-bridge 0.3.0+ と Python 3.11+(Pillow 13)が必要です。スキルのインストールと CLI のインストールは別々です。新たに記載されたコマンドを使用する前に、バイナリを確認してください:

android-bridge --version
android-bridge doctor --json   # offline: no device connection or screen changes
# Upgrade CLI and skill:
pipx install --force git+https://github.com/briqt/android-bridge.git
npx skills add briqt/android-bridge -g -y

doctor は、実際のモジュール/Python/ADB のパス、設定の参照元、プロファイル、root モード、サポートされている機能を報告します。ADB が見つからない場合は、別途修正する必要があります。

クイックスタート

pipx install git+https://github.com/briqt/android-bridge.git   # install CLI
android-bridge connect 192.168.1.100:5555                       # connect (WiFi ADB; remembered)
android-bridge snapshot                                          # read screen (native apps)
android-bridge dump                                              # read screen (Flutter/Compose apps)
android-bridge tap 540 1200                                      # act

コマンド早見表

コマンドシグネチャ説明
snapshot[--json-out] [--out PATH]UI ツリーの要約(テキスト+インタラクティブ要素)。--out はスクリーンショットを保存します。
dump[--json-out] [--clickable] [--all] [--max N] [--out PATH]ノードの完全なダンプ。ツリーが疎な Flutter/Compose で使用します。
screenshot[--out PATH]スクリーンショットファイル(--out)または stdout への base64 出力(ビジョンモデルのみ)。
tapx y指定した位置をタップします。
long-tapx y長押しします。
swipex1 y1 x2 y2スワイプ/スクロールします。
dragx1 y1 x2 y2ドラッグ&ドロップします。
type`[TEXT] [--stdin--file PATH]`
type-cjk`[TEXT] [--stdin--file PATH] [--at x y]`
clear-field[--at x y]フォーカス中のフィールドをクリアします。
select-all[--at x y]フォーカス中のフィールドのすべてを選択します。
pressbuttonback|home|enter|power|volume_up|volume_down|tab|delete|recent(または任意の KEYCODE_*)。
shell"cmd" [--root] [--script f]デバイス上で実行します。stdin のパイプに対応しています。
pushlocal remoteファイル/ディレクトリをデバイスに送信します。
pullremote [local]デバイスから取得します(デフォルト:cwd)。
devices—接続されているデバイスを一覧表示します。
connect[serial]接続して記憶します。

グローバルオプション:-p/--profile <name> でデバイスプロファイルを選択します。

基本ループ:認識 → 特定 → 実行 → 検証 → エスカレーション

認識 — android-bridge snapshot(ネイティブアプリ)または android-bridge dump(Flutter/Compose)を実行します。

  • 空/ERROR/「null root node」の場合 → 失敗時の判断ツリーに進みます(画面オフ/オフライン)。
  • 正常な場合 → 特定に進みます。

特定 — 出力から対象を見つけます。

  • 要素に座標がある場合 → 中心を使います。
  • テキストは表示されるが座標がない場合(Flutter の疎なツリー:テキストノードに clickable フラグがない)→ android-bridge dump を実行し、text/content-desc でノードを探して、bounds の中心を使います。
  • 対象が画面上にない場合 → スクロール(swipe)するか、先にオーバーレイを閉じます(落とし穴を参照)。
  • 同じテキストの要素が複数ある場合 → resource_id(--json-out を使用)または bounds の Y 座標の順序で判別します。

実行 — アクションの種類に応じて操作します。

  • クリック → tap/long-tap。
  • 入力 → まずフィールドを tap し、ASCII は type、CJK は type-cjk --at x y を使います。
  • スクロール/ドラッグ → swipe/drag。
  • システムキー → press。

検証 — android-bridge snapshot(または dump)を実行し、操作前の状態と比較します。

  • 期待する変化を具体的に示します:「ボタン X に Y が表示される」「Z というタイトルのページが表示される」「フィールドに V が入力されている」。
  • 一時的なフィードバック(Toast/Snackbar)については、落とし穴を参照してください。ビジョン機能を備えたモデルでない限り、スクリーンショットの読み取りに頼らないでください。

エスカレーション — 検証に失敗した場合。

  • 描画後に要素が移動した可能性があります → 再度認識 → 新しい座標を特定 → 再実行します。最大 2 回までです。
  • それでも失敗する場合 → 停止して報告します:「tap (x,y) で変化がありませんでした。最後のスナップショット:」。際限なく再試行しないでください。

失敗時の判断ツリー

Operation failed?
│
├─ snapshot/dump returns ERROR / "null root node"
│   ├─ Screen off/locked → android-bridge press KEYCODE_WAKEUP → retry
│   └─ Still null → android-bridge devices
│       ├─ No device → android-bridge connect <ip:5555> (WiFi) or plug USB
│       └─ "offline" → reconnect the configured endpoint; device input commands cannot repair an offline transport
│
├─ snapshot/dump reports "could not get idle state" / dump fails
│   └─ Flutter animation never idle → retry ≤3 times → still failing: android-bridge shell "uiautomator dump --compressed /sdcard/d.xml && cat /sdcard/d.xml" → still failing: blind-operate by geometry + verify post-action
│
├─ snapshot normal but Interactive Elements empty / target has no coordinates
│   └─ Flutter/Compose sparse tree → android-bridge dump → find node by text/content-desc → tap bounds center
│
├─ tap produces no state change (verify failed)
│   ├─ Element shifted → re-snapshot, re-tap with new coords (≤2 rounds)
│   ├─ Overlay/coach-mark intercepting → snapshot, find "我知道了/跳过/Got it", tap it, retry target
│   ├─ Non-clickable Flutter node → use dump bounds (above) or press back, re-enter
│   └─ 2 rounds still no change → stop, report diagnostics
│
├─ Screenshot all-black
│   ├─ FLAG_SECURE app → use snapshot/dump (a11y tree is unaffected), drop screenshot path
│   └─ Text-only model → never use --vision/screenshot as visual input; use text + dump + logcat
│
├─ Transient toast not in snapshot
│   └─ Most app feedback is Snackbar (in view tree) → re-snapshot promptly; else verify post-action state; see Pitfalls
│
├─ "unauthorized" / auth failed
│   └─ Do NOT bypass via ro.adb.secure/resetprop/adb_keys (unreliable on HyperOS/MIUI) → user taps "Allow" + "Always allow" on device → reconnect
│
├─ "ADB not found"
│   └─ Set "adb_path" in ~/.config/agent-skills/android-bridge/config.json, or sudo apt install adb
│
└─ Connection timeout / WiFi ADB dropped
    └─ android-bridge connect <ip:5555> → retry; "failed to connect" → on device: adb tcpip 5555 (via USB first)

視覚機能と認識戦略

このスキルは、視覚機能を備えたマルチモーダルモデルとテキスト専用モデルの両方に対応しています。認識方法を選ぶ前に、自分がどちらなのかを確認してください。

テキスト専用モデル(PNG/画像のバイトデータを読み取れないモデル)

認識に使える唯一の手段は、アクセシビリティツリーのテキストです。次の方法を使ってください。

  1. android-bridge snapshot — デフォルトです。画面に表示されているテキストと、中心座標付きのインタラクティブ要素を返します。これがあなたの目になります。
  2. snapshot に要素が不足している場合(ツリーが疎な場合、Flutter アプリの場合、または省略された生の content-desc/bounds が必要な場合)は、android-bridge dump を使ってください。ラベル付き/インタラクティブなノードをすべて座標付きで保持します。
  3. 生の XML を使うのは最後の手段です(dump でもうまくいかない場合)。
    android-bridge shell "uiautomator dump /sdcard/d.xml && cat /sdcard/d.xml"
    
    bounds="[x1,y1][x2,y2]" からタップ位置の中心を計算します → ((x1+x2)/2, (y1+y2)/2).
  4. screenshot/snapshot --out は読み取れない画像ファイルを生成します。認識のために呼び出してはいけません。詳しくは、以下の「スクリーンショットが役立つ場合」を参照してください。

デフォルトの手順(テキスト専用モデル): snapshot(フォールバックは dump)で認識 → 要素を特定 → tap → snapshot で確認します。ピクセルの読み取りには頼らないでください。

視覚機能を備えたモデル

snapshot --out shot.png を使うと、アクセシビリティツリーのテキストと、読み取り可能なスクリーンショットの両方を取得できます。テキストツリーだけでは曖昧さを解消できない場合に、画像を使ってください(content-desc のないアイコン、キャンバスに描画されたコンテンツ、レイアウトの妥当性確認など)。座標の主な情報源は、引き続きテキストツリーです。

スクリーンショットが役立つ場合(すべてのモデル)
  • ファイルを人間に渡して、視覚的に確認してもらいます(screenshot --out x.png)。
  • マルチエージェント構成で、ファイルを視覚機能を備えたモデルに渡します。
  • 失敗状態のデバッグ用アーティファクトとして保存します。

テキスト専用モデルでも、こうした目的でスクリーンショットを撮ることはできます。ただし、自分で分析することはできません。

画面の読み取り

snapshot — 整理された表示(ネイティブアプリのデフォルト)
=== Visible Text ===
  下午3:53
  晴 28℃

=== Interactive Elements ===
  [0] 时钟 (540,399) [click]
  [1] 设置 (921,806) [click]

各要素の形式は [index] name (cx, cy) [capabilities] です。中心座標をそのまま tap に使ってください。

snapshot --json-out を使うと、各要素に class_name、resource_id、bounds が追加されます。同じテキストの要素を区別したり、中心からずらしてタップする位置を計算したりする場合に使ってください。

dump — ノードの完全なダンプ(Flutter/Compose/Canvas アプリで使用)

snapshot は、ラベルがあっても clickable としてフラグ付けされていないノードを省略します(Flutter はテキストを content-desc に格納し、clickable フラグを省略することがよくあります)。dump では省略されません。

=== UI Dump ===
screen: 1080x2400  nodes: 44  shown: 44

  [0] 社区小医生,全城专家求我会诊 (540,395) bounds=[0,160][1080,275] class=TextView
  [1] 底部tab-我的 (940,1850) [click] bounds=[800,1800][1080,1900] class=ImageView

各ノードの形式は [index] label (cx,cy) [flags] bounds=[x1,y1][x2,y2] class=X rid=Y です。

[flags] には、機能(click、long-click、checkable、scroll)と状態(checked = スイッチ/チェックボックスがオン、focused = 入力欄にフォーカスあり、selected = アクティブなタブ/項目、disabled = グレー表示、blocked = 同じ範囲内に無効な子要素があるクリック可能なラッパー)の両方が含まれます。状態フラグを見れば、スクリーンショットなしでスイッチのオン/オフや、どの EditText がアクティブかを判断できます。

[blocked] は重要です:[blocked] が付いた [click] ノードは、clickable=true のラッパーが、同じ範囲内の clickable=false のノード(無効状態)と重なっていることを意味します。[click] と表示されていても、実際のコントロールはタップできません。動作を期待して [click,blocked] ノードをタップしないでください。ボタンは無効状態です(たとえば、必須フィールドを入力するまでグレー表示のままの「次へ」など)。

  [3] 定时发布 (908,1505) [click,checkable,checked] bounds=[831,1454][985,1556] class=Switch
  [4] — (540,1479) [click,focused] bounds=[0,599][1080,2359] class=EditText rid=body
  • 切り替えルール:snapshot がインタラクティブ要素を約3個未満しか返さない場合、または対象がラベルのない ImageView/View として表示される場合は、dump に切り替えてください。Flutter/Compose/Canvas アプリ(例:com.bytedance.writer_assistant_flutter)では、デフォルトで dump を使ってください。
  • dump --clickable — インタラクティブなノードのみを表示します(ツリーが大きい場合に出力を絞り込めます)。
  • dump --json-out — プログラムで利用するための完全なフィールドを出力します。省略されない content_desc と、すべての状態フラグが含まれます。
  • dump --max N — 表示するノード数の上限を設定します(デフォルトは200。切り詰めがある場合は stderr で警告されます)。

テキスト入力(ASCII および CJK)

type は ASCII 専用です。CJK/Unicode の入力には、ADBKeyBoard 経由で type-cjk を使用します。

android-bridge type-cjk "中文内容"              # field must already have focus
android-bridge type-cjk "中文内容" --at 638 779 # tap field first, then type

複数行の入力、- で始まるテキスト、または機密情報を入力する場合は、位置引数とシェル履歴を避けてください。

android-bridge type-cjk --file input.txt --at 638 779
cat input.txt | android-bridge type-cjk --stdin --at 638 779
android-bridge type-cjk -- "-leading-dash text"

入力コマンドは文字数を報告し、エラー時にはペイロードを抑制します。入力に失敗した場合も、以前の IME に復元されます。ファイル/標準入力の内容は、改行を含めて保持されます。フィールドへの入力は、引き続き snapshot/dump で確認する必要があります。

関連情報:

android-bridge clear-field                      # clear focused field
android-bridge clear-field --at 638 779         # tap first, then clear
android-bridge select-all                       # Ctrl+A in focused field
android-bridge select-all --at 638 779          # tap first, then select all

--at x y はフィールドをタップし、IME を ADBKeyBoard に切り替えてから、再度タップして InputConnection をバインドし、その後に操作します。再度タップする理由については、「落とし穴」を参照してください。

ADBKeyBoard のブロードキャストを手動で送信する場合(まれ):

android-bridge shell "am broadcast -a ADB_INPUT_B64 --es msg '$(echo -n '文本' | base64)'"
android-bridge shell "am broadcast -a ADB_CLEAR_TEXT"
android-bridge shell "am broadcast -a ADB_INPUT_TEXT --es mcode '4096,29'"  # Ctrl+A
android-bridge shell "am broadcast -a ADB_INPUT_CODE --ei code 67"          # KEYCODE_DEL

スクロール

android-bridge swipe 540 1500 540 500    # scroll down
android-bridge swipe 540 500 540 1500    # scroll up
android-bridge swipe 800 1200 200 1200   # scroll left
android-bridge swipe 200 1200 800 1200   # scroll right

落とし穴

Flutter/Compose のアクセシビリティツリーが疎な場合

症状:snapshot にインタラクティブな要素がほとんど表示されない、またはまったく表示されない。あるいは、対象のテキストが座標なしで表示される。下部のタブバーが消える。 原因:Flutter は Dart でジェスチャーを処理し、アクセシビリティノードに clickable を設定しません。snapshot は clickable/scrollable ノードのみをインタラクティブな要素として列挙します。 対処法:android-bridge dump を使用します。これにより、ラベル付き/インタラクティブなすべてのノードが bounds と中心座標とともに保持されます。Flutter/Compose/Canvas アプリでは、デフォルトで dump を使用してください。

アニメーション中の UI で uiautomator dump が失敗する場合

症状:snapshot/dump が ERROR、「could not get idle state」、または空の結果を返します。 原因:Flutter の連続的な描画(アニメーション/読み込みスピナー)により UI がアイドル状態にならず、uiautomator が安定したフレームを取得できません。 対処法:最大 3 回まで再試行し、それでも失敗する場合は android-bridge shell "uiautomator dump --compressed /sdcard/d.xml && cat /sdcard/d.xml" を実行します。それでも失敗する場合は、既知の画面上の位置を使って盲目的に操作し、次の snapshot で確認してください。

コーチマーク/オンボーディングのオーバーレイ

症状:対象の座標をタップしても何も起きません。snapshot/dump に、実際の UI の上に「我知道了/知道了/跳过/Got it」という単一のボタンがある暗いオーバーレイが表示されます。 原因:初回起動時のコーチマークがタッチを遮っています。 対処法:まずオーバーレイを閉じます(ボタンをタップ)。再認識して実際の UI が表示されていることを確認してから、元の対象を操作してください。

下部のタブバーがアクセシビリティツリーにない場合

症状:画面上に下部のタブバーが見えているのに、snapshot に要素がありません。 対処法:まず dump を試してください(タブのテキストは content-desc にあることがよくあります)。それでも見つからない場合は画面上の位置を使います。タブは画面下部(1080×2400 の場合はおよそ y=2284)にあり、インデックス順に等間隔で並びます(5 つのタブなら x≈139,340,540,740,940)。tap <x> <y_bottom> を実行してください。または press back で戻って再度開いてください(再表示後にノードが現れることがあります)。

テキスト専用モデルには視覚機能がない場合

症状:Read shot.png では有用な情報が得られません。snapshot --out のスクリーンショットにも情報がありません。 対処法:確認手順として「スクリーンショットを見る」方法は決して使わないでください。画面の確認が必要な場合は、すべて次の手順で行います:snapshot → dump → 生の uiautomator dump XML → android-bridge shell --root "logcat -d -t 50" → android-bridge shell "dumpsys window | grep -E 'mCurrentFocus|mFocusedApp'"。

FLAG_SECURE による黒いスクリーンショット

症状:screenshot --out x.png を実行すると、真っ黒または空白の PNG が生成されます。 原因:アプリが FLAG_SECURE を設定しています(銀行アプリ、一部のエディター、DRM など)。 対処法:スクリーンショットを使わず、snapshot/dump を使用してください(アクセシビリティツリーは FLAG_SECURE の影響を受けません)。

snapshot --out は単独で使用可能(--vision は不要)

--vision は非推奨です。snapshot --out x.png は単独でスクリーンショットを撮影して保存します。(以前は --save に --vision が必要でしたが、この依存関係はなくなりました。--save は引き続きエイリアスとして利用できます。)

--out なしで screenshot を実行すると、base64 が標準出力に出力されます

テキスト専用モデルでは、これは長くて読みづらい文字列となり、コンテキストを圧迫します。base64 を処理できる視覚機能付きモデルを使用している場合、またはファイルにリダイレクトする場合に限り、screenshot(--out なし)を使用してください。screenshot --out x.png の使用を推奨します(ファイルはコンテキストではなくディスクに保存されます)。

一時的なフィードバック(トースト/スナックバー)— テキストのみで安全に検出する方法

snapshot がすべての一時的なフィードバックを取得できないと思い込まないでください。次の2つは異なります。

  • スナックバー(Material、Flutter の SnackBar)は、アプリのビュー階層/Flutter のセマンティクス内にあります。表示中(約4秒)は、snapshot/dump に text/content-desc ノードとして取得されます。保存または送信後はすぐに再認識し、新しいメッセージノードがないか確認してください。
  • ネイティブ Android のトーストは別のウィンドウレイヤーに描画されるため、snapshot/dump には含まれません。ネイティブのトーストテキストを取得できる信頼性の高いテキスト経路はありません。adb logcat は Toast.show() を記録せず、dumpsys window にはウィンドウのトークンは表示されますが、テキストは表示されません。

推奨する成功確認方法(テキストのみ):

  1. 操作の直後に snapshot/dump を実行し、スナックバーのメッセージノード、および/または画面状態の変化(画面遷移、新しい要素、更新されたフィールド)を確認します。
  2. 一時的なテキストが実際に見つからない場合は、代わりに操作後の状態を確認します。android-bridge shell "dumpsys activity top | grep mResumedActivity" を実行してアクティビティが変わったかを確認するか、次の snapshot で永続的な変化を確認します。
  3. ネイティブトーストの正確なテキストを読み取る必要があり、ビジョンモデルがない場合は、可能な範囲で --windows ダンプを使用します(信頼性が低く、タイミングに左右されます)。android-bridge shell "uiautomator dump --windows /sdcard/d.xml && cat /sdcard/d.xml" | grep -iE 'toast|TransientNotification'
  4. 1〜3で確認できない場合、テキストのみのモデルではこのフィードバックを読み取れません。その旨を伝えてユーザーに目視で確認してもらうか、スクリーンショットをビジョン対応モデルに委任してください。見たふりをしないでください。
ADBKeyBoard には InputConnection が必要です

ADBKeyBoard のブロードキャストは、フォーカスされたフィールドへのアクティブな InputConnection がある場合にのみ機能します。ime set の後は、接続を確立するため、必ず入力フィールドを再度タップしてください。type-cjk/clear-field/select-all の --at オプションを使うと、この処理が自動で行われます。 手動のブロードキャストを使っていて、何も起きずに失敗する場合、原因はほとんどの場合、IME を切り替えた後に InputConnection を再確立していないこと(タップし直していないこと)です。 標準外の InputConnection を使うアプリ向けの代替方法(まれなケース):

android-bridge shell --root "input keyevent KEYCODE_MOVE_END"
for i in $(seq 1 30); do android-bridge shell --root "input keyevent 67"; done   # KEYCODE_DEL x30
キーイベントの大量連続送信を避ける

動作するキーコードがあることを期待して、無関係なキーコードをまとめて送信しないでください(例:input keyevent 28 29 30 ...)。意図しないアプリの起動や画面遷移が発生する可能性があります。必要なキーイベントだけを送信してください。

input keycombination と ADBKeyBoard の mcode の違い

input keycombination は InputManagerService を介してハードウェアレベルの KeyEvent を注入します。IME チャネルは経由しません。フォーカスされた EditText でテキストを選択する場合(Ctrl+A、Ctrl+C)は、ADBKeyBoard の mcode ブロードキャストを使用してください(InputConnection を経由するため、より信頼性があります)。

# Prefer (IME channel):
android-bridge shell "am broadcast -a ADB_INPUT_TEXT --es mcode '4096,29'"
# Over (hardware injection — may not reach the editor):
android-bridge shell --root "input keycombination 113 29"

デバイスとプロファイルのセットアップ

インストール
pipx install git+https://github.com/briqt/android-bridge.git
デバイスの接続
  1. android-bridge devices を実行し、接続済みのデバイスを確認します。
  2. 接続されていない場合は、デバイスの IP アドレス(WiFi ADB)またはシリアル番号(USB)をユーザーに尋ねてから、android-bridge connect <ip_or_serial> を実行します。
  3. USB 経由ですでに接続されている場合、または接続情報が記憶されている場合は、引数なしで android-bridge connect を実行すると自動検出されます。
  4. 接続すると、デバイス情報が記憶されます。
デバイスのスリープ解除

UI 操作を行うには、デバイスがスリープ解除されている必要があります。snapshot が "null root node" で失敗する場合:

android-bridge press KEYCODE_WAKEUP
マルチデバイス(プロファイル)

特定のデバイスを対象にするには、--profile/-p を使用します。

android-bridge -p mi11 snapshot
android-bridge -p tablet tap 500 800

プロファイルは ~/.config/agent-skills/android-bridge/config.json にあります。選択の優先順位は、--profile フラグ > active フィールドです。

UI/IME コマンドでは、トップレベルまたは各プロファイル内で root_mode を指定できます。 auto(デフォルト)は通常のシェル権限を使用し、明示的な権限拒否が発生した場合にのみ root で再試行します。required は直接 root を使用し、never は権限昇格を禁止します。 入力に root が必要なデバイスについては、そのプロファイルに "root_mode": "required" を設定してください。あるデバイスの電源や root に関するルールを、他のデバイスに適用しないでください。

UI_ROOT_UNAVAILABLE、UI_NOT_IDLE、UI_DUMP_TIMEOUT、ADB_OFFLINE、ADB_UNAUTHORIZED は、最初に発生した失敗原因を保持します。UI キャプチャでは一意のリモートファイルを使用し、後で削除します。XML キャプチャの失敗を、ローカルファイルが存在しないこととして解釈しないでください。

ADB が PATH にない場合

設定で adb_path を指定します。

{ "adb_path": "/usr/local/bin/adb" }
リモート ADB サーバー(例:WSL から Windows ホストに接続)
{ "adb_host": "127.0.0.1", "adb_port": 5038 }

すべての adb コマンドに -H <host> -P <port> を追加します。

設定リファレンス

ランタイムデータは ~/.config/agent-skills/android-bridge/config.json にあります。

{
  "active": "mi11",
  "adb_path": "",
  "adb_host": "",
  "adb_port": 5037,
  "profiles": {
    "mi11": { "serial": "192.168.31.20:5555", "root_mode": "required" }
  },
  "device": { "serial": "" }
}
  • active — --profile が指定されていない場合のデフォルトプロファイルです。
  • adb_path/adb_host/adb_port — ADB バイナリとサーバーの場所です。
  • profiles — 名前付きデバイスです(serial は IP:port または USB シリアルです)。
  • device.serial — プロファイルがアクティブでない場合に使用する、記憶されたデバイスです(connect によって書き込まれます)。

設定の読み込み優先順位:現在の作業ディレクトリにある .config.json(開発用の上書き設定で、gitignore 対象)が標準の場所より優先されます。最初に見つかった設定が使用され、マージはされません。

すべてのコマンドは、stderr の先頭行に [profile: <name>] を出力します(アクティブなプロファイルがない場合は [profile: default] です)。これは意図的な仕様です。アクティブなデバイスの確認に使用してください。

コメント