macOS 連 Android USB 網路分享:為什麼 HoRNDIS 裝了還是不能用?
macOS 連 Android USB 網路分享:為什麼 HoRNDIS 裝了還是不能用?
這次要處理的是一個看起來很單純、實際上卻繞了好幾圈的問題:Android 手機已經用 USB 接到 Mac,也開了 USB 網路共用,但 macOS 沒有把手機當成網路卡,電腦仍然走 Wi-Fi。
最後我們成功讓 Mac 透過 Android 手機的 USB 網路上網。這篇整理重點不放在「按哪些按鈕」而已,而是放在:為什麼會遇到這個問題,以及我們做了哪些事才把它解開。
本文已移除隱私資訊,例如手機序號、MAC 位址、內網 IP、使用者名稱與本機資料夾路徑。
問題背景
Android 手機的 USB 網路分享常見會使用 RNDIS。問題是 macOS 原生並不總是能直接支援 Android RNDIS 網路卡,因此很多舊教學會建議安裝 HoRNDIS。
這次環境大致是:
- Intel Mac
- macOS Sonoma 14.x
- Android 手機透過 USB 連接
- 目標是讓 Mac 走手機的 USB 網路共用
一開始 Mac 可以在 USB 裝置清單裡看到手機,但網路介面清單裡沒有新增 Android 手機網卡。也就是說,USB 裝置有接到,但 macOS 還沒有把它當成網路介面。
為什麼會失敗?
這次其實不是單一原因,而是好幾個問題疊在一起。
1. 原版 HoRNDIS 安裝包在新版 macOS 上會失敗
原版 HoRNDIS 9.2 安裝包有通過簽章檢查,但安裝過程會失敗。拆開安裝包後發現,它的安裝後腳本會嘗試清理舊版安裝位置,也就是碰到 /System/Library/Extensions。
在新版 macOS 上,系統磁區受到保護且多數情況是唯讀的。這會讓舊式安裝腳本出錯,導致安裝程式顯示失敗。
換句話說,HoRNDIS 本體不一定壞,但安裝包裡的舊腳本已經不太適合新版 macOS。
2. 第一次修正版「看似成功」,但驅動檔沒有真正落地
我們一開始做了一個本機修正版,移除了那段會碰系統磁區的舊腳本。安裝畫面顯示成功,但重開機後檢查才發現,HoRNDIS 的 kext 檔案沒有真的留在 /Library/Extensions。
這代表「安裝程式顯示成功」不等於「驅動真的安裝成功」。後來改用 pkgbuild 重新打包,才讓 HoRNDIS 正確安裝到 /Library/Extensions/HoRNDIS.kext。
3. HoRNDIS 安裝後,macOS 還不會立刻載入
macOS 11 之後,第三方 kernel extension 不再只是把 kext 放到資料夾就能立即使用。它必須被系統納入 auxiliary kernel collection,並經過使用者允許,通常還需要重開機。
所以我們看到的狀態是:
- HoRNDIS 檔案已存在
- 簽章有效
- 但還沒有被載入
- 網路介面也還沒有出現
這時不能只看安裝成功與否,還要看 kext 是否已經被 macOS 允許並載入。
4. macOS 14 需要相符的 KDK 才能重建 kernel collection
嘗試重建 kernel collection 時,macOS 回報缺少對應系統 build 的 Kernel Debug Kit。電腦上已有舊版 KDK,但 build number 不完全相同,所以 macOS 不接受。
這裡踩到一個很微妙的點:KDK 不只是大版本相同就好,build 也要對得上。
Apple Developer Downloads 當時找不到完全對應的 KDK,因此我們用既有 KDK 做了一個可回復的相容複本,讓 macOS 至少能繼續進入下一階段。這不是最理想的官方做法,但在當下它讓系統不再卡在「缺少 KDK」。
5. 手機端也必須真的進入 USB 網路共用模式
在驅動問題還沒解完時,Mac 只看到手機是一般 USB 裝置,而不是 RNDIS/USB 網路裝置。這代表手機端的「USB 網路共用」也要反覆確認:
- 手機要先接 USB
- Android 設定裡要開啟 USB 網路共用
- 必要時拔插 USB
- 有些手機要等 USB 用途選項出現後才會真正切換模式
也就是說,這不是只有 Mac 端的問題。Mac 端驅動要成功,手機端也要真的送出網路介面。
我們做了什麼?
整體排查順序大概是這樣。
1. 先確認 Mac 有沒有看到手機
我們先確認 USB 裝置清單中有手機,代表線材與基本 USB 連線不是第一個問題。
接著檢查網路介面,發現只有原本的 Ethernet、Wi-Fi、Thunderbolt 等介面,沒有 Android 或手機名稱的新網卡。
這一步讓問題縮小成:USB 有接到,但 macOS 沒有網路驅動可用。
2. 安裝 HoRNDIS,並處理安裝包相容性
原版安裝包失敗後,我們拆開安裝包檢查內容,找到舊安裝腳本會碰新版 macOS 的受保護系統路徑。
之後做了兩次處理:
- 第一次只是移除舊腳本,但 payload 沒有正確落地
- 第二次用
pkgbuild重新打包,才正確把 HoRNDIS 安裝進/Library/Extensions
真正有效的是第二次重建的安裝包。
3. 確認 HoRNDIS 是否真的存在且簽章有效
安裝後我們不只看安裝程式畫面,而是確認:
- HoRNDIS kext 是否真的在
/Library/Extensions - 版本是否正確
- 程式碼簽章是否有效
這一步很重要,因為前一次就是「畫面成功,但檔案不在」。
4. 處理 macOS 的 kext 載入與允許
接著嘗試讓 macOS 載入 HoRNDIS。系統最後明確回報:HoRNDIS 尚未被允許,需要到系統設定中核準。
到「隱私權與安全性」允許後,再重開機,HoRNDIS 才進入可載入狀態。
5. 確認手機網路介面出現
成功後,Mac 的網路硬體清單中出現了以手機型號命名的新網路介面,例如 V2514,並分配到一個新的介面代號。
這是關鍵成功訊號:Mac 不只是看到 USB 手機,而是已經把手機當成網路卡。
6. 驗證預設路由與外網
最後檢查預設路由,確認 Mac 的 default route 已經改走手機 USB 網路介面,而不是 Wi-Fi。
再用外網連線測試確認:
- DNS/HTTP 可通
- ping 外部 IP 可通
- 指定 USB 網路介面連線也可通
這樣才算真的完成,不只是「網卡出現」。
成功時會看到什麼?
成功後大致會看到:
- HoRNDIS 已載入
- 網路介面清單多出手機名稱或 Android 相關介面
- default route 走新的 USB 網路介面
- 外網測試成功
這次成功後,Mac 已經透過 Android 手機 USB 網路共用上網。
給後來遇到同樣問題的人
如果你也遇到 macOS + Android USB 網路分享失敗,可以照這個方向檢查:
- 先確認 USB 裝置清單是否看得到手機。
- 再確認網路介面清單是否有新增手機網卡。
- 如果沒有,確認 HoRNDIS 是否真的安裝到
/Library/Extensions。 - 不要只相信安裝畫面,要檢查 kext 檔案是否存在。
- 若 kext 存在但沒載入,到「隱私權與安全性」允許系統軟體。
- 必要時重開機。
- 手機端要確定 USB 網路共用真的打開。
- 最後檢查 default route 是否走手機介面。
這次最大的教訓是:新版 macOS 上,舊式 kext 的問題不只是「裝不裝得上」,而是牽涉到安裝包腳本、kext 核准、kernel collection、KDK,以及手機端 USB 模式。任何一段沒通,最後看起來都會像是「手機接上了,但網路就是不能用」。
結論
這個問題最後能解開,是因為我們沒有停在「安裝失敗」或「重開機試試看」這種模糊判斷,而是一步一步確認:
- USB 是否看得到手機
- macOS 是否出現網路介面
- HoRNDIS 是否真的安裝
- kext 是否被允許載入
- 系統是否能重建/使用 auxiliary kernel collection
- 手機端是否真的進入 USB 網路分享模式
- 預設路由是否真的切到手機
最後的成功狀態是:HoRNDIS 載入、手機 USB 網卡出現、Mac 的預設網路走手機介面,外網連線測試正常。
留言
張貼留言
歡迎留下您的心靈足跡👍