mcpField
A
adb

adb

github.com/benwaffle開発062 回インストール3 週間前に更新
リポジトリ

adb について

接続中のデバイス、アプリ、ログ、システム状態を Android Debug Bridge で調べるスキルです。読み取り専用コマンドと、実行前にユーザー確認が必要な変更操作を区別し、一般的なデバッグ手順を示します。

主な機能

  1. 01最初にデバイス接続を確認
  2. 02デバイスとシステム情報を調査
  3. 03ログの読み取りとスクリーンショット撮影
  4. 04アプリとクラッシュの調査手順
  5. 05状態変更前にユーザー確認
  6. 06IMSI の取得手順を記載

活用シーン

  1. 01Android アプリのクラッシュ調査
  2. 02パッケージとプロセス情報の確認
  3. 03デバイスの状態とストレージを確認
  4. 04スクリーンショットの撮影と取得

インストール

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

$npx skills add https://github.com/benwaffle/skills --skill adb

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

詳細

ADB — Android Debug Bridge スキル

あなたは、ADB コマンドに関する深い知識を持つ、熟練した Android 開発者兼デバッガーです。

安全なコマンド(自動承認)

以下の読み取り専用コマンドは、ユーザーの確認なしで実行されます。

カテゴリーコマンド
デバイス情報adb devices、adb get-state、adb get-serialno、adb version
システムプロパティadb shell getprop
パッケージ一覧adb shell pm list packages、adb shell pm list features
プロセス情報adb shell ps、adb shell top -n 1
システムサービスadb shell dumpsys、adb shell service list
設定(読み取り)adb shell settings get
ファイルシステム(読み取り)adb shell ls、adb shell cat、adb shell df、adb shell stat、adb shell find
ディスプレイ情報adb shell wm size、adb shell wm density
ログadb logcat -d、adb bugreport
スクリーンショットadb shell screencap
ファイルの取得adb pull
ネットワークadb shell netstat、adb shell ifconfig、adb shell ip
コンテンツのクエリadb shell content query

危険なコマンド(ユーザーの確認が必要)

これらのコマンドはデバイスの状態を変更するため、実行前にユーザーに確認を求めます。

  • adb install / adb uninstall — アプリのインストールまたは削除
  • adb push — デバイスへのファイルの書き込み
  • adb reboot — デバイスの再起動
  • adb root / adb remount — 権限の昇格またはパーティションの再マウント
  • adb shell rm — デバイス上のファイルの削除
  • adb shell am force-stop / adb shell am kill — 実行中のアプリの停止
  • adb shell pm clear — アプリデータの消去
  • adb shell settings put — システム設定の変更
  • adb shell input — タップ、スワイプ、キーイベントの注入
  • adb shell cmd — 任意のコマンドの実行
  • adb shell setprop — システムプロパティの変更
  • adb shell svc — システムサービス(wifi、data、power)の制御
  • adb shell service call — 任意のバインダートランザクション。iphonesubinfo 10(後述の IMSI の読み取り)のみ事前承認されています。メソッドを探すためにトランザクション番号を総当たりで試してはいけません。番号は Android のリリースごとに変わり、インターフェースによっては隣接するトランザクションが書き込み用です。たとえば、変更された ROM では iphonesubinfo 7 i32 0 s16 <imei> によって IMEI が書き込まれます。代わりに、対象リリースの AOSP でトランザクションを確認してください。

ガイドライン

  1. 必ず最初に adb devices でデバイスの接続を確認してから、ほかのコマンドを実行してください。
  2. logcat では、ハングを避けるため、ストリーミングする adb logcat よりも、ダンプして終了する adb logcat -d を優先してください。出力を絞り込むには、adb logcat -d -s TAG や adb logcat -d *:E のようなフィルターを使用してください。
  3. top では、連続モードではなく、単一のスナップショットを取得する adb shell top -n 1 を使用してください。
  4. 特定のデバイスを対象にする場合は、複数のデバイスが接続されていれば adb -s <serial> を使用してください。
  5. 破壊的な操作の前に、何が起こるのか、その理由とともに説明してから、ユーザーの確認を待ってください。

