# Chạy nhiều giả lập LDPlayer và BlueStacks để nuôi acc game

> Chạy nhiều giả lập LDPlayer hoặc BlueStacks để nuôi acc trong MAS: thêm từng instance theo cổng, gom vào nhóm, và cho mỗi thiết bị hồ sơ và proxy riêng.

Source: https://automationmacro.com/vi/docs/guides/multi-instance (Hướng dẫn, updated 2026-09-05)

Một macro, năm tài khoản, một cú nhấn: đó là chạy nhiều giả lập LDPlayer hoặc BlueStacks để nuôi acc. Khi bạn chạy nhiều giả lập LDPlayer cùng lúc, Macro Automation Studio (MAS) coi mỗi instance giả lập là một thiết bị riêng. Một nhóm thiết bị sau đó chạy cùng macro trên tất cả, với tham số theo từng thiết bị, mỗi cái một proxy, và bộ nhớ không bao giờ trộn lẫn bộ đếm. Hướng dẫn này dựng thiết lập đó trên BlueStacks, LDPlayer, MuMu Player hoặc MEmu. Trang dành cho bất kỳ ai chạy nhiều hơn một tài khoản.

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

- MAS đã cài và đăng nhập với gói có số thiết bị đủ cho các instance bạn muốn chạy cùng lúc. Xem [Thanh toán](/docs/billing).
- Trình quản lý đa nhiệm của giả lập đã tạo các instance và mỗi cái đã bật ADB. Các hướng dẫn [BlueStacks](/docs/bluestacks-setup-guide), [LDPlayer](/docs/ldplayer-setup-guide), [MuMu Player](/docs/mumu-setup-guide) và [MEmu](/docs/memu-setup-guide) chỉ cài đặt và cổng nằm ở đâu.
- Mọi instance dùng cùng độ phân giải và DPI với instance bạn đã chụp ảnh mẫu.
- Macro chạy được trên một instance từ Code Editor. Xem [hướng dẫn vòng lặp](/docs/guides/loops-and-scheduling).

## Mỗi instance khi chạy nhiều giả lập là một thiết bị

Một instance giả lập nghe adb trên cổng TCP cục bộ riêng. MAS tìm instance bằng cách quét các tiến trình đang chạy và giữ các cổng nằm trong dải đã biết của từng giả lập. Hai cửa sổ BlueStacks vì thế hiện thành hai mục trong danh sách **Cổng**. Thiết bị là cổng; nhóm là danh sách cổng.

| Giả lập | Cổng MAS chấp nhận |
|---|---|
| BlueStacks | 5555 đến 8500 |
| LDPlayer | Cổng lẻ từ 5555 đến 5599 |
| MuMu Player | Cổng lẻ 5555 đến 5599, 7555, 16384 đến 16576, 26624 đến 27264 |
| MEmu | 21503 và mọi cổng kết thúc bằng 3 phía trên nó, dưới 30000 |

Giữ mọi instance mở trong lúc bạn thêm; instance đã dừng không có cổng để tìm. Trang [Thiết bị](/docs/devices) có đầy đủ quy tắc phát hiện.

## Tạo nhóm thiết bị

1. Mở **Nhóm thiết bị** và nhấn **Tạo nhóm mới**.
2. Nhập **Tên**, giữ loại **Local**, và nhấn **Tạo nhóm**.
3. Mở nhóm và nhấn **Thêm thiết bị**.
4. Nhập **Tên thiết bị** cho biết đó là tài khoản nào, ví dụ `farm-alt-2`.
5. Chọn cổng của instance trong **Cổng**. Nhấn **Làm mới** nếu thiếu, hoặc chọn **Cổng tùy chỉnh** và gõ vào.
6. Nhấn **Thêm thiết bị** và lặp lại cho mọi instance.
7. Trên mỗi thẻ thiết bị, chọn macro trong ô **Macro**.

Một cổng chỉ thuộc về một thiết bị. Thêm lần hai thất bại với "Port is already in use". Xem [Nhóm thiết bị](/docs/device-groups).

## Cho mỗi thiết bị tham số riêng

Hầu hết bot cần một giá trị khác nhau theo từng tài khoản: một cái tên, một mục tiêu, số lượt. Có hai cách truyền nó.

**Hồ sơ cài đặt (không đổi mã).** Nếu macro có biểu mẫu tham số từ UI Builder, mỗi thẻ thiết bị có **Sửa tham số**. Hộp thoại mang thanh **Hồ sơ**: nhập giá trị, chọn **Lưu giá trị hiện tại thành hồ sơ mới**, đặt tên và nhấn **Tạo hồ sơ**. Một thiết bị đi theo một hồ sơ, và sửa hồ sơ cập nhật mọi thiết bị đi theo nó ở lần chạy tiếp theo. "Default" luôn tồn tại và không xóa được. Xem [Hồ sơ cài đặt](/docs/settings-profiles) và [UI Builder](/docs/ui-builder).

