Android: 電話またはエミュレータ
プロジェクトのメモ
各プロジェクトは、エミュレータとアプリの情報を .claude/android-emulator.md に記述します:AVD名、アプリID(UIラボ用があればそれも)、そしてプロジェクト固有の実行スクリプト。まずこれを読みます。それがない場合は、$ANDROID_HOME/emulator/emulator -list-avds を実行し、プロジェクト名にちなんだAVDを選びます。該当するものがなければ所有者に尋ね、メモを書き込みます。
ツール: sdk="${ANDROID_HOME:-$HOME/Library/Android/sdk}", adb="$sdk/platform-tools/adb"。GradleにはJDKが必要:JAVA_HOME、なければHomebrewの openjdk@21(/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home)、さらに Android Studio にバンドルされたもの(/Applications/Android Studio.app/Contents/jbr/Contents/Home)を使用します。
どのデバイスを使うか
所有者の電話が優先:adb devices で表示されるシリアル番号が emulator- で始まらないもの(USBまたはワイヤレスデバッグ)。電話がなければ、プロジェクトのエミュレータを使用します。所有者がどちらかを指定することもできます。その場合、DEVICE=phone、DEVICE=emulator、DEVICE=<シリアル> のようにしてプロジェクトスクリプトに選択を伝えます。
デバイスを選んだら、別のデバイスが接続される可能性があるため、adb には常に -s <シリアル> を渡します。
エミュレータ
エミュレータは必要な時だけ起動し、タスク完了後に停止します(数GBのメモリを消費するため)。プロジェクトに scripts/emulator.sh があればそれを使います。ない場合はこのスキルの scripts/emulator.sh(スキル読み込み時に表示されるベースディレクトリにあります)を、メモから取得した AVD=<名前> と共に使用します:
AVD=<名前> <スキルディレクトリ>/scripts/emulator.sh up # ヘッドレス起動;Androidの起動完了を待ち、シリアル番号を出力
AVD=<名前> <スキルディレクトリ>/scripts/emulator.sh status
AVD=<名前> <スキルディレクトリ>/scripts/emulator.sh down # クイックブートスナップショットを保存し、次回の up を数秒で完了
up は他の動作中のエミュレータを先にシャットダウンします(スクリプトとadbが最初のものを選ぶため)。KEEP_OTHERS=1 でそれらを維持できます。WINDOW=1 でウィンドウを表示します(所有者が見たい場合)。ビルドを並行して進められる場合は、up をバックグラウンドで実行します。失敗した場合のログは ${TMPDIR:-/tmp}/emulator-<avd>.log にあります。
ビルド、インストール、起動
プロジェクトのスクリプットを優先します(メモに実行スクリプト、UIラボスクリプトが記載されています)。手動で行う場合:
- プロジェクトが対応している場合は、デバイスのABIのみをビルドします(
-Pabi=$(adb -s <シリアル> shell getprop ro.product.cpu.abi)、またはプロジェクトスクリプトの場合はABI=)。ネイティブライブラリが含まれるとフルAPKがワイヤレスデバッグで送信するには重くなります。 adb -s <シリアル> install -r <apk>を実行します。-rはアプリのデータを保持します。所有者の電話上のアプリを許可なくアンインストールしたりpm clearしたりしないでください。実際のデータが失われる可能性があります。adb -s <シリアル> shell am start --user current -S -f 0x10008000 -n <アプリID>/<アクティビティ>でアプリを起動します:-Sは古いプロセスを停止して新しいビルドを実行、--user currentはセキュアフォルダがある電話で必要、フラグ(新しいタスク、古いタスクをクリア)によりAndroidが以前の画面を再開するのを防ぎます。
確認
- スクリーンショット:
adb -s <シリアル> exec-out screencap -p > <ファイル>.pngを実行し、ファイルを確認します。電話からの画像が真っ黒な場合はロックされています:所有者にロック解除を依頼してください。 - タップとテキスト入力による操作:
adb -s <シリアル> shell input tap <x> <y>、input text <テキスト>、input keyevent KEYCODE_BACK。座標はadb -s <シリアル> exec-out uiautomator dump /dev/ttyで確認できます。 - ログ:
adb -s <シリアル> logcat -d --pid=$(adb -s <シリアル> shell pidof <アプリID>)、またはタグ指定で-s <タグ>。クラッシュログ:adb -s <シリアル> logcat -d -b crash。 - ダークモードとロケールのエッジケース:
adb -s <シリアル> shell cmd uimode night yes|no。ロケールの変更はエミュレータ上のみで行い、所有者の電話では変更しないでください。
各結果がどのデバイスから得られたかを所有者に伝えてください。電話上で変更した項目(ダークモードなど)は、タスク完了後に元に戻し、起動したエミュレータは停止してください。