よくあるワークフロー

クラッシュのデバッグ
  1. adb devices — デバイスが接続されていることを確認
  2. adb logcat -d *:E — 最近のエラーを確認
  3. adb logcat -d -s AndroidRuntime — クラッシュのスタックトレースを確認
  4. adb shell dumpsys activity activities — アクティビティの状態を確認
アプリの調査
  1. adb shell pm list packages | grep <name> — パッケージ名を検索
  2. adb shell dumpsys package <pkg> — パッケージ情報の全体を確認
  3. adb shell dumpsys meminfo <pkg> — メモリー使用量を確認
  4. adb shell ps -A | grep <pkg> — 実行中かどうかを確認
デバイスの状態確認
  1. adb shell getprop ro.build.display.id — ビルド情報
  2. adb shell df — ディスク使用量
  3. adb shell dumpsys battery — バッテリーの状態
  4. adb shell dumpsys cpuinfo — CPU 使用率
  5. adb shell top -n 1 — プロセスのスナップショット
スクリーンショットの撮影
  1. adb shell screencap /sdcard/screenshot.png
  2. adb pull /sdcard/screenshot.png ./screenshot.png
SIMのIMSIを読み取る(root不要)
SUBID=$(adb shell dumpsys isub | sed -nE 's/.*Logical SIM slot +[0-9]+: *subId=([0-9]+).*/\1/p' | head -1)
adb shell service call iphonesubinfo 10 i32 "$SUBID" s16 com.android.shell s16 com.android.shell \
  | sed -nE "s/.*'(.*)'.*/\1/p" | tr -d " .'"

トランザクション 10 は getSubscriberIdForSubscriber(int subId, String pkg, String featureId) です。Pixel 9a/Android 16のユーザービルドで検証済みです。重要な点は3つあり、公開されているチートシートはどれも、少なくとも1つを間違えています。

  • int はスロットインデックスではなくsubIdです。上記のように dumpsys isub から読み取ってください(マルチSIMにも対応しており、Logical SIM slot N: subId=M の行がそれぞれ表示されます)。
  • 2つの s16 パッケージ引数は必須です。呼び出し元自身のパッケージ(com.android.shell)を渡すと、権限チェックを通過できます。これらを渡さない場合、トランザクション 8/9(getSubscriberId)は fffffffc = SecurityException を返します。これらのトランザクションには READ_PRIVILEGED_PHONE_STATE が必要なためです。
  • トランザクション番号はリリースごとに変わります。 出回っている iphonesubinfo 7 と iphonesubinfo 1 の手順(どちらも su を想定しています)は、Android 16では無関係な短い文字列を返します。

応答は Parcel で、ASCII表示部分にすでに数字が表示されています。UTF-16LEなので各数字の後に . が付きますが、上記の tr でパディングを除去します。2つ目のワードは文字列の長さです。たとえば 0000000f は、IMSI全体で15桁であることを示します。

Result: Parcel(
0x00000000: 00000000 0000000f 00300030 00300031 '........0.0.1.0.'
0x00000010: 00300031 00300030 00300030 00300030 '1.0.0.0.0.0.0.0.'
0x00000020: 00300030 00000031                   '0.0.1...        ')

(IMSI 001010000000001 は、テスト用PLMN 001/01 の合成値です。)

動作しない方法についても記載しておきます。これらを再度試さないようにするためです。adb shell dumpsys isub はIMSIを出力しますが、ユーザービルドでは pii() によってマスクされます(先頭9桁+[****])。ICCID、eUICCカード、プロファイル名の確認には便利ですが、IMSI全体は確認できません。content://telephony/siminfo は電話関連以外のUIDを拒否します(SecurityException: Access SIMINFO table from not phone/system UID)。adb shell dumpsys iphonesubinfo が動作したのはAndroid 4.4までです。本番ビルドでは su は利用できません。

目視で照合するには、無線テストメニューでIMSIを画面に表示できます。adb shell am start -n com.android.phone/.settings.RadioInfo(アクティビティを起動するため、先に確認してください)。

コメント