Back to projects
Activev0.3.1

MacPhone

Real Bluetooth LE devices in the Android emulator on your Mac.

MacPhone connects to a Bluetooth LE device over the Mac's built-in radio and publishes it inside the Android emulator. The app you are testing scans, connects, reads, writes and subscribes as it would on a phone, with no USB dongle and no change to its code. The same window runs your Android emulators and Xcode simulators.

Latest release
v0.3.1
Platform
macOS
Download
2 release assets
Updated
Oct 18, 2026
GitHub
★ 2 stars
Stack
Swift · SwiftUI · Bluetooth LE · Android
MacPhone overview dashboard listing connected Android emulators and iOS simulators

Problem

The Android emulator has a virtual Bluetooth controller but no way to reach real hardware. The usual workarounds are a USB dongle passed through to the emulator, or a library compiled into the app that only exists for testing.

What I built

A SwiftUI app that acts as a CoreBluetooth central, reads the device's GATT table and hands it over a token-protected localhost socket to a Bumble process. That process publishes the same services, name and manufacturer data on netsim, the emulator's controller, and forwards every read, write and notification to the real device.

Highlights

  • Real BLE devices in the Android emulator, through the Mac's own Bluetooth, no dongle.
  • The app under test uses the normal Android Bluetooth API. No extra library.
  • Reads, writes and notifications both ways; subscriptions survive a reconnect.
  • Create, run and manage Android emulators (Android 14 to 17) and Xcode simulators for every Apple platform.
  • Install apps by drag and drop, open URLs, take screenshots, switch light and dark mode.
  • Limits: Bluetooth LE only, no devices that need Bluetooth pairing, no Bluetooth in the iOS Simulator.

Developer setup

clone
git clone https://github.com/jx-grxf/MacPhone.git && cd MacPhone