**Cổng trong mã.** Mã có thể hỏi nó đang ở instance nào và tự chọn cài đặt. Cách này không cần biểu mẫu và là cách ví dụ ở cuối dùng.

```python
import mas

port = mas.get_current_device_port()   # 5555, 5557, 5559 ...
```

Dùng hồ sơ khi giá trị đổi thường xuyên hoặc người khác chạy bot; dùng cổng khi ánh xạ cố định và đi cùng mã.

## Cho mỗi thiết bị proxy riêng

Các tài khoản dùng chung IP thì chung số phận. MAS gắn một proxy cho mỗi thiết bị và định tuyến lưu lượng của instance đó qua nó.

1. Mở **Proxy**. Dưới **Thêm proxy**, điền tab **Tài khoản gateway**, hoặc tab **Nhà cung cấp khác** cho proxy của riêng bạn (`http`, `https` hoặc `socks5`), và nhấn **Thêm & kiểm tra**.
2. Chờ kiểm tra. Nó xác nhận proxy trả lời và phát hiện quốc gia; **Kiểm tra** lặp lại về sau.
3. Nhấn **Gán** và chọn thiết bị, hoặc mở thẻ thiết bị trong **Nhóm thiết bị** và chọn proxy trong **Proxy**.

Thẻ thiết bị hiển thị trạng thái proxy ở mỗi lần chạy, và webhook của lần chạy mang `proxy_exit_ip` và `proxy_country`. Một thiết bị giữ một proxy; gắn cái khác thay thế nó. Xem [Proxy](/docs/proxies).

## Bắt đầu tất cả: chạy nhiều giả lập LDPlayer hoặc BlueStacks đồng bộ

Nhấn **Bắt đầu tất cả** ở đầu nhóm. MAS bắt đầu các thiết bị lần lượt, cách nhau nửa giây, mỗi cái có lần chạy riêng, nhật ký riêng và mã thoát riêng. Thiết bị không có macro bị bỏ qua kèm lỗi và phần còn lại tiếp tục. **Dừng tất cả** kết thúc mọi lần chạy trong nhóm. Tab **Nhật ký** trên mỗi thẻ chỉ hiển thị thiết bị đó, và tab **Bảng điều khiển** hiển thị giao diện lúc chạy nếu macro có.

## Giữ trạng thái từng thiết bị bằng bộ nhớ

`mas.save`, `mas.retrieve` và `mas.clear` được khóa theo máy tính này, cổng của thiết bị và tên tác vụ. Hai instance chạy cùng macro vì thế giữ bộ đếm riêng mà không cần thêm mã. Để cộng dồn, `mas.retrieve_all(task_name)` trả về một mục cho mỗi cổng với `machine_id`, `port`, `data` và `updated_at`.

```python
TASK = "collector"

mine = mas.retrieve(TASK)                          # this instance only
everyone = mas.retrieve_all(TASK)                  # every instance on this computer
total = sum(entry["data"].get("done", 0) for entry in everyone)
```

Xem [Lưu trữ](/docs/sdk/storage).

## Webhook theo nhóm

Để được báo khi bất kỳ tài khoản nào xong hoặc thất bại, thêm một điểm cuối trên trang **Webhook**, chọn sự kiện dưới **Gửi cho tôi**, và dưới **Gửi cho tôi sự kiện từ** chọn **Nhóm cụ thể** rồi tích nhóm. Thiết bị bạn thêm vào nhóm sau này cũng được bao phủ. Mỗi sự kiện mang `device_name`, `device_port`, `group_id`, `status` và `exit_code`, nên một điểm cuối phân biệt được các tài khoản. Xem [Webhook](/docs/webhooks).

## Theo dõi giới hạn tài nguyên của dàn bot BlueStacks

Mỗi instance là một hệ thống Android đầy đủ. Trước khi mở rộng, kiểm tra ba thứ:

- **CPU và RAM cho mỗi instance.** Mỗi instance chiếm số nhân và bộ nhớ đặt trong cài đặt instance của giả lập. Cộng chúng lại và chừa dư cho MAS, vốn chạy so khớp mẫu và OCR cho mọi instance trên cùng máy. Khi cú chạm bắt đầu đến muộn, bạn đã quá tải.
- **Thiết bị trong gói của bạn.** Gói được định cỡ theo số thiết bị của bạn có thể chạy cùng lúc. **Bắt đầu tất cả** chạy đúng số gói cho phép; xem [Thanh toán](/docs/billing) và [trang giá](/pricing).
- **Công việc theo lịch.** Bộ lập lịch chạy tối đa 20 công việc cùng lúc, mỗi cổng một công việc.

Ít instance chạy sạch tốt hơn nhiều instance trượt ảnh mẫu.

## Lập lịch cho nhóm

Bộ lập lịch nhắm một cổng cho mỗi công việc, nên lịch của nhóm là một công việc cho mỗi thiết bị.

