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 網路分享失敗,可以照這個方向檢查:

  1. 先確認 USB 裝置清單是否看得到手機。
  2. 再確認網路介面清單是否有新增手機網卡。
  3. 如果沒有,確認 HoRNDIS 是否真的安裝到 /Library/Extensions
  4. 不要只相信安裝畫面,要檢查 kext 檔案是否存在。
  5. 若 kext 存在但沒載入,到「隱私權與安全性」允許系統軟體。
  6. 必要時重開機。
  7. 手機端要確定 USB 網路共用真的打開。
  8. 最後檢查 default route 是否走手機介面。

這次最大的教訓是:新版 macOS 上,舊式 kext 的問題不只是「裝不裝得上」,而是牽涉到安裝包腳本、kext 核准、kernel collection、KDK,以及手機端 USB 模式。任何一段沒通,最後看起來都會像是「手機接上了,但網路就是不能用」。

結論

這個問題最後能解開,是因為我們沒有停在「安裝失敗」或「重開機試試看」這種模糊判斷,而是一步一步確認:

  • USB 是否看得到手機
  • macOS 是否出現網路介面
  • HoRNDIS 是否真的安裝
  • kext 是否被允許載入
  • 系統是否能重建/使用 auxiliary kernel collection
  • 手機端是否真的進入 USB 網路分享模式
  • 預設路由是否真的切到手機

最後的成功狀態是:HoRNDIS 載入、手機 USB 網卡出現、Mac 的預設網路走手機介面,外網連線測試正常。

留言