实测环境:已 Root 的小米 10S、Android 12、Apple Silicon MacBook。
安卓手机默认通过 RNDIS 提供 USB 网络共享,而现代 macOS,尤其是 Apple Silicon MacBook,通常不能原生识别 RNDIS 网卡。
如果手机内核支持 CDC NCM,可在 Root 权限下把 USB Gadget 从 RNDIS 切换为 NCM。macOS 能原生识别 NCM,不需要:
- 安装 HoRNDIS;
- 安装第三方内核驱动;
- 关闭 SIP;
- 修改 Mac 系统内核。
本次小米 10S 实测结果:
- 手机 USB 功能从
rndis成功切换为ncm; - macOS 创建了
Mi 10S网络端口; - 网络接口为
en10; - Mac 获得 IPv4 地址
192.168.180.124; - NCM 枚举和 DHCP 地址分配均已成功。
完整链路如下:
text
手机移动数据或 Wi-Fi
↓
Android Tethering + NAT + DHCP
↓
USB Gadget 使用 CDC NCM
↓
USB-C 数据线
↓
macOS 原生 USB 网络接口 enX
↓
MacBook 访问互联网
一:检查手机是否支持 NCM
1 确认 ADB 在线
bash
adb devices
正常状态应为:
text
device
如果显示 unauthorized,需要在手机上允许 USB 调试;如果显示 offline,可尝试重新插拔数据线或重启 ADB。
2 检查设备和内核
bash
adb shell su -c 'getprop ro.product.device'
adb shell su -c 'getprop ro.build.version.release'
adb shell su -c 'uname -a'
adb shell su -c 'svc usb getFunctions'
3 检查 NCM 内核配置
bash
adb shell su -c 'zcat /proc/config.gz 2>/dev/null | grep -E "USB_F_NCM|USB_CONFIGFS_NCM|USB_F_RNDIS|USB_CONFIGFS_RNDIS"'
本次小米 10S 的关键输出:
text
CONFIG_USB_F_NCM=y
CONFIG_USB_F_RNDIS=y
CONFIG_USB_CONFIGFS_NCM=y
CONFIG_USB_CONFIGFS_RNDIS=y
其中最关键的是:
text
CONFIG_USB_F_NCM=y
CONFIG_USB_CONFIGFS_NCM=y
如果 /proc/config.gz 不存在,不能直接判断手机不支持 NCM。仍可尝试切换,并以 Mac 是否出现新网络接口作为最终判断。
二:临时切换为 NCM
第一次测试建议先使用临时切换,确认手机、数据线和 Mac 能够完整工作后,再考虑持久化。
操作顺序
- 用数据线连接手机和 Mac。
- 执行
adb devices,确认手机在线。 - 在手机中打开"个人热点"或"便携式热点"。
- 开启"USB 网络共享"。
- 在 Mac 终端执行 NCM 切换命令。
bash
adb shell su -c 'svc usb setFunctions ncm'
切换时 USB Gadget 会重新枚举,ADB 可能短暂断开,这是正常现象。等待 5 至 10 秒,必要时重新插拔数据线。
重新连接后检查当前 USB 功能:
bash
adb shell su -c 'svc usb getFunctions'
成功结果:
text
ncm
如果仍返回 rndis,说明 MIUI 或 USB 网络共享界面又把功能切回了 RNDIS。应先打开 USB 网络共享,再重新执行 NCM 切换命令。
三:可选的持久化配置
临时执行 svc usb setFunctions ncm 可能在以下操作后失效:
- 手机重启;
- 重新插拔数据线;
- 关闭并重新打开 USB 网络共享;
- MIUI 重新应用默认 USB 配置。
Android 12 可以尝试通过全局设置让 USB 网络共享优先使用 NCM:
bash
adb shell su -c 'settings put global tether_force_usb_functions 1'
adb shell su -c 'settings get global tether_force_usb_functions'
adb reboot
重启后:
- 重新连接 Mac;
- 在手机中打开 USB 网络共享;
- 检查当前功能。
bash
adb shell su -c 'svc usb getFunctions'
预期结果:
text
ncm
不同厂商 ROM 可能忽略或覆盖该设置。如果仍返回 rndis,继续采用"先打开 USB 网络共享,再手动执行 NCM 切换"的方式。
四:成功判据
| 检查命令或位置 | 成功表现 | 失败时优先排查 |
|---|---|---|
svc usb getFunctions |
返回 ncm |
开启 USB 网络共享后重新强制 NCM |
networksetup -listallhardwareports |
出现手机名称和 enX |
数据线、USB 授权、NCM 支持、重新插拔 |
ifconfig enX |
status: active |
Android Tethering、DHCP 和下游接口 |
ipconfig getifaddr enX |
返回 192.168.x.x |
重新申请 DHCP 或重启网络共享 |
ping 和 curl |
能访问互联网 | 默认路由、DNS、上游网络、运营商限制 |
五:恢复 Android 默认配置
删除全局 NCM 强制设置:
bash
adb shell su -c 'settings delete global tether_force_usb_functions'
adb reboot
在当前会话中切回 RNDIS:
bash
adb shell su -c 'svc usb setFunctions rndis'
切换时 USB 会重新枚举,ADB 可能暂时断开。
最后:快速执行清单
对于已经确认内核支持 NCM 的 Root 手机,可以直接按下面顺序操作:
bash
# 1. 确认 ADB
adb devices
# 2. 查看当前 USB 功能
adb shell su -c 'svc usb getFunctions'
# 3. 先在手机中打开 USB 网络共享
# 4. 强制切换为 NCM
adb shell su -c 'svc usb setFunctions ncm'
# 5. 确认切换结果
adb shell su -c 'svc usb getFunctions'
# 6. 查看 Mac 网络端口
networksetup -listallhardwareports
# 我这里是查到有一台小米10s的设备,网络接口是en10
# 7. 将 en10 替换为自己实际的 enX
ipconfig getifaddr en10
# 8. 验证公网访问
ping -c 4 1.1.1.1
curl -I https://www.apple.com
满足以下三个条件即可确认成功:
- 手机端
getFunctions返回ncm; - Mac 出现手机网络端口,并获得
192.168.x.x地址; ping和curl均能正常访问公网。