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.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 69bf30056392fdc63ba7e79eae12448cee31c0b7

178GitHub stars
1star in 7 days
1skill in this repository
2commits in 30 days

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

Oct 25, 2026Nov 6, 2026178

30-day change not yet available: not enough history.

Individual skills in this repository

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 tokens

Always available to the agent

SKILL.md

384 tokens

When the skill is activated

Reference documents

19,295 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Usage
  2. Safety

Scripts executed separately

  • Makefile
  • agent-workspace/agent_helpers.py
  • examples/authorized_device_smoke.py
  • examples/basic_observe.py
  • examples/clipboard_input.py
  • examples/daemon_transport.py
  • examples/environment_report.py
  • examples/ocr_observe.py
  • plugins/adbkeyboard_plugin.py
  • plugins/clipboard_input_plugin.py
  • plugins/environment_report_plugin.py
  • plugins/ocr_plugin.py
  • plugins/policy_guard_plugin.py
  • src/android_harness/__init__.py
  • src/android_harness/adb.py
  • src/android_harness/admin.py
  • src/android_harness/daemon.py
  • src/android_harness/helpers.py
  • src/android_harness/observation.py
  • src/android_harness/plugins.py
  • src/android_harness/run.py
  • src/android_harness/smoke.py
  • src/android_harness/transport.py
  • src/android_harness/ui.py
  • tests/test_adb.py
  • tests/test_adbkeyboard_plugin.py
  • tests/test_admin.py
  • tests/test_clipboard_input_plugin.py
  • tests/test_daemon.py
  • tests/test_environment_report_plugin.py
  • tests/test_helpers.py
  • tests/test_observation.py
  • tests/test_ocr_plugin.py
  • tests/test_plugins.py
  • tests/test_policy_guard_plugin.py
  • tests/test_run.py
  • tests/test_smoke.py
  • tests/test_transport.py
  • tests/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 bytes
  • CHANGELOG.mddoc6,298 bytes
  • CONTRIBUTING.mddoc1,642 bytes
  • LICENSEasset1,085 bytes
  • Makefileruns164 bytes
  • NOTICE.mddoc1,978 bytes
  • README.mddoc13,698 bytes
  • README.zh.mddoc13,145 bytes
  • ROADMAP.mddoc4,054 bytes
  • SKILL.mdcore1,778 bytes
  • SKILL.mdcore1,778 bytes
  • SKILL.mdcore1,778 bytes
  • agent-workspace/agent_helpers.pyruns429 bytes
  • agent-workspace/app-skills/.gitkeepasset1 bytes
  • docs/assets/demo-preview.gifasset3,932,160 bytes
  • docs/helpers-reference.mddoc5,459 bytes
  • docs/manual-smoke.mddoc3,500 bytes
  • docs/plugin-author-guide.mddoc2,932 bytes
  • docs/release.mddoc1,458 bytes
  • docs/release.zh.mddoc1,381 bytes
  • docs/troubleshooting.mddoc7,397 bytes
  • docs/troubleshooting.zh.mddoc7,187 bytes
  • examples/README.mddoc1,903 bytes
  • examples/authorized_device_smoke.pyruns541 bytes
  • examples/basic_observe.pyruns327 bytes
  • examples/clipboard_input.pyruns346 bytes
  • examples/daemon_transport.pyruns222 bytes
  • examples/environment_report.pyruns187 bytes
  • examples/ocr_observe.pyruns437 bytes
  • install.mddoc3,879 bytes
  • install.zh.mddoc3,723 bytes
  • interaction-skills/permissions.mddoc271 bytes
  • interaction-skills/scrolling.mddoc173 bytes
  • interaction-skills/targeting.mddoc1,263 bytes
  • interaction-skills/text-input.mddoc1,789 bytes
  • plugins/.gitkeepasset1 bytes
  • plugins/adbkeyboard_plugin.pyruns2,916 bytes
  • plugins/clipboard_input_plugin.pyruns1,665 bytes
  • plugins/environment_report_plugin.pyruns2,369 bytes
  • plugins/ocr_plugin.pyruns2,552 bytes
  • plugins/policy_guard_plugin.pyruns2,286 bytes
  • pyproject.tomlasset763 bytes
  • src/android_harness/__init__.pyruns88 bytes
  • src/android_harness/adb.pyruns3,791 bytes
  • src/android_harness/admin.pyruns10,553 bytes
  • src/android_harness/daemon.pyruns10,731 bytes
  • src/android_harness/helpers.pyruns15,369 bytes
  • src/android_harness/observation.pyruns4,578 bytes
  • src/android_harness/plugins.pyruns1,226 bytes
  • src/android_harness/run.pyruns11,145 bytes
  • src/android_harness/smoke.pyruns7,723 bytes
  • src/android_harness/transport.pyruns7,363 bytes
  • src/android_harness/ui.pyruns2,228 bytes
  • tests/fixtures/daemon_status_v1.jsonasset218 bytes
  • tests/fixtures/doctor_report_v1.jsonasset616 bytes
  • tests/fixtures/doctor_summary_v1.jsonasset332 bytes
  • tests/fixtures/smoke_report_v1.jsonasset783 bytes
  • tests/fixtures/smoke_summary_v1.jsonasset538 bytes
  • tests/fixtures/snapshot_summary_v1.jsonasset592 bytes
  • tests/fixtures/version_report_v1.jsonasset137 bytes
  • tests/test_adb.pyruns625 bytes
  • tests/test_adbkeyboard_plugin.pyruns2,693 bytes
  • tests/test_admin.pyruns5,220 bytes
  • tests/test_clipboard_input_plugin.pyruns2,364 bytes
  • tests/test_daemon.pyruns5,419 bytes
  • tests/test_environment_report_plugin.pyruns2,480 bytes
  • tests/test_helpers.pyruns8,045 bytes
  • tests/test_observation.pyruns6,523 bytes
  • tests/test_ocr_plugin.pyruns3,080 bytes
  • tests/test_plugins.pyruns1,773 bytes
  • tests/test_policy_guard_plugin.pyruns1,036 bytes
  • tests/test_run.pyruns28,451 bytes
  • tests/test_smoke.pyruns9,190 bytes
  • tests/test_transport.pyruns4,606 bytes
  • tests/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 GitHub

