JevDroid

September 19, 2026 · View on GitHub

A Python framework for controlling Android over ADB with Jev.

CI Python License: MIT

Give Jev a goal. It reads Android's accessibility tree, chooses an action, and JevDroid executes it: open apps, tap, swipe, and navigate back.

Use run() for the full loop or compose observe(), decide(), and act(). Includes standard ADB and persistent UIAutomator2 backends, TypeSafe and Vercel providers, action permissions, and per-run budgets.

Speed and cost

MetricResult
Jev decision latency314 ms median
Estimated cost per decision$0.00003374 average
Estimated decisions per $1~29,600 at the same average cost
Decision accuracy78.6%

Measured on 56 synthetic decisions across 28 cases, including incorrect answers. API timings exclude Android input. Results and limitations.

Quick start

Requires Python 3.11+, ADB, and an unlocked Android device with USB debugging authorized.

git clone https://github.com/antiyro/jevdroid.git
cd jevdroid
python -m venv .venv
source .venv/bin/activate
pip install -e ".[android]"

jevdroid run "Open Display settings without changing a setting" \
  --package com.android.settings --allow-taps --budget 0.05

The CLI prompts for a hidden Vercel API key. Use --provider typesafe for direct TypeSafe access, or jevdroid demo to try an offline simulation without a key. On Windows, activate with .venv\Scripts\activate.

Python API

import getpass
from jevdroid import JevDroid, Policy

with JevDroid.connect(
    api_key=getpass.getpass("Vercel API key: "),
    policy=Policy(("com.android.settings",), allow_taps=True),
) as droid:
    result = droid.run("Open Display settings without changing a setting.")
    print(result.status, result.estimated_usd)

Early alpha. Goals and visible UI text are sent to the selected provider.

SDK · CLI · Architecture · Examples · Contributing · MIT License