Not in the top 1,000 by GitHub stars
yang1ming/android-harness
A lightweight, ADB-first Android harness for agents, exposing stable primitives for authorized device automation, screenshots, UI inspection, input events, diagnostics, and extensible interaction skills.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 69bf30056392
No earlier version was observed for comparison.
Heat
4.2- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
- android
/
How it works
android
When your agent uses it
Direct Android device control through ADB. Use for authorized device automation, testing, screenshots, UI inspection, and app interaction.
What it loads into context
Frontmatter
31 tokensAlways available to the agent
SKILL.md
384 tokensWhen the skill is activated
Reference documents
19,295 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Usage
- Safety
Scripts executed separately
Makefileagent-workspace/agent_helpers.pyexamples/authorized_device_smoke.pyexamples/basic_observe.pyexamples/clipboard_input.pyexamples/daemon_transport.pyexamples/environment_report.pyexamples/ocr_observe.pyplugins/adbkeyboard_plugin.pyplugins/clipboard_input_plugin.pyplugins/environment_report_plugin.pyplugins/ocr_plugin.pyplugins/policy_guard_plugin.pysrc/android_harness/__init__.pysrc/android_harness/adb.pysrc/android_harness/admin.pysrc/android_harness/daemon.pysrc/android_harness/helpers.pysrc/android_harness/observation.pysrc/android_harness/plugins.pysrc/android_harness/run.pysrc/android_harness/smoke.pysrc/android_harness/transport.pysrc/android_harness/ui.pytests/test_adb.pytests/test_adbkeyboard_plugin.pytests/test_admin.pytests/test_clipboard_input_plugin.pytests/test_daemon.pytests/test_environment_report_plugin.pytests/test_helpers.pytests/test_observation.pytests/test_ocr_plugin.pytests/test_plugins.pytests/test_policy_guard_plugin.pytests/test_run.pytests/test_smoke.pytests/test_transport.pytests/test_ui.py
Files
.github/ISSUE_TEMPLATE/bug_report.ymlasset1,437 bytes.github/ISSUE_TEMPLATE/feature_request.ymlasset1,108 bytes.github/ISSUE_TEMPLATE/safety_boundary.ymlasset1,132 bytes.github/pull_request_template.mddoc486 bytes.github/workflows/ci.ymlasset649 bytes.github/workflows/release-build.ymlasset1,003 bytes.gitignoreasset408 bytesCHANGELOG.mddoc6,298 bytesCONTRIBUTING.mddoc1,642 bytesLICENSEasset1,085 bytesMakefileruns164 bytesNOTICE.mddoc1,978 bytesREADME.mddoc13,698 bytesREADME.zh.mddoc13,145 bytesROADMAP.mddoc4,054 bytesSKILL.mdcore1,778 bytesSKILL.mdcore1,778 bytesSKILL.mdcore1,778 bytesagent-workspace/agent_helpers.pyruns429 bytesagent-workspace/app-skills/.gitkeepasset1 bytesdocs/assets/demo-preview.gifasset3,932,160 bytesdocs/helpers-reference.mddoc5,459 bytesdocs/manual-smoke.mddoc3,500 bytesdocs/plugin-author-guide.mddoc2,932 bytesdocs/release.mddoc1,458 bytesdocs/release.zh.mddoc1,381 bytesdocs/troubleshooting.mddoc7,397 bytesdocs/troubleshooting.zh.mddoc7,187 bytesexamples/README.mddoc1,903 bytesexamples/authorized_device_smoke.pyruns541 bytesexamples/basic_observe.pyruns327 bytesexamples/clipboard_input.pyruns346 bytesexamples/daemon_transport.pyruns222 bytesexamples/environment_report.pyruns187 bytesexamples/ocr_observe.pyruns437 bytesinstall.mddoc3,879 bytesinstall.zh.mddoc3,723 bytesinteraction-skills/permissions.mddoc271 bytesinteraction-skills/scrolling.mddoc173 bytesinteraction-skills/targeting.mddoc1,263 bytesinteraction-skills/text-input.mddoc1,789 bytesplugins/.gitkeepasset1 bytesplugins/adbkeyboard_plugin.pyruns2,916 bytesplugins/clipboard_input_plugin.pyruns1,665 bytesplugins/environment_report_plugin.pyruns2,369 bytesplugins/ocr_plugin.pyruns2,552 bytesplugins/policy_guard_plugin.pyruns2,286 bytespyproject.tomlasset763 bytessrc/android_harness/__init__.pyruns88 bytessrc/android_harness/adb.pyruns3,791 bytessrc/android_harness/admin.pyruns10,553 bytessrc/android_harness/daemon.pyruns10,731 bytessrc/android_harness/helpers.pyruns15,369 bytessrc/android_harness/observation.pyruns4,578 bytessrc/android_harness/plugins.pyruns1,226 bytessrc/android_harness/run.pyruns11,145 bytessrc/android_harness/smoke.pyruns7,723 bytessrc/android_harness/transport.pyruns7,363 bytessrc/android_harness/ui.pyruns2,228 bytestests/fixtures/daemon_status_v1.jsonasset218 bytestests/fixtures/doctor_report_v1.jsonasset616 bytestests/fixtures/doctor_summary_v1.jsonasset332 bytestests/fixtures/smoke_report_v1.jsonasset783 bytestests/fixtures/smoke_summary_v1.jsonasset538 bytestests/fixtures/snapshot_summary_v1.jsonasset592 bytestests/fixtures/version_report_v1.jsonasset137 bytestests/test_adb.pyruns625 bytestests/test_adbkeyboard_plugin.pyruns2,693 bytestests/test_admin.pyruns5,220 bytestests/test_clipboard_input_plugin.pyruns2,364 bytestests/test_daemon.pyruns5,419 bytestests/test_environment_report_plugin.pyruns2,480 bytestests/test_helpers.pyruns8,045 bytestests/test_observation.pyruns6,523 bytestests/test_ocr_plugin.pyruns3,080 bytestests/test_plugins.pyruns1,773 bytestests/test_policy_guard_plugin.pyruns1,036 bytestests/test_run.pyruns28,451 bytestests/test_smoke.pyruns9,190 bytestests/test_transport.pyruns4,606 bytestests/test_ui.pyruns2,042 bytes
Read SKILL.md
# android-harness
Direct Android device control through ADB. For task-specific edits, use
`agent-workspace/agent_helpers.py`. For app-specific knowledge, use
`agent-workspace/app-skills/<package>/`.
## Usage
```bash
android-harness snapshot --page-info --summary
```
This count-only snapshot is the preferred broad first pass. Use
`android-harness snapshot --page-info --redact-text` when resource IDs, classes,View the complete source on GitHubSkills included
- android
Repository facts
- License
- MIT
- Created
- Jun 10, 2026
- Last pushed
- Oct 20, 2026
- Forks
- 10
- Open issues
- 0
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 6, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 2 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 3 dangerous shell commandsin 2 files: src/android_harness/run.py:272 tests/test_helpers.py:104
- 18 network referencesin 5 files: README.md:5 README.zh.md:5 src/android_harness/transport.py:155 and 2 more
- 2 obfuscation signalsin 2 files: src/android_harness/transport.py:150 tests/test_transport.py:16
- No instruction overrides
- 39 executable scriptsin 39 files: Makefile:1 agent-workspace/agent_helpers.py:1 examples/authorized_device_smoke.py:1 and 36 more
- 6 references to secretsin 5 files: src/android_harness/transport.py:176 .gitignore:21 src/android_harness/adb.py:28 and 2 more
- No requests to vote in Hot
Show all 68 signals by file
.gitignore
- Access to secretsline 21
[Credential-related source omitted]
Makefile
- Executable scriptline 1
Executable file
README.md
- Network accessline 5
 - Network accessline 6
 - Network accessline 7
 - Network accessline 8
 - Network accessline 9

