# MEmu ADB connect: cổng 21503 và cách kết nối với MAS

> Kết nối MEmu Play với Macro Automation Studio qua ADB trên cổng 21503, thêm nó làm thiết bị, sửa lỗi offline, và chạy macro MAS thay cho trình ghi macro.

Source: https://automationmacro.com/vi/docs/memu-setup-guide (Thiết bị, updated 2026-09-05)

Hướng dẫn này chỉ cách kết nối MEmu Play với Macro Automation Studio (MAS) qua ADB, tức bước MEmu ADB connect, và cách macro MAS khác với trình ghi macro của MEmu. MEmu chỉ có trên Windows, nên mọi bước MEmu ADB connect bên dưới đều là bước trên Windows.

## Trước khi bắt đầu

- MAS đã cài và đăng nhập trên Windows 10 hoặc 11. MAS tải miễn phí để dùng thử; lấy từ [trang tải](/download).
- MEmu đã cài từ [memuplay.com](https://www.memuplay.com/) và đã khởi động một lần.
- Instance đã khởi động xong tới màn hình chính Android.
- Đã bật ảo hóa trong BIOS để instance ổn định.

## 1. Cài MEmu

1. Tải MEmu từ trang của nhà cung cấp và chạy bộ cài.
2. Khởi động MEmu và chờ màn hình chính.
3. Đăng nhập các ứng dụng bạn muốn tự động hóa trước khi thêm thiết bị vào MAS.

## 2. Đặt độ phân giải cố định

MAS so khớp ảnh mẫu từng pixel. Mở cài đặt MEmu, chọn một độ phân giải cố định, và giữ nguyên. Macro viết theo chuẩn cơ sở của MAS mong đợi **540x960** ở chế độ dọc và **240 DPI**; macro bạn tự viết mong đợi độ phân giải bạn đã chụp trong Asset Lab. Khởi động lại instance nếu MEmu yêu cầu.

> [!WARNING]
> Đổi độ phân giải sau khi chụp ảnh mẫu làm lệch mọi kết quả khớp. Chọn độ phân giải một lần và giữ nguyên.

## 3. Bật ADB trong MEmu

Tài liệu chính thức của MEmu không cho thấy công tắc ADB nào. Một instance đang chạy chuyển tiếp cổng adb Android của nó ra máy chủ dưới dạng `127.0.0.1:21503`, đúng địa chỉ mà hướng dẫn dòng lệnh của MEmu dùng. Nếu bản MEmu của bạn có tùy chọn ADB hoặc nhà phát triển trong Cài đặt, hãy để nó bật. Khởi động instance và chờ màn hình chính trước khi tiếp tục.

## 4. Cổng ADB của MEmu và cách MAS quét nó

Instance mặc định của MEmu nghe trên **21503**. MAS không dùng `adb devices` để phát hiện giả lập. Nó quét các tiến trình đang chạy và giữ các cổng khớp những quy tắc sau:

- Tên tiến trình chứa `memuheadless` hoặc `memuhyper`.
- Cổng từ 21503 trở lên, kết thúc bằng 3, và nhỏ hơn 30000. Các cổng như 21513 và 21523 vì thế cũng khớp.
- Socket nghe trên `127.0.0.1`.

Các cổng khớp xuất hiện trong hộp thoại Thêm thiết bị với nhãn `MEmu`, ví dụ `21503 - MEmu`. Lần quét chạy khi bạn mở một nhóm thiết bị và mỗi lần bạn nhấn **Làm mới**.

## 5. MEmu ADB connect trong MAS

1. Mở **Nhóm thiết bị** ở thanh bên và mở một nhóm, hoặc tạo nhóm mới.
2. Nhấn **Thêm thiết bị**.
3. Gõ **Tên thiết bị** tối đa 50 ký tự.
4. Trong **Cổng**, chọn mục `MEmu` của instance này. Nhấn **Làm mới** nếu danh sách trống.
5. Nếu MEmu dùng một cổng không khớp quy tắc trên, chọn **Cổng tùy chỉnh** và gõ vào. MAS chấp nhận 1024 đến 65535.
6. Tùy chọn, chọn một **Macro khởi động**.
7. Nhấn **Thêm thiết bị**, rồi nhấn **Bắt đầu** trên thẻ thiết bị.

Thẻ hiển thị **Đang kết nối** rồi **Đang chạy**. MAS khởi động máy chủ adb của nó, gỡ mọi mục cũ của `127.0.0.1:<port>`, và chạy `adb connect` tới nó.

## Macro trên MEmu

Trình ghi macro của MEmu ghi lại cú chạm và vuốt ở tọa độ cố định rồi phát lại, tùy chọn lặp. Nó không nhìn màn hình, nên một lần tải chậm, một popup hay một nút đã dời chỗ làm hỏng chuỗi thao tác, và thao tác chỉ hoạt động bên trong MEmu.

Macro MAS là một đoạn mã Python kiểm tra màn hình trước khi hành động. Nó tìm nút bằng so khớp mẫu, đọc chữ bằng OCR, chờ bằng các lần thử lại, và rẽ nhánh theo những gì nó thấy. Cùng đoạn mã chạy trên MEmu, trên các giả lập khác và trên thiết bị cloud mà không cần sửa, vì MAS điều khiển thiết bị qua adb.

- Để dựng lại một thao tác đã ghi thành macro nhìn màn hình, làm theo [Macro nhận diện hình ảnh](/docs/guides/image-recognition-macros).
- Để lặp nó cho đến khi đạt điều kiện, hoặc chạy theo lịch, đọc [Vòng lặp, điều kiện dừng và lập lịch](/docs/guides/loops-and-scheduling).
- Macro từ Marketplace cài thành macro MAS và chạy trên thiết bị bạn gán.

> [!NOTE]
> Dừng trình ghi của MEmu trước khi bạn bắt đầu thiết bị trong MAS. Cả hai gửi thao tác vào cùng một màn hình và sẽ gây nhiễu lẫn nhau.

## Nhiều instance MEmu

Mỗi instance từ trình quản lý đa nhiệm của MEmu nghe trên cổng riêng. Thêm từng cái làm thiết bị riêng trong cùng nhóm thiết bị, gán macro và hồ sơ cài đặt cho từng thiết bị, và dùng **Bắt đầu tất cả** và **Dừng tất cả** trên nhóm. Xem [Nhóm thiết bị](/docs/device-groups) về tham số và proxy cho từng thiết bị.

## Khắc phục sự cố

### MEmu ADB connect

Thẻ thiết bị hiển thị **Lỗi** hoặc "Failed to start device", hoặc MAS không liệt kê mục `MEmu` nào. Lần lượt xét các nguyên nhân sau:

- Instance vẫn đang khởi động. Chờ màn hình chính, rồi nhấn **Làm mới** và bắt đầu lại.
- Cổng không khớp quy tắc quét, nên MAS bỏ qua. Dùng **Cổng tùy chỉnh** với số mà MEmu dùng.
- Cổng thuộc về một instance khác. Sửa bằng **Sửa thiết bị** trên thẻ.
- Lần quét báo "Failed to scan emulator ports". Khởi động lại MAS và mở lại hộp thoại.
- adb in "connection refused" hoặc "cannot connect" trong nhật ký thiết bị. Không có gì nghe trên cổng đó; khởi động lại instance và kiểm tra lại số.

### MEmu ADB device offline

adb đánh dấu thiết bị `offline` khi daemon adb bên trong instance ngừng trả lời, thường sau khi máy ngủ, cập nhật hoặc có máy chủ adb thứ hai trên máy. Nhấn **Dừng** trên thẻ, khởi động lại instance MEmu, đóng mọi công cụ khác chạy máy chủ adb riêng, và nhấn **Bắt đầu**. MAS ngắt mục cũ và kết nối lại ở mỗi lần bắt đầu. Nếu vẫn offline, khởi động lại MAS để máy chủ adb của nó khởi động sạch.

### Trình ghi macro của MEmu so với MAS

Một thao tác ghi trong MEmu không nhập được vào MAS, vì MAS chỉ chạy macro Python. Hãy tạo lại: chụp các nút thành ảnh mẫu trong Asset Lab, nhấn chúng bằng `find_object_retry`, và lặp với điều kiện dừng. Kết quả sống sót qua popup, tải chậm và thay đổi bố cục vốn làm hỏng chuỗi đã ghi, và nó chạy trên mọi thiết bị MAS điều khiển. Nếu một macro MAS bị đứng, mở **Nhật ký** trên thẻ thiết bị: `ImageNotFoundError` và `TimeoutError` nêu tên bước thất bại.

## Điều khiển bằng Python

Khi thẻ ở **Đang chạy**, `src/app.py` của macro điều khiển instance qua gói `mas`. Cổng do MAS chọn, nên mã không bao giờ tham chiếu tới nó.

```python
import mas

size = mas.get_screen_size()
mas.log(f"MEmu screen is {size.width}x{size.height}")

match = mas.find_object_retry(1234, total_tries=3, time_sleep=2.0)
if match:
    mas.click(match.x, match.y)
```

Đọc [Tổng quan SDK](/docs/sdk) về mọi namespace, và [Điều khiển giả lập Android từ Python](/docs/guides/control-an-emulator-from-python) để có đoạn mã đầu tiên hoàn chỉnh.
