AndroidCtl
A Playwright-like CLI for Android automation, built for AI agents.
AndroidCtl lets your agent operate apps on an Android phone or emulator. The agent reads the screen as compact XML, acts on its elements, waits for results and takes screenshots; it can also run shell scripts and transfer files.
Works with Claude Code, Codex, OpenCode and any other agent that can run shell commands.
- No root, no ADB for daily use. The Android app runs through Shizuku and accepts connections over your network after a one-time pairing.
- Built for agents. Snapshots carry refs such as
e6, and every command reportsdone,failed,not sentorUNKNOWN. Uncertain actions are never resent automatically. - Light on context. Snapshots and screenshots are saved as files and each command prints a short result, so the agent reads only what it needs.
- Everything in one package.
pip install androidctlincludes the CLI, the matching Android app and the agent skill.
Requirements
- Python 3.12 or newer on Windows, macOS or Linux.
- Android 11 or newer on arm64-v8a or x86_64, main user and default display only.
- Shizuku started through ADB or wireless debugging. Root mode is not supported.
- A network route from the computer to the phone.
Setup
1. Install
pip install androidctl
androidctl apk --out androidctl.apk
Install androidctl.apk on the phone, for example with adb install androidctl.apk.
It always matches the installed CLI; the two versions must be the same.
2. Install The Skill
Export the skill into the directory your agent loads skills from:
mkdir -p ~/.claude/skills
androidctl skill --out ~/.claude/skills/androidctl
That is the location for Claude Code. For Codex, use ~/.agents/skills instead;
OpenCode reads both. The export contains SKILL.md, the agent's workflow, and
reference.md, the full command reference.
3. Pair
Start Shizuku, open AndroidCtl, tap Authorize Shizuku and turn on Gateway. When it shows Listening and Executor attached, tap Show new pairing code. Give your agent the address and code, or pair yourself:
androidctl pair 192.168.1.20:18843 000042 --name phone
The first pairing trusts the certificate the phone presents, so pair on a network you trust. For an emulator or a phone without a network route, use an ADB route. After the phone restarts, start Shizuku and turn on Gateway again.
Ask Your Agent
With the skill installed, ask for the result you want:
- "Open Settings on my phone and turn on dark mode."
- "Go through the sign-up flow in the Example app and take a screenshot of each screen."
- "Copy the newest file in /sdcard/Download on my phone to this folder."
If your agent does not support skills, start with: "Use androidctl to control my
phone. First run androidctl skill --out androidctl-skill and read its SKILL.md."
To run several agents, start each one with its own session and device:
ANDROIDCTL_DEVICE=phone ANDROIDCTL_SESSION=checkout claude
A phone serves one session at a time, so agents on different phones run in parallel and agents sharing a phone take turns.
What Your Agent Runs
androidctl session open
androidctl snapshot
androidctl fill e3 "Groceries" --submit
androidctl click e6
androidctl wait --contains "Saved"
androidctl screenshot
androidctl session close
Run androidctl COMMAND --help for options, or read the skill for the complete
workflow.
Upgrading
- Finish active work, then run
androidctl daemon stopbefore replacing the Python package, even with the same version. - Finish device work before installing a new app version. Before reinstalling the same version, tap Stop idle executor.
- Delete the exported skill directory and run
androidctl skill --outagain so the instructions match the new version.
Development
See Repository Guidelines for environment setup and quality checks, and Release Operations for signing, local candidates and manual publishing.
Metadata
Release files for androidctl 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| androidctl-0.3.0.tar.gz | 2.5 MB | Without provenance | Details for androidctl-0.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| androidctl-0.3.0-py3-none-any.whl | Python 3 | none | any | Details for androidctl-0.3.0-py3-none-any.whl |
Total release size: 5.0 MB
Release files / androidctl-0.3.0.tar.gz
| Download URL | androidctl-0.3.0.tar.gz |
|---|---|
| Size | 2.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
82aa4d42b4d2724922eaff952b45c6035b13939e926f024cbf36c8b01d889205
|
|
BLAKE2b-256 checksum How to use checksums |
fafbac434372af8358739ab7417108e4a5fd6dd8970ab8d03be22df39f301646
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.13
|
Release files / androidctl-0.3.0-py3-none-any.whl
| Download URL | androidctl-0.3.0-py3-none-any.whl |
|---|---|
| Size | 2.5 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4062938c6cea2afe58ad790edb9da78753c98fa68f7fe11b5e4852704c41228c
|
|
BLAKE2b-256 checksum How to use checksums |
66fd832b2c808771ba82137ccd2e87e845e2e9c9fc07014f727fbe9e804ad82b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.13
|
Security for androidctl 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.