任何具備 INTERNET
權限的應用程式,都可以存取區域網路上的裝置。這麼做可讓應用程式輕鬆連線至本機裝置,但也可能涉及隱私權問題,例如形成使用者指紋,以及成為位置代理程式。
本區域網路保護專案旨在透過新的執行階段權限,限制使用者存取區域網路的權限,以保護使用者的隱私權。
影響
在 Android 16 期間,此權限為選擇加入功能,也就是說只有選擇加入的應用程式會受到影響。選擇加入的目標是讓應用程式開發人員瞭解應用程式的哪些部分依賴隱含的本機網路存取權,以便他們準備在日後的 Android 版本中使用權限保護機制。
如果應用程式使用以下方式存取使用者的本機網路,就會受到影響:
- 在本機網路位址上直接或透過程式庫使用原始通訊 socket (例如 mDNS 或 SSDP 服務探索通訊協定)
- 使用可存取本機網路的架構層級類別 (例如 NsdManager)
影響詳細資料
進出本機網路位址的流量需要區域網路存取權,下表列出一些常見的情況:
應用程式低層級網路作業 | 必須取得區域網路權限 |
---|---|
建立傳出 TCP 連線 | 是 |
接受傳入的 TCP 連線 | 是 |
傳送 UDP 單播、多播、廣播 | 是 |
接收傳入的 UDP 單播、多點傳播、廣播 | 是 |
這些限制是在網路堆疊中深層實作,因此適用於所有網路 API。這包括在平台或受管理的程式碼中建立的通訊端,Cronet 和 OkHttp 等網路程式庫,以及在這些項目上實作的任何 API。嘗試解析區域網路上的服務 (也就是帶有 .local 後置詞的服務) 時,必須具備區域網路權限。
上述規則的例外狀況:
- 如果裝置的 DNS 伺服器位於區域網路,則進出該伺服器的流量 (在通訊埠 53) 不需要區域網路存取權。
- 使用 Output Switcher 做為應用程式內挑選器的應用程式不需要區域網路權限 (後續版本會提供更多指引)。
指南
如要啟用區域網路限制,請按照下列步驟操作:
- 將裝置刷新至搭載 Android 16 Beta 3 以上版本的版本
- 安裝要測試的應用程式
使用 ADB 切換 Appcompat 設定
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
重新啟動裝置
應用程式現在無法存取區域網路,任何嘗試存取區域網路的動作都會導致通訊端錯誤。如果您使用的是可在應用程式程序外執行區域網路作業的 API (例如 NsdManager),這些 API 在選擇加入期間不會受到影響。
如要恢復存取權,您必須授予應用程式 NEARBY_WIFI_DEVICES
權限。
- 請確認應用程式在資訊清單中宣告
NEARBY_WIFI_DEVICES
權限。 - 依序前往「設定」>「應用程式」>「[應用程式名稱]」>「權限」>「鄰近裝置」>「允許」
應用程式現在應已恢復對本機網路的存取權,所有情境應可如同未選擇加入應用程式前一樣運作。以下說明應用程式網路流量會受到的影響。
權限 | 傳出 LAN 要求 | 傳出/傳入網際網路要求 | 傳入 LAN 要求 |
---|---|---|---|
已授權 | Works | Works | Works |
未授予 | 凸槌影片 | Works | 凸槌影片 |
使用下列指令切換關閉 Appcompat 設定
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
錯誤
只要呼叫端的 send
或 send
變化版本呼叫本機網路位址,系統就會將因這些限制而發生的錯誤傳回至呼叫端的 Socket。
錯誤示例:
sendto failed: EPERM (Operation not permitted)
sendto failed: ECONNABORTED (Operation not permitted)
錯誤
提交錯誤和意見回饋:
- LAN 存取權的差異 (您認為某項存取權不應視為「區域網路」存取權)
- 應封鎖但未封鎖區域網路存取權的錯誤
- 本機網路存取權應未遭到封鎖,但實際上卻遭到封鎖的錯誤
下列項目不受這項異動影響:
- 連上網際網路
- 行動網路