1. Mở **Lập lịch** và nhấn **Tạo lịch mới**.
2. Chọn **Macro**, nhấn **Quét** dưới **Cổng giả lập** và chọn instance đầu tiên.
3. Đặt **Ngày**, **Giờ** và **Chu kỳ**, rồi nhấn **Tạo lịch**.
4. Lặp lại cho từng cổng. Cho các công việc cùng giờ; cổng khác nhau không bao giờ xung đột.

Các lần chạy theo lịch dùng tham số đã lưu trên mỗi thẻ thiết bị, hoặc hồ sơ mà thiết bị đi theo, nên giá trị theo tài khoản được giữ nguyên. Ứng dụng phải mở. Xem [Bộ lập lịch](/docs/scheduler) và [hướng dẫn vòng lặp](/docs/guides/loops-and-scheduling).

## Một ví dụ hoàn chỉnh

Macro đọc cổng của mình, chọn cài đặt của tài khoản, giữ bộ đếm theo cổng, và ghi tổng trên mọi instance ở cuối. Thay cổng và ID ảnh bằng của bạn.

```python
import random
import sys
import time

import mas

images = mas.images({
    "collect": 501,
    "close_popup": 502,
})

SETTINGS = {   # per instance, keyed by the emulator's adb port
    5555: {"account": "main", "rounds": 20},
    5557: {"account": "alt-1", "rounds": 10},
    5559: {"account": "alt-2", "rounds": 10},
}
DEFAULT = {"account": "unknown", "rounds": 5}
TASK = "collector"
TIME_BUDGET_S = 15 * 60


def main():
    port = mas.get_current_device_port()
    settings = SETTINGS.get(port, DEFAULT)
    account = settings["account"]
    mas.log(f"Port {port}: account {account}, {settings['rounds']} rounds")

    done = mas.retrieve(TASK).get("done", 0)
    started = time.monotonic()
    misses = 0

    while done < settings["rounds"]:
        if time.monotonic() - started > TIME_BUDGET_S:
            mas.log(f"{account}: time budget reached", level="warning")
            break
        popup = mas.find_object(images.close_popup)
        if popup:
            mas.click(popup.x, popup.y, delay_ms=800)
            continue
        button = mas.find_object_retry(images.collect, total_tries=3, time_sleep=2.0)
        if button is None:
            misses += 1
            if misses >= 5:
                mas.log(f"{account}: five misses, giving up", level="error")
                sys.exit(2)
            continue
        misses = 0
        mas.click(button.x, button.y, delay_ms=1000)
        done += 1
        mas.save(TASK, {"done": done, "account": account})
        time.sleep(random.uniform(0.8, 2.5))

    total = sum(entry["data"].get("done", 0) for entry in mas.retrieve_all(TASK))
    mas.log(f"{account}: {done} rounds done; {total} across all instances")
    mas.webhook("account.finished", {"account": account, "port": port, "done": done})


if __name__ == "__main__":
    main()
```

`mas.webhook` gửi sự kiện `custom.account.finished` tới các điểm cuối đăng ký sự kiện tùy chỉnh; bỏ dòng đó nếu bạn không có. Khi ánh xạ lớn dần, chuyển nó vào biểu mẫu tham số và đọc `args.<tab>.<key>` thay cho từ điển.

## Điều gì có thể sai

### Port is already in use

Một thiết bị khác trong một nhóm của bạn giữ cổng đó. Mỗi cổng chỉ thêm được một lần; xóa mục cũ hoặc chọn cổng của instance kia.

### Một instance chạy, các instance khác đứng ở Đang kết nối

Các instance kia đang tắt ADB, vẫn đang khởi động, hoặc nghe trên cổng ngoài dải của giả lập. Mở cài đặt của từng instance, xác nhận ADB và cổng, và nhấn **Làm mới** trong **Thêm thiết bị**. Nếu cổng nằm ngoài bảng trên, dùng **Cổng tùy chỉnh**. Xem [Khắc phục sự cố ADB](/docs/adb-troubleshooting).

### Ảnh mẫu chỉ khớp trên một instance

Instance đó có độ phân giải hoặc DPI khác. So khớp mẫu dựa trên pixel; đặt mọi instance về độ phân giải lúc chụp trong cài đặt instance của giả lập và khởi động lại. [Hướng dẫn nhận diện hình ảnh](/docs/guides/image-recognition-macros) giải thích phần còn lại.

### Mọi instance dùng chung một bộ đếm

Mã truyền `port` hoặc `machine_id` tường minh cho `mas.save`, hoặc dùng một tệp trên đĩa thay vì bộ nhớ lưu trữ. Gọi `mas.save(TASK, data)` với giá trị mặc định; cổng hiện tại được thêm cho bạn.

Không có công cụ tự động hóa nào an toàn 100%, vì vậy hãy tự động hóa một cách có trách nhiệm và theo quyết định của riêng bạn.
