{"id":24632,"plugin_id":"plugins~Plugin_4efcdf475f9881919671c7eb6476b26b","kind":"skill","collection_source":null,"comparison_source":null,"observed_at":"2026-09-30T23:18:32.706Z","digest":"a63c2a0eaff0c7e15afa7de34754a62432fdd26b4e717b5b86f533922a9ed5cd","against":null,"payload":{"name":"android-emulator-qa","description":"Use when validating Android feature flows in an emulator with adb-driven launch, input, UI-tree inspection, screenshots, and logcat capture.","included_files":[{"relative_path":"LICENSE.txt","size_in_bytes":10776},{"relative_path":"agents/openai.yaml","size_in_bytes":408},{"relative_path":"scripts/ui_pick.py","size_in_bytes":1865},{"relative_path":"scripts/ui_tree_summarize.py","size_in_bytes":3318}],"skill_md_contents":"---\nname: \"android-emulator-qa\"\ndescription: \"Use when validating Android feature flows in an emulator with adb-driven launch, input, UI-tree inspection, screenshots, and logcat capture.\"\n---\n\n# Android Emulator QA\n\nValidate Android app flows in an emulator using adb for launch, input, UI-tree inspection, screenshots, and logs.\n\n## When to use\n- QA a feature flow in an Android emulator.\n- Reproduce UI bugs by driving navigation with adb input events.\n- Capture screenshots and logcat output while testing.\n\n## Quick start\n1) List emulators and pick a serial:\n   - `adb devices`\n2) Build and install the target variant:\n   - `./gradlew :<module>:install<BuildVariant> --console=plain --quiet`\n   - If unsure about task names: `./gradlew tasks --all | rg install`\n3) Launch the app:\n   - Resolve activity: `adb -s <serial> shell cmd package resolve-activity --brief <package>`\n   - Start app: `adb -s <serial> shell am start -n <package>/<activity>`\n4) Capture a screenshot for visual verification:\n   - `adb -s <serial> exec-out screencap -p > /tmp/emu.png`\n\n## adb control commands\n- Tap (use UI tree-derived coordinates):\n  - `adb -s <serial> shell input tap <x> <y>`\n- Swipe:\n  - `adb -s <serial> shell input swipe <x1> <y1> <x2> <y2>`\n  - Avoid edges (start ~150-200 px from left/right) to reduce accidental back gestures.\n- Text:\n  - `adb -s <serial> shell input text \"hello\"`\n- Back:\n  - `adb -s <serial> shell input keyevent 4`\n- UI tree dump:\n  - `adb -s <serial> exec-out uiautomator dump /dev/tty`\n\n## Coordinate picking (UI tree only)\nAlways compute tap coordinates from the UI tree, not screenshots.\n\n1) Dump the UI tree to a step-specific file:\n   - `adb -s <serial> exec-out uiautomator dump /dev/tty > /tmp/ui-settings.xml`\n2) Find the target node and derive center coordinates (`x y`) from bounds:\n   - Bounds format: `bounds=\"[x1,y1][x2,y2]\"`\n   - Helper script:\n   - `python3 <path-to-skill>/scripts/ui_pick.py /tmp/ui-settings.xml \"Settings\"`\n3) If the node is missing and there are `scrollable` elements:\n   - swipe, re-dump, and re-search at least once before concluding the target is missing.\n4) Tap the center:\n   - `adb -s <serial> shell input tap <x> <y>`\n\n## UI tree skeleton (helper)\nUse this helper to create a compact, readable overview before inspecting full XML.\n\n1) Dump full UI tree:\n   - `adb -s <serial> exec-out uiautomator dump /dev/tty > /tmp/ui-full.xml`\n2) Generate summary:\n   - `python3 <path-to-skill>/scripts/ui_tree_summarize.py /tmp/ui-full.xml /tmp/ui-summary.txt`\n3) Review `/tmp/ui-summary.txt` to choose likely targets, then compute exact bounds from full XML.\n\n## Logs (logcat)\n1) Clear logs:\n   - `adb -s <serial> logcat -c`\n2) Stream app process logs:\n   - Resolve pid: `adb -s <serial> shell pidof -s <package>`\n   - Stream: `adb -s <serial> logcat --pid <pid>`\n3) Crash buffer only:\n   - `adb -s <serial> logcat -b crash`\n4) Save logs:\n   - `adb -s <serial> logcat -d > /tmp/logcat.txt`\n\n## Package shortcuts\n- List installed packages:\n  - `adb -s <serial> shell pm list packages`\n- Filter to your namespace:\n  - `adb -s <serial> shell pm list packages | rg <company_or_app_id>`\n- Confirm the activity resolves before launching:\n  - `adb -s <serial> shell cmd package resolve-activity --brief <package>`\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}