Phone Harness
ShawnPana/phone-harness
Control the user's phone — an iPhone through the Mac's iPhone Mirroring window, an Android over adb, or a rented cloud Android: open apps, tap, type, swipe, read the screen.
A skill your agent uses to read device logs for test failures, debug, smoke testing, and CI repros.
$ npx skills add skydoves/android-testing-skills --skill extracting-logs-with-logcat -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install skydoves/android-testing-skills extracting-logs-with-logcat --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/observability/extracting-logs-with-logcat .claude/skills/extracting-logs-with-logcat && 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-logs-with-logcat" agent skill from https://github.com/skydoves/android-testing-skills/tree/main/adb/observability/extracting-logs-with-logcat into .claude/skills/extracting-logs-with-logcat/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extracting-logs-with-logcat", 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/observability/extracting-logs-with-logcatType 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-logs-with-logcat -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install skydoves/android-testing-skills extracting-logs-with-logcat --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/observability/extracting-logs-with-logcat .agents/skills/extracting-logs-with-logcat && 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-logs-with-logcat" agent skill from https://github.com/skydoves/android-testing-skills/tree/main/adb/observability/extracting-logs-with-logcat into .agents/skills/extracting-logs-with-logcat/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extracting-logs-with-logcat", 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-logs-with-logcat -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install skydoves/android-testing-skills extracting-logs-with-logcat --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/observability/extracting-logs-with-logcat .cursor/skills/extracting-logs-with-logcat && 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-logs-with-logcat" agent skill from https://github.com/skydoves/android-testing-skills/tree/main/adb/observability/extracting-logs-with-logcat into .cursor/skills/extracting-logs-with-logcat/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extracting-logs-with-logcat", 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/observability/extracting-logs-with-logcat--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-logs-with-logcat -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install skydoves/android-testing-skills extracting-logs-with-logcat --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/observability/extracting-logs-with-logcat .gemini/skills/extracting-logs-with-logcat && 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-logs-with-logcat" agent skill from https://github.com/skydoves/android-testing-skills/tree/main/adb/observability/extracting-logs-with-logcat into .gemini/skills/extracting-logs-with-logcat/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extracting-logs-with-logcat", 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-logs-with-logcatInstalls 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-logs-with-logcat -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/observability/extracting-logs-with-logcat .github/skills/extracting-logs-with-logcat && 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-logs-with-logcat" agent skill from https://github.com/skydoves/android-testing-skills/tree/main/adb/observability/extracting-logs-with-logcat into .github/skills/extracting-logs-with-logcat/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extracting-logs-with-logcat", 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-logs-with-logcat -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-logs-with-logcat --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/observability/extracting-logs-with-logcat .opencode/skills/extracting-logs-with-logcat && 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-logs-with-logcat" agent skill from https://github.com/skydoves/android-testing-skills/tree/main/adb/observability/extracting-logs-with-logcat into .opencode/skills/extracting-logs-with-logcat/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extracting-logs-with-logcat", 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-logs-with-logcatA skill your agent uses to read device logs for test failures, debug, smoke testing, and CI repros.
Extracting Logs With Logcat is an agent skill from skydoves/android-testing-skills. Use this skill to read device logs for test failures, debug, smoke testing, and CI repros. Covers adb logcat (stream), adb logcat -d (dump and exit), adb logcat -c (clear), buffer selection (-b main|system|crash|events|radio|kernel|all), priority ladder (V/D/I/W/E/F/S), filter expressions like MyApp:D :S, format flags (-v threadtime, -v json on Android 11+), --pid $(adb shell pidof -s pkg), time/count filters (-T '01-01 12:00:00.000', -t 100), buffer rotation (-r <kbytes, -n <count, -f <file), buffer sizing (-G…
Its SKILL.md is about 4.2k 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. 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.
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:
adbjqFrom 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 Logs With Logcat loads about 4.2k tokens when it runs. Until then it costs about 226 tokens; SKILL.md has 1,483 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,483 words, ~4,205 tokens.
.claude/skills/extracting-logs-with-logcat/SKILL.md (or your agent's skills folder).This skill covers adb logcat end-to-end: streaming vs dumping, buffer selection, filter expressions, format flags, PID and time filters, file rotation, and the R8 rule that strips Log.d from release builds. The companion CI capture-on-failure pattern lives in ../../automation/scripting-adb-for-ci/SKILL.md.
adb logcat | grep MyApp is overwhelming the SSH session — the logcat-side filter is the fix.system_server or crash buffers, not the default main.-v json) for machine ingestion.Log.d("Sensitive", "...") call appears to leak in release — the R8 -assumenosideeffects rule is missing.--pid plus a re-resolution loop is needed.../../capture/capturing-screenshots-and-screenrecord/SKILL.md.../../transfer/extracting-test-artifacts/SKILL.md.../../automation/scripting-adb-for-ci/SKILL.md.../../control/injecting-input-and-state/SKILL.md.adb get-state returns device. See ../../devices/connecting-to-devices/SKILL.md.-v json: device API 30+ (Android 11+). Stack with -v UTC -v year for unambiguous timestamps.adb shell pidof -s <pkg> requires API 24+ (toybox pidof -s); on older releases use adb shell ps -A | grep <pkg>.| Command | Behavior |
|---|---|
adb logcat | Stream the device log to stdout; runs until interrupted. |
adb logcat -d | "Dumps the log and exits." Snapshot mode — perfect for CI. |
adb logcat -c | "Clears the log buffer." Run this before reproducing a bug. |
(Verbatim quotes from developer.android.com/tools/logcat.)
Idiomatic CI capture pattern:
adb logcat -c # clear before scenario
./run-scenario.sh # reproduce
adb logcat -d > artifacts/log.txt # dump after-b <name> selects which kernel/userspace ring buffer is read. Buffers (developer.android.com/tools/logcat):
| Buffer | What it contains |
|---|---|
main | Default app-side buffer. Does NOT contain system/crash. |
system | Framework / system_server messages. |
crash | Tombstones + unhandled-exception output. |
events | Structured/binary system event buffer. Pair with -v descriptive to decode tag names. |
radio | Radio/telephony related messages. |
kernel | Kernel buffer. |
all | Every buffer. |
default | Implicit set: main, system, crash. |
Multiple -b flags or comma-separated lists both work:
adb logcat -b radio
adb logcat -b main -b radio -b events
adb logcat -b main,radio,eventsThe events buffer is where to look for am_*, wm_*, input_focus, notification_* — emitted by the framework for instrumentation, not for human reading. Decode tag names with:
adb logcat -b events -v descriptiveFilter specs are space-separated tag:priority pairs. * matches every tag.
| Letter | Meaning |
|---|---|
V | Verbose |
D | Debug |
I | Info |
W | Warning |
E | Error |
F | Fatal |
S | "Silent (highest priority, nothing is printed)" |
Setting *:S silences everything, then any preceding tag:P re-enables that tag at priority P or above. The canonical "show only my app's logs" idiom:
adb logcat ActivityManager:I MyApp:D *:S"Suppress all logs except ActivityManager (Info+) and MyApp (Debug+)" — developer.android.com/tools/logcat.
Other staples:
adb logcat *:W # warnings and above, all tags
adb logcat *:E # errors and above (very common in CI)zsh/bash will glob-expand *:S outside of quotes when there is a file named S in cwd — quote when scripting:
adb logcat "ActivityManager:I MyApp:D *:S"The same filter can be the host default via env var:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"-v <format>| Format | What you get |
|---|---|
brief | "Displays priority, tag, and PID" |
long | "All metadata fields with blank lines between messages" |
process | "PID only" |
raw | "Raw log message with no metadata" |
tag | "Priority and tag only" |
thread | "Legacy format showing priority, PID, and TID" |
threadtime | DEFAULT. "Date, time, priority, tag, PID, and TID" |
time | "Date, time, priority, tag, and PID" |
Format modifiers stack with -v (comma-combinable or repeatable):
| Modifier | Effect |
|---|---|
color | Per-priority colour. |
descriptive | Decode event log tag names. |
epoch | Time in seconds since 1970-01-01. |
monotonic | CPU seconds from last boot. |
printable | Escape binary content. |
uid | UID or Android ID of logged process. |
usec | Time with microsecond precision. |
UTC | Time as UTC. |
year | Add year to displayed time. |
zone | Add local time zone. |
adb logcat -v json -v UTC -v year # Android 11+; structured stream, unambiguous time
adb logcat -b all -v color -d # color dump, all buffersDefault-line example (developer.android.com/tools/logcat):
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action.MAIN ... }Schema for brief: <priority>/<tag>(<PID>): <message>. threadtime adds date/time/TID.
-T '<date> <time>' — start at the first entry on or after the given timestamp. Format matches threadtime, e.g. '01-01 12:00:00.000'.-T <count> — print the last N entries from the buffer, then continue streaming.-t <count> — print the last N entries, then exit (i.e. -t is -T with auto-quit).--pid <pid> — emit only entries from a single process. Combine with pidof:adb logcat --pid=$(adb shell pidof -s com.example.app)pidof -s returns a single pid; without -s you get a space-separated list which --pid will not accept directly. Wrap a re-resolution loop if the app may be killed and restarted (Doze, ANR, crash):
while true; do
PID=$(adb shell pidof -s com.example.app 2>/dev/null)
[ -n "$PID" ] && adb logcat --pid="$PID"
sleep 1
doneFor long captures, persist to a file with rotation:
| Flag | Meaning |
|---|---|
-f <file> | Write to <file> instead of stdout. Subtle: with adb logcat -f, the file is host-side; with adb shell logcat -f, the path is device-side. |
-r <kbytes> | Rotate output every N kilobytes. Requires -f. |
-n <count> | Keep at most <count> rotated files (logfile, logfile.1, ...). |
-G <size> | Resize the kernel log buffer for the selected -b ring (e.g. 1M, 16M). Persists for the life of logd. |
-g | Print buffer sizes and current usages, then exit. Cheap diagnostics for "why am I missing logs?". |
adb logcat -G 16M # grow the main buffer
adb logcat -g # inspect sizes
adb logcat -b main -f /data/local/tmp/app.log \
-r 1024 -n 8 # 8x ~1MB rotated files (device-side)
adb shell logcat -b main -f /data/local/tmp/app.log \
-r 1024 -n 8 # same, but the device runs itThe -G resize is global to that buffer and persists across logd restarts (until reboot). Don't set 16 MB on a memory-constrained device and forget — release memory back with -G 256K after the suite if your CI farm is shared.
Log.d in release — R8 ruleandroid.util.Log calls remain in release APKs unless code-shrinking removes them. The standard idiom in proguard-rules.pro (R8/ProGuard):
-assumenosideeffects class android.util.Log {
public static *** v(...);
public static *** d(...);
public static *** i(...);
public static boolean isLoggable(java.lang.String, int);
}-assumenosideeffects lets R8 treat the listed methods as pure no-ops, so all calls (and their string-builder argument expressions, when constants) are eliminated. Keep w, e, wtf for production diagnostics. With Timber: strip the BuildConfig.DEBUG-gated DebugTree plant and rely on a ReleaseTree that forwards to Crashlytics for warnings/errors.
For Compose specifically, do not -assumenosideeffects kotlin.jvm.internal.Intrinsics — it removes null-checks the compiler relies on.
adb logcat | grep MyApp for filtering# WRONG
adb logcat | grep MyApp
# WRONG because: the device sends every log line over the USB/TCP transport, then the host
# discards 99% via grep. On a busy device this saturates the transport and the grep can lag
# behind real time. Worse, `grep` runs without -F, so a tag that contains regex metacharacters
# (`.`, `(`, `+`) silently mismatches.# RIGHT — filter at the logcat level
adb logcat MyApp:D *:SThe device only emits matching lines; the transport is uncongested.
-T <count> exits# WRONG
adb logcat -T 100 > tail.txt
# Hangs forever — -T <count> prints the last 100 lines THEN CONTINUES STREAMING.# RIGHT — `-t` is `-T` with auto-exit
adb logcat -t 100 > tail.txtadb logcat -v json -v UTC -v year -d -b all > run.jsonlEach line is a single JSON object — pipe through jq:
jq -c 'select(.priority == "ERROR")' run.jsonl(-v json requires Android 11+ on the device.)
adb logcat -c
./run-scenario.sh
RC=$?
if [ "$RC" -ne 0 ]; then
adb logcat -d -v threadtime > artifacts/logcat.txt
adb logcat -d -b crash -v threadtime > artifacts/crash.txt
adb logcat -d -b events -v descriptive > artifacts/events.txt
fi
exit "$RC"-c clears before the run so the dump captures only the scenario's logs.
while true; do
PID=$(adb shell pidof -s com.example.app 2>/dev/null)
if [ -n "$PID" ]; then
adb logcat --pid="$PID" -v threadtime
fi
sleep 1
doneThe outer loop re-resolves the PID after Doze/ANR/crash kills and restarts the app.
-f host vs device side# host-side rotation (file lives on the developer machine)
adb logcat -b main -f ~/logs/app.log -r 1024 -n 8
# device-side rotation (file lives in /data/local/tmp on the device)
adb shell logcat -b main -f /data/local/tmp/app.log -r 1024 -n 8
adb pull /data/local/tmp/app.log ~/logs/app.log # laterMyApp:D *:S), not via host-side grep. Filtering on the device avoids saturating the transport.* in zsh/bash (e.g. "MyApp:D *:S") — globbing eats the asterisk if a file named S exists in cwd.-t <count> for "tail and exit". -T <count> continues streaming after the initial dump.-d for snapshot dumps in CI. Streaming adb logcat requires explicit termination.adb logcat -c before reproducing a bug whose log dump you want to attach. Otherwise the dump includes irrelevant prior history.adb logcat -f <file> (host-side path) from adb shell logcat -f <file> (device-side path). The shell forms diverge.-assumenosideeffects rule for android.util.Log v/d/i (and isLoggable) when shipping release APKs that previously called Log.d with sensitive data. Keep w/e/wtf.-assumenosideeffects kotlin.jvm.internal.Intrinsics — that removes null-check semantics the Kotlin compiler relies on.-v json on devices below Android 11 — silently emits an empty stream.-v threadtime,year,UTC (or -v threadtime -v year -v UTC) for unambiguous absolute timestamps in CI artefacts.-G 16M for the main buffer when capturing slow-burning bugs, and reset to default in teardown.scripts/ or .github/workflows/ pipes adb logcat directly into grep for filtering. All filters are passed as logcat args.main, crash, and events buffers.Log.d calls (verify via apkanalyzer dex packages app-release.apk | grep 'android.util.Log' returning only e/w/wtf).*:S in shell scripts are quoted.--pid invocations use pidof -s <pkg> (singular) and re-resolve in a loop if the app may restart.adb logcat session in CI has a wall-clock budget (timeout 600s adb logcat ...) so a stuck session doesn't fill the disk.-v threadtime/json/descriptive, format modifiers, -T/-t/--pid/-r/-n/-G/-g flags, line-format schema.adb logcat host-side shorthand vs adb shell logcat.-assumenosideeffects and the android.util.Log strip rule.Log.v/d/i/w/e/wtf/isLoggable signatures.tasks/research/A3-adb-observability-automation.md — full logcat surface, -f host-vs-device subtlety, R8 keep-rule rationale, capture-on-failure CI pattern.../../architecture/understanding-adb-architecture/SKILL.md — server / daemon, transport.../../devices/connecting-to-devices/SKILL.md — device states, wait-for-device.../../devices/connecting-over-wifi/SKILL.md — adb pair / adb connect.../../apps/installing-and-managing-apps/SKILL.md — installing the APK whose logs are being captured.../../tests/running-instrumented-tests-via-adb/SKILL.md — am instrument -w -r interplay with logcat.../../control/injecting-input-and-state/SKILL.md — driving gestures whose effects show up in logcat.../../capture/capturing-screenshots-and-screenrecord/SKILL.md — companion screenshot capture.../../transfer/extracting-test-artifacts/SKILL.md — pulling rotated log files from the device.../../automation/scripting-adb-for-ci/SKILL.md — full CI capture-on-failure / retry / cleanup patterns.../../../instrumentation/runner/running-instrumented-tests-with-androidjunit4/SKILL.md — instrumentation logs interleaved with logcat.../../../instrumentation/scenarios/launching-activities-with-activityscenario/SKILL.md — Activity lifecycle events surfaced in events buffer.../../../fundamentals/strategies/applying-testing-strategies/SKILL.md — when log capture is the appropriate 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/observability/extracting-logs-with-logcat of skydoves/android-testing-skills.
Open the folder on GitHubat commit 8665ed5
Extracting Logs With Logcat 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 Logs With Logcat this skillskydoves/android-testing-skills | 333 | — | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Phone HarnessShawnPana/phone-harness | 3.2k | — | ~4.3k | Automated safety check: Pass | MIT | |
| Mobile QAtloncorp/tlon-apps | 107 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Androidyang1ming/android-harness | 176 | — | ~259 | Automated safety check: Pass | MIT | |
| Debug Receiverstimusus/Shuttle2 | 229 | — | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| Debug Bridgegetknit/knit | 132 | — | ~2.2k | Automated safety check: Pass | GPL-3.0 |
ShawnPana/phone-harness
Control the user's phone — an iPhone through the Mac's iPhone Mirroring window, an Android over adb, or a rented cloud Android: open apps, tap, type, swipe, read the screen.
tloncorp/tlon-apps
Run a mobile QA checklist on a physical Android device over adb for tlon-apps, then triage what fails into fixes.
yang1ming/android-harness
Direct Android device control through ADB. An agent skill from yang1ming/android-harness.
timusus/Shuttle2
Drive the S2 debug build's playback and queue over ADB broadcasts — play the whole library, play/pause, skip, seek, remove a queue item, toggle shuffle/repeat, dump playback state as JSON, reimport…
getknit/knit
Drive and verify Knit on a device or emulator through the headless debug bridge (am broadcast to app.getknit.knit.debug.<ACTION, replies as JSON) — send a message on one phone and confirm it landed…
Moustachauve/WLED-Android
Production-ready scripts for Android app testing, building, and automation.
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…
Works with
Categories
A skill your agent uses to read device logs for test failures, debug, smoke testing, and CI repros. Extracting Logs With Logcat is an agent skill from skydoves/android-testing-skills. Use this skill to read device logs for test failures, debug, smoke testing, and CI repros.
Extracting Logs With Logcat fits situations like: read device logs for test failures; tasks that involve Mobile testing and debugging.
Run `npx skills add skydoves/android-testing-skills --skill extracting-logs-with-logcat -a claude-code`. Or copy the skill folder (adb/observability/extracting-logs-with-logcat in skydoves/android-testing-skills) into .claude/skills/extracting-logs-with-logcat in your project. Claude Code loads it when a task matches its description.
Run `npx skills add skydoves/android-testing-skills --skill extracting-logs-with-logcat -a codex`. Or copy the skill folder (adb/observability/extracting-logs-with-logcat in skydoves/android-testing-skills) into .agents/skills/extracting-logs-with-logcat 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-logs-with-logcat -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-logs-with-logcat, .gemini/skills/extracting-logs-with-logcat, .github/skills/extracting-logs-with-logcat and .opencode/skills/extracting-logs-with-logcat in your project.
Going by SKILL.md and its folder, Extracting Logs With Logcat needs the command-line tools its instructions call (adb and jq).
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 Logs With Logcat 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.2k tokens (SKILL.md is roughly 17k 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 Logs With Logcat: Phone Harness (ShawnPana/phone-harness, 3.2k stars), Mobile QA (tloncorp/tlon-apps, 107 stars), Android (yang1ming/android-harness, 176 stars) and Debug Receivers (timusus/Shuttle2, 229 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.