deep-code-review
In-depth design-focused code review - understands codebase context before evaluating PR changes, posts structured feedback to GitHub
Test Expo Router features on Android emulators using ADB. Use after implementing native Android features or when verifying UI behavior on Android.
$ npx -y skills add expo/expo --skill android-e2e-testing --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/android-e2e-testingContext preview
The summary Claude sees to decide when to auto-load this skill.
Test Expo Router features on Android emulators using ADB. Use after implementing native Android features or when verifying UI behavior on Android.
name: android-e2e-testing description: Test Expo Router features on Android emulators using ADB. Use after implementing native Android features or when verifying UI behavior on Android. user-invokable: true
Use `adb` to manually test Expo Router screens and components on Android emulators.
An Android emulator must be running. Prefer **Pixel emulators** over tablet ones for standard phone-sized testing.
# Verify emulator is connected adb devices # Check which emulator is running adb -s DEVICE_ID emu avd name # Check screen resolution (important for coordinate calculations) adb -s DEVICE_ID shell wm size
Package name: `dev.expo.routere2e`
Each app in `apps/router-e2e/__e2e__/` has a corresponding `yarn android:<name>` script. Check `apps/router-e2e/package.json` for available scripts.
cd apps/router-e2e yarn android:[APP_NAME] # e.g. yarn android:native-navigation
If the app is already built, relaunch it:
adb shell monkey -p dev.expo.routere2e -c android.intent.category.LAUNCHER 1
To find the package name of any installed app:
adb shell pm list packages | grep -i <keyword>
**CRITICAL: Always use `uiautomator dump` for element coordinates.** Screenshot pixel coordinates have display scaling factors that make them unreliable for `adb shell input tap`. The UI dump provides actual device coordinates.
adb shell uiautomator dump /sdcard/ui.xml && adb shell cat /sdcard/ui.xml
This returns XML with every UI element including:
1. Search the XML for your target element by `text` or `content-desc` 2. Extract the `bounds` attribute: `bounds="[left,top][right,bottom]"` 3. Calculate center: `x = (left + right) / 2`, `y = (top + bottom) / 2` 4. Tap:
adb shell input tap <x> <y>
**Example:** For `bounds="[367,498][714,633]"`:
adb shell input tap 540 565
After tapping a navigation element, wait before verifying:
sleep 1
For slow transitions or heavy screens, use `sleep 2`.
adb shell input tap <x> <y>
# Scroll down adb shell input swipe 540 1500 540 500 300 # Scroll up adb shell input swipe 540 500 540 1500 300 # Scroll further (larger distance) adb shell input swipe 540 1500 540 200 500
adb shell input text "hello%sworld" # %s = space
adb shell input keyevent 4 # Back adb shell input keyevent 3 # Home adb shell input keyevent 82 # Menu / React Native dev menu
adb shell input swipe <x> <y> <x> <y> 1000
adb shell screencap -p /sdcard/screenshot.png && adb pull /sdcard/screenshot.png /tmp/screenshot.png
Then use the `Read` tool to view `/tmp/screenshot.png`. Screenshots are useful for:
**Note:** Use screenshots for _visual_ verification only. For element positions and tapping, always use `uiautomator dump`.
adb shell uiautomator dump /sdcard/ui.xml && adb shell cat /sdcard/ui.xml
Search the XML for expected content:
# React Native JS errors adb logcat -d -s ReactNativeJS:E | tail -20 # Crash logs adb logcat -b crash -d # All recent errors adb logcat -d *:E | tail -30
After testing, summarize results in a table:
| Test | Result | | --------------------------- | --------- | | Navigation to screen | PASS/FAIL | | Component renders correctly | PASS/FAIL | | Interaction works | PASS/FAIL | | No JS errors in logcat | PASS/FAIL |
Include details for any failures: what was expected vs what happened, relevant logcat output, and screenshots.
Preferably attach screenshots for features you tested.
Components from `@expo/ui/jetpack-compose` (like `HorizontalFloatingToolbar`, `IconButton`, `Host`) render as Compose views inside React Native. In UI dumps they appear as:
When testing Compose components:
1. Look for `content-desc` attributes to identify buttons (e.g., `content-desc="Clear selection"`) 2. The `ComposeView` wrapper may have different bounds than the inner interactive elements 3. Tap the interactive element's bounds, not the container's
This can happen during animations or transitions. Wait and retry:
sleep 2 && adb shell uiautomator dump /sdcard/ui
An open-source framework for making universal native apps with React. Expo runs on Android, iOS, and the web.
Repo: expo/expo
In-depth design-focused code review - understands codebase context before evaluating PR changes, posts structured feedback to GitHub
Write TSDoc comments for Expo SDK APIs following official conventions. MUST USE when introducing new user-facing TypeScript APIs in expo-* packages - document…
Run Expo's configured AI code reviewer on local changes or an expo/expo pull request, summarize findings and reviewer coverage, retain PR previews by default…