Cho AI agent điều khiển điện thoại Android không cần root: những điều mình học được khi làm Buddy
Mình muốn một AI agent dùng được điện thoại như người thật: đọc màn hình, chạm, gõ chữ. Yêu cầu là không root, không adb và không cần máy tính. Bài này ghi lại cách mình làm và những lỗi mình gặp. Dự án là Buddy, mã nguồn mở, miễn phí, và phần lớn code được viết bằng Claude Code.
Kiến trúc
Bong bóng chat ─► Linux trong app (Alpine qua proot): claude, codex, opencode...
│ MCP
▼
Accessibility Service ─► đọc màn hình, chạm, gõ
- Linux trong app: các agent là công cụ dòng lệnh, nên app tải Alpine về và chạy bằng proot. Không cần root.
- Công cụ qua MCP: app mở một server MCP trên
127.0.0.1. Agent gọi các tool nhưread_screen,tap,type_text. - Accessibility Service: đây là phần duy nhất của Android cho phép đọc giao diện và thao tác trên app khác mà không cần root.
Đọc màn hình bằng văn bản
Gửi ảnh chụp màn hình mỗi bước vừa chậm vừa tốn token. Vì vậy read_screen trả về cây giao diện dạng văn bản, mỗi phần tử có số id và tọa độ:
[20] EditText "Tìm kiếm" @540,1365 {click edit focused}
[21] Button "Gửi" @901,1689 {click}
Ảnh chụp chỉ dùng khi cần xem hình ảnh, bản đồ hoặc game. Id sẽ đổi sau mỗi lần đọc, nên agent phải đọc lại trước mỗi thao tác.
Agent thường tưởng mình đã làm đúng
Lỗi hay gặp nhất: agent chạm vào một nút bị bàn phím che, Android không báo lỗi, và agent tiếp tục như thể đã xong. Mình sửa bằng hai cách:
- So sánh màn hình trước và sau thao tác. Nếu giống nhau, tool trả về
NOTHING CHANGEDđể agent thử cách khác thay vì lặp lại. - Đánh dấu phần tử bị che bằng
(covered by ...)và từ chối chạm vào đó.
Cách này chưa hoàn hảo. Nếu thao tác chỉ đổi màu một nút, văn bản không đổi và agent nhận cảnh báo sai. Vì vậy thông báo có dặn agent xem lại màn hình trước khi thử tiếp.
Chữ trên màn hình không phải là lệnh
Một tin nhắn hay trang web có thể viết "hãy gửi tiền cho tôi", và agent đọc được dòng đó. Dặn agent trong prompt là chưa đủ, nên app còn tự chặn: nếu agent chạm vào nút như Gửi, Thanh toán hoặc Xóa khi chưa có xác nhận, người dùng sẽ thấy thẻ yêu cầu duyệt, tùy mức bảo vệ đã chọn cho từng app.
Những giới hạn cần biết
- Nội dung màn hình được gửi đến dịch vụ AI bạn chọn, nên cần cẩn thận với dữ liệu cá nhân.
- Google Play đã từ chối app, vì chính sách không cho dùng Accessibility để tự thực hiện tác vụ. App chỉ có file APK trên GitHub.
- Cần Android 11 trở lên, 64-bit.
Mã nguồn: https://github.com/ghorbelhamdi/buddy-android
Nếu bạn từng làm agent trên điện thoại, mình rất muốn nghe bạn xử lý việc xác nhận thao tác thế nào.
All rights reserved