Advanced MAC Address Suite for Android — a lightweight, POSIX-clean Magisk module that gives you full control over your network interfaces' MAC addresses from a beautiful terminal UI. Works on Android 6.0 through Android 16 on any rooted device.
__ __ ____ _ _
| \/ | __ _ ___| _ \ _ __ ___ (_) __| |
| |\/| |/ _` |/ __| | | | '__/ _ \| |/ _` |
| | | | (_| | (__| |_| | | | (_) | | (_| |
|_| |_|\__,_|\___|____/|_| \___/|_|\__,_|
macdcommand — a colorful, boxed terminal interface with an interactive menu and scriptable commands.- True persistence — saved MACs are re-applied automatically at every boot with retry logic that waits for the network stack to be ready.
- Multi-interface — persist rules for
wlan0,wlan1,eth0,rndis0, hotspots, VPN tunnels — anything the kernel exposes. - Original-MAC backup — the very first MAC observed on each interface is stored so you can always
restoreit. - Random MAC modes
laa— random, but with the Locally Administered bit set (default, safest).oui— keeps the current vendor OUI, randomizes only the NIC portion (useful for staying on captive-portal allow-lists that filter by vendor).full— fully random 48 bits.
- OUI vendor lookup — bundled compact vendor database identifies Apple, Samsung, Xiaomi, Google, Huawei, Sony, OnePlus, OPPO, Realme, Motorola, Intel, MediaTek, Qualcomm, Broadcom and more; falls back to LAA detection.
- Change history — last 50 MAC changes are recorded with timestamps.
- POSIX-safe — no bash-only features (no
{1..5}, no[[ ]], noecho -e); the script runs under Android'ssh(mksh/ash) on every Android version from Marshmallow to Baklava. - Systemless — nothing is written to
/system; all persisted state lives under/data/adb/macdroid. - Magisk-proper install — uses the standard
install_moduleflow,set_perm_recursive, and API/SDK checks. - Legacy migration — automatically upgrades configs from MacDroid v1.
| Android version | API level | Status |
|---|---|---|
| 6.0 Marshmallow | 23 | Supported |
| 7.x Nougat | 24 – 25 | Supported |
| 8.x Oreo | 26 – 27 | Supported |
| 9 Pie | 28 | Supported |
| 10 | 29 | Supported |
| 11 | 30 | Supported |
| 12 / 12L | 31 – 32 | Supported (see MAC randomization note) |
| 13 | 33 | Supported |
| 14 | 34 | Supported |
| 15 | 35 | Supported |
| 16 (Baklava) | 36+ | Supported |
Requirements: Magisk 20.4+, root, and a kernel that allows ip link set dev … address (nearly every commercial Android kernel does).
Android 12–14 note. The OS's own MAC randomization can override your setting at Wi-Fi association time. If that happens on your ROM, disable Randomized MAC inside the Wi-Fi network's advanced settings, or install a per-SSID randomization blocker (e.g. a hooking framework module). MacDroid still controls the interface at the kernel level — the OS just may re-randomize on top.
-
Download
MacDroid.zip. -
Open Magisk → Modules → Install from storage → pick
MacDroid.zip. -
Reboot.
-
Open any terminal (Termux, adb shell, or the built-in shell), and run:
su -c macd
The interactive menu will greet you.
macd # interactive menu
macd status # list all interfaces + persisted rules
macd show <iface> # detailed info for one interface
macd set <iface> <mac> # set custom MAC (also persisted)
macd random <iface> [mode] # random MAC. mode = laa | full | oui
macd apply # re-apply every persisted rule immediately
macd restore <iface> # revert to original MAC + drop persistence
macd unset <iface> # remove persistence but keep current MAC
macd vendor <mac> # OUI vendor lookup
macd history # last 50 changes with timestamps
macd version # print version
macd help # full help screen
# Show everything at a glance
macd status
# Randomize wlan0 with the safest strategy
macd random wlan0 # equivalent to: macd random wlan0 laa
# Randomize but keep the current vendor (helps on some captive portals)
macd random wlan0 oui
# Pin an explicit MAC
macd set wlan0 12:34:56:78:9A:BC
# Give me my real MAC back
macd restore wlan0Every write operation is persisted automatically, so the same MAC is re-applied on the next boot.
-
On installation, MacDroid creates
/data/adb/macdroid/for state. -
Every
set/randomwrites a line into/data/adb/macdroid/mac.conf:wlan0 12:34:56:78:9A:BC eth0 02:AA:BB:CC:DD:EE -
At boot, Magisk's
post-fs-data.shmigrates any legacy v1 config, andservice.shwaits for the network stack, then re-applies every rule with 5 retries and 2-second back-off. -
The very first MAC ever observed for an interface is saved to
/data/adb/macdroid/original.macsomacd restorecan always undo everything.
Remove the module from Magisk and reboot. Your persisted state is intentionally preserved in /data/adb/macdroid/ so that a reinstall picks up where you left off. To wipe it completely:
rm -rf /data/adb/macdroid"Kernel refused the change"
Wi-Fi drivers often lock the MAC while the radio is on. Toggle Wi-Fi off, run macd set …, then toggle Wi-Fi on.
"Interface not found"
Run macd status to see the exact interface names on your device. Not every Android calls its Wi-Fi wlan0 — some use wlp0s1, wifi0, etc.
Nothing happens at boot
Check /data/adb/macdroid/boot.log. It records every boot-time apply attempt with timestamps and error messages.
The MAC changes back on Android 12+ This is the OS re-randomizing on top of your kernel-level change. See the Android 12–14 note above.
Changing MAC addresses can violate network policies and access controls. Random MACs default to the Locally Administered range so they don't collide with legitimate vendor OUIs. This software is provided as-is for educational and personal use. You are solely responsible for how you use it.