一键导入
mobiai-android-device
Use when interacting with an Android device or emulator — run adb commands, automate UI, capture screenshots, read logcat, manage emulators.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Use when interacting with an Android device or emulator — run adb commands, automate UI, capture screenshots, read logcat, manage emulators.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
first community fixture skill
second community fixture skill
third community fixture skill
Actualiza el binario `mobiai` a la última versión publicada en GitHub Releases. Usá esta skill cuando el banner de SessionStart muestre "MobiAI update available" o cuando el usuario pida explícitamente actualizar MobiAI.
Use when starting any conversation — establishes how to find and invoke MobiAI skills, requiring `Skill` tool invocation before ANY response including clarifying questions, git/file reads, or code exploration
test fixture
| name | mobiai-android-device |
| description | Use when interacting with an Android device or emulator — run adb commands, automate UI, capture screenshots, read logcat, manage emulators. |
| license | MIT |
| compatibility | ["claude-code","cursor","copilot","codex"] |
| platforms | ["android"] |
Expert-level knowledge for interacting with Android devices and emulators via ADB.
adb devices -l
This shows all connected devices and emulators. Use -s <serial> to target a specific device, or -e for the only running emulator.
Use the helper script or run manually:
# List available AVDs
emulator -list-avds
# Start with recommended flags for automation
emulator -avd <avd-name> \
-no-window \
-no-audio \
-no-boot-anim \
-gpu swiftshader_indirect \
-no-snapshot-load
Wait for boot to complete:
adb -e wait-for-device
adb -e shell getprop sys.boot_completed # Returns "1" when ready
adb shell wm size
# Output: Physical size: 1080x2340
Always dump the UI before every interaction. This is the most important rule.
adb shell uiautomator dump /sdcard/ui.xml && adb pull /sdcard/ui.xml ./ui-dump.xml
Never cat the full XML — it can be thousands of lines and will blow up your context. Instead, search for the element you need:
# List all visible text elements with their bounds
grep -o 'text="[^"]*"[^/]*bounds="[^"]*"' ./ui-dump.xml
# Search for a specific element by text
grep -o '[^<]*text="Submit"[^/]*' ./ui-dump.xml
# Search by resource-id
grep -o '[^<]*resource-id="[^"]*btn_submit[^"]*"[^/]*' ./ui-dump.xml
# Search by content-desc
grep -o '[^<]*content-desc="[^"]*Close[^"]*"[^/]*' ./ui-dump.xml
Only cat ./ui-dump.xml as a last resort if grep doesn't find what you need.
The XML contains every visible element with:
text — visible text on the elementresource-id — programmatic ID (e.g., com.example.app:id/btn_submit)content-desc — accessibility labelbounds="[x1,y1][x2,y2]" — pixel coordinatesTo find tap coordinates: center = ((x1+x2)/2, (y1+y2)/2)
text="Submit"resource-id=".*btn_submit"content-desc="Submit button"Critical: Every tap MUST be followed by a UI dump AND logcat check in a single command. Dialogs auto-dismiss in 2-3 seconds — if you dump UI separately, the dialog is gone.
adb shell input tap <x> <y> && sleep 1 && adb shell uiautomator dump /sdcard/ui.xml && adb pull /sdcard/ui.xml ./ui-dump.xml && grep -o 'text="[^"]*"[^/]*bounds="[^"]*"' ./ui-dump.xml && echo "=== LOGCAT ===" && adb logcat -d -t 30
# Back button
adb shell input keyevent 4
# Home button
adb shell input keyevent 3
# Enter/OK
adb shell input keyevent 66
# Delete/Backspace
adb shell input keyevent 67
# Swipe (scroll down)
adb shell input swipe 540 1500 540 500 300
# Long press (swipe with same start/end)
adb shell input swipe <x> <y> <x> <y> 1000
Never use adb shell input text for text that goes into app fields — it triggers an Android "pasted from clipboard" notification that can break the app.
Type digits using keyevents:
| Digit | Keycode |
|---|---|
| 0 | 7 |
| 1 | 8 |
| 2 | 9 |
| 3 | 10 |
| 4 | 11 |
| 5 | 12 |
| 6 | 13 |
| 7 | 14 |
| 8 | 15 |
| 9 | 16 |
Example — type "1234":
adb shell input keyevent 8 9 10 11
For text fields where keyevents won't work (search, filters), use input text as a fallback.
Dialogs, toasts, and error popups auto-dismiss in 2-3 seconds. The UI dump may miss them entirely. But logcat always contains the error message that triggered the popup.
# Check for fatal exceptions
adb logcat -d | grep -A 10 "FATAL EXCEPTION"
# Check for ANR (Application Not Responding)
adb logcat -d | grep "ANR in"
# Dump last 50 lines with timestamps
adb logcat -d -t 50
# Get the app's PID
adb shell pidof com.example.myapp
# Filter by PID
adb logcat -d | grep <pid>
adb logcat -c
Always clear logcat before a test sequence to get clean logs.
adb shell screencap -p /sdcard/screenshot.png
adb pull /sdcard/screenshot.png ./screenshot.png
adb shell rm -f /sdcard/screenshot.png
# Start recording (max 180 seconds per Android limit)
adb shell screenrecord /sdcard/recording.mp4 &
# Stop recording
adb shell pkill -INT screenrecord
# Wait for finalization, then pull
sleep 3
adb pull /sdcard/recording.mp4 ./recording.mp4
For sessions longer than 180s, use segmented recording (start a new segment before the previous one ends).
# Launch an app
adb shell monkey -p com.example.myapp -c android.intent.category.LAUNCHER 1
# Force stop an app
adb shell am force-stop com.example.myapp
# Clear app data
adb shell pm clear com.example.myapp
# Install APK
adb install -r app-debug.apk
# Install split APKs
adb install-multiple base.apk config.apk
# Grant permissions
adb shell pm grant com.example.myapp android.permission.ACCESS_FINE_LOCATION
adb shell appops set <package> SYSTEM_ALERT_WINDOW allow
adb shell am force-stop com.android.settings
adb emu kill # Graceful kill
# If that fails:
taskkill /F /IM qemu-system-x86_64.exe # Windows
pkill qemu-system-x86_64 # macOS/Linux
adb kill-server && adb start-server
sys.boot_completed property