Run Jetpack Android App
wordpress-mobile/WordPress-Android
Builds the Jetpack debug app with Gradle and installs it on a connected Android device or an emulator started from an available AVD.
A skill your agent uses to move files between host and device with adb pull and adb push, including the modern -z (compression), -Z (no compression), --sync, and -a (preserve attrs) flags.
$ npx skills add skydoves/android-testing-skills --skill extracting-test-artifacts -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install skydoves/android-testing-skills extracting-test-artifacts --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/skydoves/android-testing-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/adb/transfer/extracting-test-artifacts .claude/skills/extracting-test-artifacts && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "extracting-test-artifacts" agent skill from https://github.com/skydoves/android-testing-skills/tree/main/adb/transfer/extracting-test-artifacts into .claude/skills/extracting-test-artifacts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extracting-test-artifacts", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/skydoves/android-testing-skills/tree/main/adb/transfer/extracting-test-artifactsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add skydoves/android-testing-skills --skill extracting-test-artifacts -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install skydoves/android-testing-skills extracting-test-artifacts --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/skydoves/android-testing-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/adb/transfer/extracting-test-artifacts .agents/skills/extracting-test-artifacts && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "extracting-test-artifacts" agent skill from https://github.com/skydoves/android-testing-skills/tree/main/adb/transfer/extracting-test-artifacts into .agents/skills/extracting-test-artifacts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extracting-test-artifacts", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add skydoves/android-testing-skills --skill extracting-test-artifacts -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install skydoves/android-testing-skills extracting-test-artifacts --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/skydoves/android-testing-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/adb/transfer/extracting-test-artifacts .cursor/skills/extracting-test-artifacts && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "extracting-test-artifacts" agent skill from https://github.com/skydoves/android-testing-skills/tree/main/adb/transfer/extracting-test-artifacts into .cursor/skills/extracting-test-artifacts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extracting-test-artifacts", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/skydoves/android-testing-skills.git --path adb/transfer/extracting-test-artifacts--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add skydoves/android-testing-skills --skill extracting-test-artifacts -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install skydoves/android-testing-skills extracting-test-artifacts --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/skydoves/android-testing-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/adb/transfer/extracting-test-artifacts .gemini/skills/extracting-test-artifacts && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "extracting-test-artifacts" agent skill from https://github.com/skydoves/android-testing-skills/tree/main/adb/transfer/extracting-test-artifacts into .gemini/skills/extracting-test-artifacts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extracting-test-artifacts", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install skydoves/android-testing-skills extracting-test-artifactsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add skydoves/android-testing-skills --skill extracting-test-artifacts -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/skydoves/android-testing-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/adb/transfer/extracting-test-artifacts .github/skills/extracting-test-artifacts && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "extracting-test-artifacts" agent skill from https://github.com/skydoves/android-testing-skills/tree/main/adb/transfer/extracting-test-artifacts into .github/skills/extracting-test-artifacts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extracting-test-artifacts", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add skydoves/android-testing-skills --skill extracting-test-artifacts -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install skydoves/android-testing-skills extracting-test-artifacts --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/skydoves/android-testing-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/adb/transfer/extracting-test-artifacts .opencode/skills/extracting-test-artifacts && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "extracting-test-artifacts" agent skill from https://github.com/skydoves/android-testing-skills/tree/main/adb/transfer/extracting-test-artifacts into .opencode/skills/extracting-test-artifacts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extracting-test-artifacts", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
extracting-test-artifactsA skill your agent uses to move files between host and device with adb pull and adb push, including the modern -z (compression), -Z (no compression), --sync, and -a (preserve attrs) flags.
Extracting Test Artifacts is an agent skill from skydoves/android-testing-skills. Use this skill to move files between host and device with adb pull and adb push, including the modern -z (compression), -Z (no compression), --sync, and -a (preserve attrs) flags. Covers the path-permission rules — /data/local/tmp/ is freely writable, /sdcard/ (alias /storage/emulated/0/) is shell-writable with scoped-storage rules on API 30+, /data/data/<pkg/ requires run-as <pkg on debuggable builds, and /sdcard/Android/data/<pkg/files/ is package-owned but pullable. Includes adb shell run-as <pkg cat <path for…
Its SKILL.md is about 4.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Mobile, covering Mobile testing and debugging. It works with Android and Gradle. The repository describes itself as: ⚡️ A set of skills for Android testing: Compose UI, AndroidX Test, JVM unit tests, and ADB. The licence is Apache-2.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 8665ed5. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
adbFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Extracting Test Artifacts loads about 4.4k tokens when it runs. Until then it costs about 259 tokens; SKILL.md has 1,494 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from skydoves/android-testing-skills at commit 8665ed5, republished under its Apache-2.0 licence (© skydoves). 1,494 words, ~4,449 tokens.
.claude/skills/extracting-test-artifacts/SKILL.md (or your agent's skills folder).This skill covers moving files between host and device, the path permission rules that decide whether a pull succeeds, and the androidx.test:services TestStorage API for routing per-test artefacts. Capture-on-failure orchestration (when to pull what) lives in ../../automation/scripting-adb-for-ci/SKILL.md.
adb pull /data/data/com.example/databases/main.db fails with "Permission denied"; the developer doesn't know run-as exists.exec-out is the fix.-z brotli)./sdcard/Android/data/com.example/files/screenshots/ and the developer wants to know whether that's pullable on API 30+ (it is, when the package owns it).TestStorage API.../../capture/capturing-screenshots-and-screenrecord/SKILL.md.../../observability/extracting-logs-with-logcat/SKILL.md.../../apps/installing-and-managing-apps/SKILL.md.../../control/injecting-input-and-state/SKILL.md.../../automation/scripting-adb-for-ci/SKILL.md.adb get-state returns device. See ../../devices/connecting-to-devices/SKILL.md.run-as: the target APK must be android:debuggable="true" in its merged manifest (the default debug build variant).-z brotli/zstd: platform-tools 30+ on the host and adbd ≥ Android 11 on the device.TestStorage: androidx.test:services and the -e useTestStorageService true argument to am instrument."Unlike the
installcommand, which only copies an APK file to a specific location, thepullandpushcommands let you copy arbitrary directories and files to any location in a device." — developer.android.com/tools/adb
adb pull <remote> [<local>] # device → host (defaults to cwd)
adb push <local> <remote> # host → devicepush [--sync] [-z ALGORITHM] [-Z] LOCAL... REMOTE
pull [-a] [-z ALGORITHM] [-Z] REMOTE... LOCAL| Flag | Meaning |
|---|---|
-z <algo> | Enable compression. <algo> ∈ any / none / brotli / lz4 / zstd. any lets adbd pick. |
-Z | Disable compression. |
--sync (push only) | Only push files with different timestamps — fast incremental updates. |
-a (pull only) | Preserve file timestamp and mode. |
-n | Dry-run. |
-q | Suppress progress messages. |
The legacy adb pull -p (show progress) is now a no-op — modern adb shows progress by default and -q silences it. Don't rely on -p in CI scripts.
This is the load-bearing table. Most "permission denied" adb pull failures come from misunderstanding it.
| Path | adb shell writable? | pull works? |
|---|---|---|
/data/local/tmp/ | Yes | Yes |
/sdcard/ (= /storage/emulated/0/) | Yes (scoped storage rules on API 30+) | Yes |
/data/data/<pkg>/ | Only via run-as <pkg> (debuggable builds) | Only via run-as |
/sdcard/Android/data/<pkg>/files/ | Package-owned, scoped storage | Yes for the owning package, and yes for adb shell (FUSE/sdcardfs bridge) |
/data/local/tmp/Readable/writable by the shell user that backs adb. No app-permission ceremony required. Use as the staging directory for everything: pushed APKs, test data, captured screenshots, JSON inputs, dexed instrumentation jars.
Caveat: your app runs as u0_aXX, not shell, so the app cannot read shell-written files unless you chmod 0644 and the parent is world-readable. /data/local/tmp/ itself is 0771, so be deliberate when pushing files the app must read.
/sdcard/Alias /storage/emulated/0/, sometimes /storage/self/primary/. Public/external storage. ADB's shell user retains FUSE/sdcardfs access on API 30+, so adb push /sdcard/... and adb pull /sdcard/... work for tests even after scoped storage tightening. App-side writes are gated through MediaStore on API 30+.
/data/data/<pkg>/ — run-as onlyOwned by the app's UID; 0700 on the dir itself. A bare adb pull /data/data/com.example/... fails on production user builds. Two viable paths:
run-as <pkg> on debuggable builds (most common).adb root on userdebug/eng builds (covered briefly in ../../automation/scripting-adb-for-ci/SKILL.md)./sdcard/Android/data/<pkg>/files/The app's "external private" storage — written from the app via Context.getExternalFilesDir(null). Readable from adb shell because it lives under FUSE-emulated SD card. The path of least resistance for "write artefact, pull from CI" on Android 11+:
# Inside the test app:
val out = File(context.getExternalFilesDir(null), "screenshots/fail.png")# From CI:
adb pull /sdcard/Android/data/com.example/files/screenshots/fail.png ./run-as on debuggable buildsrun-as <pkg> is a setuid helper baked into Android since Gingerbread. It drops shell into the app's UID if and only if the APK has android:debuggable="true" in its merged manifest (the default for the debug build variant). Usage: adb shell run-as <pkg> <cmd>.
adb shell run-as com.example.app cat databases/main.db > main.dbThis works for short text files. For binary files it can corrupt bytes via PTY translation (see exec-out below).
exec-out + tarFor directories, binary files, or anything with \n in the bytes, MUST use exec-out (binary-clean stdout) and pipe through tar:
adb exec-out run-as com.example.app tar cf - databases/ \
| tar xf - -C ./pulledThe tar cf - produces an archive on stdout; the local tar xf - extracts it into ./pulled/. No intermediate file, no PTY translation, works for arbitrary binary content.
adb exec-out run-as com.example.app cat databases/main.db > main.dbexec-out keeps stdout binary-clean.
adb shell run-as com.example.app ls -lR files/run-as cannot do--user N if needed.| Path | Origin |
|---|---|
app/build/outputs/connected_android_test_additional_output/<flavor><Variant>/connected/<deviceId>/ | Gradle's standard "additional output" sink. The instrumentation runner pulls anything declared via androidx.test:runner arg additionalTestOutputDir. |
app/build/outputs/androidTest-results/connected/<flavor><Variant>/TEST-*.xml | JUnit-style XML test results — ingested directly by Jenkins/GHA/etc. |
app/build/reports/androidTests/connected/ | HTML test report. |
(See developer.android.com/studio/test/command-line: HTML at module/build/reports/androidTests/connected/, XML at module/build/outputs/androidTest-results/connected/.)
TestStorageThe legacy pattern is "write to /sdcard/..., pull from CI script". The modern pattern routes through androidx.test.services.storage.TestStorage and a useTestStorageService flag.
// dependencies
androidTestImplementation("androidx.test:runner:1.7.0")
androidTestUtil("androidx.test.services:test-services:1.6.0")// am instrument args (or Gradle: testInstrumentationRunnerArguments)
adb shell am instrument -w -r \
-e useTestStorageService true \
com.example.test/androidx.test.runner.AndroidJUnitRunnerval storage = androidx.test.platform.io.PlatformTestStorageRegistry.getInstance()
storage.openOutputFile("screenshots/fail-${test.methodName}.png").use { out ->
out.write(pngBytes)
}TestStorage solves/sdcard/ proper.connectedAndroidTest automatically pulls them into app/build/outputs/connected_android_test_additional_output/.Class.method filename mangling.clearPackageData: 'true' — the storage service holds artefacts even though the test app is wiped between tests.For non-Gradle pipelines, the storage backs onto the same FS layout, addressable as /sdcard/googletest/test_outputfiles/... for legacy compatibility.
adb pull /data/data/<pkg>/... on a debuggable build# WRONG
adb pull /data/data/com.example/databases/main.db
# adb: error: failed to stat remote object '/data/data/com.example/databases/main.db': Permission denied
# WRONG because: /data/data/<pkg>/ is owned by the app UID with mode 0700. The shell user
# cannot traverse it. run-as solves this on debuggable builds.# RIGHT — run-as + exec-out + cat for a binary-clean grab
adb exec-out run-as com.example cat databases/main.db > main.db
file main.db # → "SQLite 3.x database"Or for a directory:
adb exec-out run-as com.example tar cf - databases/ | tar xf - -C ./pulledadb shell run-as <pkg> cat <binary> for binary files# WRONG (on Windows / certain CI hosts)
adb shell run-as com.example cat databases/main.db > main.db
# WRONG because: `adb shell` allocates a PTY and translates LF to CRLF on stdout. SQLite
# headers and other binary content get corrupted. The pulled DB fails to open.# RIGHT — exec-out is binary-clean
adb exec-out run-as com.example cat databases/main.db > main.db// In production / test code
val out = File(context.getExternalFilesDir(null), "captures/${name}.png")
out.outputStream().use { it.write(bitmapBytes) }# CI script
adb pull /sdcard/Android/data/com.example/files/captures/ ./artifacts/This works on API 30+ without run-as because /sdcard/Android/data/<pkg>/files/ is the package's own external-private dir. Both the app and adb shell (FUSE bridge) can read it.
adb push --sync -z brotli ./fixtures/ /sdcard/fixtures/--sync skips files with matching timestamps; -z brotli compresses the wire bytes. For a fixtures dir with hundreds of unchanged files, the second push transfers nothing.
TestStorageclass CaptureOnFailureRule : TestWatcher() {
override fun failed(e: Throwable, description: Description) {
val storage = PlatformTestStorageRegistry.getInstance()
val name = "${description.className}.${description.methodName}"
storage.openOutputFile("captures/$name.png").use { out ->
out.write(captureScreenshotPng())
}
}
}After connectedAndroidTest, the artefact lands in app/build/outputs/connected_android_test_additional_output/<flavor><Variant>/connected/<device>/captures/<name>.png automatically.
adb exec-out run-as <pkg> cat <path> (not adb shell run-as ...) for binary file grabs. PTY translation corrupts binary on Windows and some CI hosts.adb exec-out run-as <pkg> tar cf - <dir> | tar xf - for directory grabs from /data/data/<pkg>/. There is no adb pull equivalent that works through run-as.run-as. On a release APK, run-as exits non-zero with "Package is not debuggable"./sdcard/Android/data/<pkg>/files/ (via Context.getExternalFilesDir(null)) over arbitrary /sdcard/<dir>/ for app-written test artefacts on API 30+. The latter is gated by MediaStore for app writes.TestStorage (-e useTestStorageService true + androidx.test:services) over hand-rolled /sdcard/... paths for new test infrastructure. It namespaces per-test artefacts and integrates with Gradle's connected_android_test_additional_output/ sink.adb pull -p (show progress) — it is a legacy no-op on platform-tools 30+. Use the default progress meter (or -q to silence).adb pull of /data/data/<pkg>/... works without run-as. It does not, even on debuggable builds — pull is a shell-user operation.--sync -z brotli for repeated pushes of large fixture sets. Brotli + timestamp-skip is dramatically faster on slow USB 2.0 cables.clearPackageData: 'true' + useTestStorageService: 'true' for hermetic test isolation with retained artefacts.adb pull /data/data/<pkg>/... directly. All such pulls go through run-as.adb exec-out, not adb shell.Context.getExternalFilesDir(...) (lands at /sdcard/Android/data/<pkg>/files/), not /sdcard/<arbitrary>/.app/build/outputs/connected_android_test_additional_output/**/* for the modern artefact API.adb push --sync so unchanged files are skipped.file reports the correct binary type for every pulled artefact (no CRLF corruption).adb pull from /data/data/<pkg>/... — those would fail.pull/push syntax, "let you copy arbitrary directories and files to any location in a device" quote.module/build/reports/androidTests/connected/, XML at module/build/outputs/androidTest-results/connected/.Context.getExternalFilesDir() and the API-30+ scoped-storage rules.tasks/research/A3-adb-observability-automation.md — full pull/push surface, path permission rules, run-as patterns, scoped storage on Android 11+, TestStorage wiring.../../architecture/understanding-adb-architecture/SKILL.md — server / daemon, exec-out vs shell.../../devices/connecting-to-devices/SKILL.md — adb get-state, multi-device targeting.../../devices/connecting-over-wifi/SKILL.md — wireless transport.../../apps/installing-and-managing-apps/SKILL.md — pm install and the debuggable-build flag.../../tests/running-instrumented-tests-via-adb/SKILL.md — am instrument arguments including useTestStorageService.../../control/injecting-input-and-state/SKILL.md — driving the scenario that produces the artefact.../../capture/capturing-screenshots-and-screenrecord/SKILL.md — producing PNG / MP4 to pull.../../observability/extracting-logs-with-logcat/SKILL.md — pulling rotated log files via adb shell logcat -f + adb pull.../../automation/scripting-adb-for-ci/SKILL.md — full CI orchestration.../../../instrumentation/runner/running-instrumented-tests-with-androidjunit4/SKILL.md — TestWatcher rules wired to TestStorage.../../../instrumentation/scenarios/launching-activities-with-activityscenario/SKILL.md — Activity-driven scenarios that emit artefacts.../../../fundamentals/strategies/applying-testing-strategies/SKILL.md — when artefacts are the right observability layer.© skydoves, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in adb/transfer/extracting-test-artifacts of skydoves/android-testing-skills.
Open the folder on GitHubat commit 8665ed5
Extracting Test Artifacts next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Extracting Test Artifacts this skillskydoves/android-testing-skills | 333 | — | ~4.4k | Automated safety check: Pass | Apache-2.0 | |
| Run Jetpack Android Appwordpress-mobile/WordPress-Android | 3.2k | — | ~886 | Automated safety check: Pass | GPL-2.0 | |
| Orca Android Emulator Controlstablyai/orca | 87k | — | ~558 | Automated safety check: Pass | Apache-2.0 | |
| Android CLI (acli)ErikHellman/cli-for-android | 119 | — | ~709 | Automated safety check: Pass | MIT | |
| Warpdroid UI TestWarp-net/warpnet | 157 | — | ~3.5k | Automated safety check: Pass | Custom licence | |
| Verify Dreamdroidsreichholf/dreamDroid | 116 | — | ~1.4k | Automated safety check: Pass | GPL-3.0 |
wordpress-mobile/WordPress-Android
Builds the Jetpack debug app with Gradle and installs it on a connected Android device or an emulator started from an available AVD.
stablyai/orca
Android device and emulator control from inside Orca over adb, with the live device view in Orca's emulator pane. Use when driving an adb-connected emulator…
ErikHellman/cli-for-android
Drives Android devices, emulators, SDK packages and Gradle builds through the acli command, with JSON output and per-device targeting.
Warp-net/warpnet
A skill your agent uses whenever a warpdroid (Android client) change or bug needs to be verified by actually driving the app's visual UI — any task phrased as "test the warpdroid UI", "click through…
sreichholf/dreamDroid
Prove dreamDroid phone UI. An agent skill from sreichholf/dreamDroid.
rcosteira79/android-skills
Android and KMP debugging techniques for crashes, ANRs, memory leaks, R8 traces, Gradle failures and Compose recomposition, built on finding the root cause first.
skydoves/android-testing-skills
A skill your agent uses to verify Compose layout measurements from a UI test using assertWidthIsEqualTo, assertHeightIsEqualTo, assertWidthIsAtLeast, assertHeightIsAtLeast…
skydoves/android-testing-skills
A skill your agent uses to verify a Compose semantics node's properties from a UI test using assertExists, assertDoesNotExist, assertIsDisplayed, assertIsNotDisplayed, assertIsDeactivated…
skydoves/android-testing-skills
A skill your agent uses to render every Jetpack Compose @Preview as a screenshot on a real Android device or emulator and publish a browsable HTML catalog from CI.
skydoves/android-testing-skills
A skill your agent uses to capture visual artefacts from a device for test failures, golden image generation, QA repro, and demo videos.
skydoves/android-testing-skills
A skill your agent uses to pick the correct Compose UI test entry point.
skydoves/android-testing-skills
A skill your agent uses to pick which behaviors to cover in an Android test suite using Google's five-category state vocabulary plus the explicit "what NOT to test" list from…
Categories
A skill your agent uses to move files between host and device with adb pull and adb push, including the modern -z (compression), -Z (no compression), --sync, and -a (preserve attrs) flags. Extracting Test Artifacts is an agent skill from skydoves/android-testing-skills. Use this skill to move files between host and device with adb pull and adb push, including the modern -z (compression), -Z (no compression), --sync, and -a (preserve attrs) flags.
Extracting Test Artifacts fits situations like: move files between host and device with adb pull and adb push; including the modern -z (compression); -Z (no compression); -a (preserve attrs) flags.
Run `npx skills add skydoves/android-testing-skills --skill extracting-test-artifacts -a claude-code`. Or copy the skill folder (adb/transfer/extracting-test-artifacts in skydoves/android-testing-skills) into .claude/skills/extracting-test-artifacts in your project. Claude Code loads it when a task matches its description.
Run `npx skills add skydoves/android-testing-skills --skill extracting-test-artifacts -a codex`. Or copy the skill folder (adb/transfer/extracting-test-artifacts in skydoves/android-testing-skills) into .agents/skills/extracting-test-artifacts in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add skydoves/android-testing-skills --skill extracting-test-artifacts -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/extracting-test-artifacts, .gemini/skills/extracting-test-artifacts, .github/skills/extracting-test-artifacts and .opencode/skills/extracting-test-artifacts in your project.
Going by SKILL.md and its folder, Extracting Test Artifacts needs the command-line tools its instructions call (adb).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Extracting Test Artifacts is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.4k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Extracting Test Artifacts: Run Jetpack Android App (wordpress-mobile/WordPress-Android, 3.2k stars), Orca Android Emulator Control (stablyai/orca, 87k stars), Android CLI (acli) (ErikHellman/cli-for-android, 119 stars) and Warpdroid UI Test (Warp-net/warpnet, 157 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
skydoves (a GitHub user) maintains it in skydoves/android-testing-skills, which has 333 GitHub stars. The repository holds 50 skills in this directory. The repository was last updated on May 25, 2026.
Source: skydoves/android-testing-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.