Skills 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 shell

Automated 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:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
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
    ![CI](https://github.com/yang1ming/android-harness/actions/workflows/ci.yml/badge.svg?branch=main)
  • Network accessline 6
    ![Python](https://img.shields.io/badge/python-3.10%2B-blue)
  • Network accessline 7
    ![Status](https://img.shields.io/badge/status-alpha-orange)
  • Network accessline 8
    ![License](https://img.shields.io/badge/license-MIT-green)
  • Network accessline 9
    ![Android](https://img.shields.io/badge/android-ADB--first-3DDC84)

README.zh.md

  • Network accessline 5
    ![CI](https://github.com/yang1ming/android-harness/actions/workflows/ci.yml/badge.svg?branch=main)
  • Network accessline 6
    ![Python](https://img.shields.io/badge/python-3.10%2B-blue)
  • Network accessline 7
    ![Status](https://img.shields.io/badge/status-alpha-orange)
  • Network accessline 8
    ![License](https://img.shields.io/badge/license-MIT-green)
  • Network accessline 9
    ![Android](https://img.shields.io/badge/android-ADB--first-3DDC84)

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 28
    [Credential-related source omitted]

src/android_harness/admin.py

  • Executable scriptline 1
    Executable file

src/android_harness/daemon.py

  • Executable scriptline 1
    Executable file
  • Network accessline 232
    def _send(path: Path, request: dict[str, Any]) -> dict[str, Any]:     with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client:
  • Network accessline 233
    with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client:

src/android_harness/helpers.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 114
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 272
    exec(compile(source, "<android-harness>", "exec"), _execution_env(load_workspace=not args.no_workspace))
  • Dangerous shell operationline 287
    exec(compile(workspace.read_text(), str(workspace), "exec"), workspace_env)

src/android_harness/smoke.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 172
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 104
    exec("from android_harness.helpers import *", namespace)

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

and 17 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.