README.zh.md
- Network accessline 5
 - Network accessline 6
 - Network accessline 7
 - Network accessline 8
 - Network accessline 9

agent-workspace/agent_helpers.py
- Executable scriptline 1
Executable file
examples/authorized_device_smoke.py
- Executable scriptline 1
Executable file
examples/basic_observe.py
- Executable scriptline 1
Executable file
examples/clipboard_input.py
- Executable scriptline 1
Executable file
examples/daemon_transport.py
- Executable scriptline 1
Executable file
examples/environment_report.py
- Executable scriptline 1
Executable file
examples/ocr_observe.py
- Executable scriptline 1
Executable file
plugins/adbkeyboard_plugin.py
- Executable scriptline 1
Executable file
plugins/clipboard_input_plugin.py
- Executable scriptline 1
Executable file
plugins/environment_report_plugin.py
- Executable scriptline 1
Executable file
plugins/ocr_plugin.py
- Executable scriptline 1
Executable file
plugins/policy_guard_plugin.py
- Executable scriptline 1
Executable file
src/android_harness/__init__.py
- Executable scriptline 1
Executable file
src/android_harness/adb.py
src/android_harness/admin.py
- Executable scriptline 1
Executable file
src/android_harness/daemon.py
src/android_harness/helpers.py
src/android_harness/observation.py
- Executable scriptline 1
Executable file
src/android_harness/plugins.py
- Executable scriptline 1
Executable file
src/android_harness/run.py
src/android_harness/smoke.py
src/android_harness/transport.py
- Executable scriptline 1
Executable file - Possible obfuscationline 150
data = base64.b64decode(encoded.encode("ascii"), validate=True) - Network accessline 155
def _request(self, request: dict[str, object], *, timeout: float | None = 30) -> dict[str, object]: try: with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client: - Network accessline 156
try: with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client: if timeout is not None: - Network accessline 157
with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client: - Access to secretsline 176
[Credential-related source omitted] - Access to secretsline 185
[Credential-related source omitted]
src/android_harness/ui.py
- Executable scriptline 1
Executable file
tests/test_adb.py
- Executable scriptline 1
Executable file
tests/test_adbkeyboard_plugin.py
- Executable scriptline 1
Executable file
tests/test_admin.py
- Executable scriptline 1
Executable file
tests/test_clipboard_input_plugin.py
- Executable scriptline 1
Executable file
tests/test_daemon.py
- Executable scriptline 1
Executable file
tests/test_environment_report_plugin.py
- Executable scriptline 1
Executable file
tests/test_helpers.py
tests/test_observation.py
- Executable scriptline 1
Executable file
tests/test_ocr_plugin.py
- Executable scriptline 1
Executable file
tests/test_plugins.py
- Executable scriptline 1
Executable file
tests/test_policy_guard_plugin.py
- Executable scriptline 1
Executable file
tests/test_run.py
- Executable scriptline 1
Executable file
tests/test_smoke.py
- Executable scriptline 1
Executable file
tests/test_transport.py
- Executable scriptline 1
Executable file - Possible obfuscationline 16
PNG = base64.b64decode( - Network accessline 25
if socket_path.exists(): socket_path.unlink() with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as server: - Network accessline 26
socket_path.unlink() with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as server: server.bind(str(socket_path)) - Network accessline 27
with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as server:
tests/test_ui.py
- Executable scriptline 1
Executable file
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Signal confidence: 67 facts
- Executable script in code of a file that runsMakefile:1High confidence
- Network access in prose of documentationREADME.md:5Low confidence
- Network access in prose of documentationREADME.md:6Low confidence
- Network access in prose of documentationREADME.md:7Low confidence
- Network access in prose of documentationREADME.md:8Low confidence
- Network access in prose of documentationREADME.md:9Low confidence
- Network access in prose of documentationREADME.zh.md:5Low confidence
- Network access in prose of documentationREADME.zh.md:6Low confidence
- Network access in prose of documentationREADME.zh.md:7Low confidence
- Network access in prose of documentationREADME.zh.md:8Low confidence
- Network access in prose of documentationREADME.zh.md:9Low confidence
- Executable script in prose of a file that runsagent-workspace/agent_helpers.py:1Low confidence
- Executable script in prose of a file that runsexamples/authorized_device_smoke.py:1Low confidence
- Executable script in prose of a file that runsexamples/basic_observe.py:1Low confidence
- Executable script in prose of a file that runsexamples/clipboard_input.py:1Low confidence
- Executable script in prose of a file that runsexamples/daemon_transport.py:1Low confidence
- Executable script in prose of a file that runsexamples/environment_report.py:1Low confidence
- Executable script in prose of a file that runsexamples/ocr_observe.py:1Low confidence
- Executable script in prose of a file that runsplugins/adbkeyboard_plugin.py:1Low confidence
- Executable script in prose of a file that runsplugins/clipboard_input_plugin.py:1Low confidence
- Executable script in prose of a file that runsplugins/environment_report_plugin.py:1Low confidence
- Executable script in prose of a file that runsplugins/ocr_plugin.py:1Low confidence
- Executable script in prose of a file that runsplugins/policy_guard_plugin.py:1Low confidence
- Executable script in prose of a file that runssrc/android_harness/__init__.py:1Low confidence
- Executable script in prose of a file that runssrc/android_harness/adb.py:1Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuesrc/android_harness/adb.py:28Low confidence
- Executable script in prose of a file that runssrc/android_harness/admin.py:1Low confidence
- Executable script in prose of a file that runssrc/android_harness/daemon.py:1Low confidence
- Network access in code of a file that runssrc/android_harness/daemon.py:232High confidence
- Network access in code of a file that runssrc/android_harness/daemon.py:233High confidence
- Executable script in prose of a file that runssrc/android_harness/helpers.py:1Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuesrc/android_harness/helpers.py:114Low confidence
- Executable script in prose of a file that runssrc/android_harness/observation.py:1Low confidence
- Executable script in prose of a file that runssrc/android_harness/plugins.py:1Low confidence
- Executable script in prose of a file that runssrc/android_harness/run.py:1Low confidence
- Dangerous shell operation in code of a file that runssrc/android_harness/run.py:272High confidence
- Dangerous shell operation in code of a file that runssrc/android_harness/run.py:287High confidence
- Executable script in prose of a file that runssrc/android_harness/smoke.py:1Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuesrc/android_harness/smoke.py:172Low confidence
- Executable script in prose of a file that runssrc/android_harness/transport.py:1Low confidence
- Possible obfuscation in code of a file that runssrc/android_harness/transport.py:150High confidence
- Network access in code of a file that runssrc/android_harness/transport.py:155High confidence
- Network access in code of a file that runssrc/android_harness/transport.py:156High confidence
- Network access in code of a file that runssrc/android_harness/transport.py:157High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuesrc/android_harness/transport.py:176Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuesrc/android_harness/transport.py:185Low confidence
- Executable script in prose of a file that runssrc/android_harness/ui.py:1Low confidence
- Executable script in code of a testtests/test_adb.py:1Low confidence
- Executable script in code of a testtests/test_adbkeyboard_plugin.py:1Low confidence
- Executable script in code of a testtests/test_admin.py:1Low confidence
and 17 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.