Urządzenia w sieci lokalnej (LAN) są dostępne dla każdej aplikacji, która ma uprawnienie INTERNET.
Ułatwia to aplikacjom łączenie się z urządzeniami lokalnymi, ale ma też wpływ na prywatność, np. umożliwia tworzenie odcisków palców użytkownika i działa jako serwer proxy lokalizacji.
Projekt Local Network Protections ma na celu ochronę prywatności użytkownika poprzez ograniczenie dostępu do sieci lokalnej za pomocą nowego uprawnienia w czasie działania.
Wpływ
W Androidzie 16 to uprawnienie jest funkcją, którą można włączyć. Oznacza to, że będzie ono miało wpływ tylko na aplikacje, które ją włączą. Celem zgody użytkownika jest umożliwienie deweloperom aplikacji określenia, które części aplikacji zależą od niejawnego dostępu do lokalnej sieci, aby mogli przygotować się do ochrony tych części za pomocą uprawnień w przyszłej wersji Androida.
Aplikacje będą miały wpływ na dostęp do sieci lokalnej użytkownika za pomocą:
- Bezpośrednie lub biblioteczne użycie gniazd surowych na adresach sieci lokalnej, np.
Multicast DNS (mDNS)lubSimple Service Discovery Protocol (SSDP). - Używanie klas na poziomie platformy, które mają dostęp do sieci lokalnej, np.
NsdManager.
Szczegóły wpływu
Ruch do i z adresu sieci lokalnej wymaga uprawnienia dostępu do sieci lokalnej. W tabeli poniżej znajdziesz kilka typowych przypadków:
| Operacja sieciowa niskiego poziomu aplikacji | Wymagany jest dostęp do sieci lokalnej |
|---|---|
| Nawiązywanie wychodzącego połączenia TCP | tak |
| Akceptowanie przychodzącego połączenia TCP | tak |
| Wysyłanie transmisji pojedynczej, grupowej lub rozgłoszeniowej UDP | tak |
| Odbieranie przychodzących pakietów UDP unicast, multicast i broadcast | tak |
Te ograniczenia są zaimplementowane głęboko w stosie sieciowym, dlatego dotyczą wszystkich interfejsów API sieci. Obejmuje to gniazda utworzone na platformie lub w kodzie zarządzanym, biblioteki sieciowe, takie jak Cronet i OkHttp, oraz wszystkie interfejsy API zaimplementowane na ich podstawie. Próba rozpoznania usług w sieci lokalnej, które mają sufiks .local, wymaga uprawnień do sieci lokalnej.
Wyjątki od powyższych reguł:
- Jeśli serwer DNS urządzenia znajduje się w sieci lokalnej, ruch do niego i z niego (na porcie 53) nie wymaga uprawnień dostępu do sieci lokalnej.
- Aplikacje, które używają selektora wyjścia jako selektora w aplikacji, nie będą potrzebować uprawnień do sieci lokalnej (więcej informacji podamy w późniejszej wersji).
Wymagania dotyczące Androida 17
Od Androida 17 ochrona sieci lokalnej jest obowiązkowa i wymagana w przypadku aplikacji kierowanych na Androida 17 lub nowszego.
| Proporcje | Android 16 | Android 17 |
|---|---|---|
| Docelowy pakiet SDK | 36 | 37 lub wyższa |
| Uprawnienia | Tymczasowo używane są urządzenia NEARBY_WIFI_DEVICES. | ACCESS_LOCAL_NETWORK |
| Domyślny dostęp | Dostęp przez sieć lokalną jest otwarty | Sieć lokalna jest domyślnie blokowana w przypadku wszystkich aplikacji, które aktualizują docelowy pakiet SDK |
| Grupa uprawnień | Część istniejącej grupy uprawnień NEARBY_DEVICES |
Aby sprawdzić, czy po wprowadzeniu tych zmian aplikacja nadal działa prawidłowo, aplikacje kierowane na pakiet SDK w wersji 37 lub nowszej muszą wybrać jedną z tych ścieżek zarządzania dostępem do sieci lokalnej:
Ścieżka A. Korzystanie z selektorów chroniących prywatność
W przypadku zadań wykrywania i nawiązywania połączenia za pomocą systemu używaj selektorów, aby całkowicie uniknąć proszenia o szerokie uprawnienia w czasie działania. Wybierz odpowiednie selektory w zależności od przypadku użycia:
- Strumieniowe przesyłanie multimediów: aplikacje obsługujące Google Cast mogą korzystać z funkcji przełącznika wyjścia. Dzięki temu deweloperzy mogą zezwalać użytkownikom na wybieranie konkretnych urządzeń streamingowych bez konieczności proszenia aplikacji o ogólne uprawnienie
ACCESS_LOCAL_NETWORK. - Ogólna łączność:
NsdManagerzawiera selektor usług uruchamianych przez system do wykrywania mDNS. Zamiast skanować całą sieć, system wyświetla okno dialogowe, które umożliwia użytkownikowi wybranie jednego urządzenia, do którego aplikacja będzie mieć dostęp.
val discoveryRequest = DiscoveryRequest.Builder("_http._tcp")
.setFlags(DiscoveryRequest.FLAG_SHOW_PICKER)
.build()
nsdManager.registerServiceInfoCallback(discoveryRequest, executor, object : NsdManager.ServiceInfoCallback {
override fun onServiceUpdated(serviceInfo: NsdServiceInfo) {
// Handle the user-selected and discovered service
// NsdServiceInfo.getHostAddresses() can now be connected to
// without ACCESS_LOCAL_NETWORK permission
}
})
Ścieżka B. Prośba o uprawnienia w czasie działania (szeroki dostęp)
Ta ścieżka jest wymagana w przypadku złożonych zastosowań, takich jak automatyzacja domu czy zarządzanie urządzeniami IoT, które wymagają szerokiego i stałego dostępu do sieci lokalnej.
Zadeklaruj uprawnienia w pliku manifestu: deweloperzy muszą wyraźnie zadeklarować
ACCESS_LOCAL_NETWORKw plikuAndroidManifest.xml.Prośba o uprawnienia w czasie działania: przed podjęciem próby uzyskania dostępu do sieci lokalnej aplikacje muszą sprawdzić, czy uprawnienia zostały przyznane. W przeciwnym razie muszą wywołać
Activity.requestPermission(), aby uruchomić standardowy prompt systemowy.Scenariusz wstępnego przyznania uprawnień: uprawnienie
ACCESS_LOCAL_NETWORKnależy do grupy uprawnieńNEARBY_DEVICES. Jeśli użytkownik przyznał już inne uprawnienie w tej grupie (np. uprawnienia Bluetooth), nie będzie ponownie proszony o przyznanie dostępu do sieci lokalnej.Obsługa odmowy i wycofania zgody: aplikacje muszą prawidłowo obsługiwać przypadki, w których użytkownik odmawia zgody na prośbę lub później wycofuje uprawnienia w ustawieniach systemu. W takich przypadkach ruch w sieci lokalnej zostanie zablokowany.
Strategia resetowania licznika próśb o uprawnienia
Platforma wdraża strategię resetowania licznika, która rozwiązuje problemy w sytuacjach, gdy wcześniejsze odrzucenie przez aplikację grupy uprawnień NEARBY_DEVICES (która obejmuje teraz uprawnienie ACCESS_LOCAL_NETWORK) uniemożliwiało jej poproszenie o to uprawnienie po odpowiednim przedstawieniu uzasadnienia. Ten mechanizm daje aplikacji dodatkowe możliwości wywoływania interfejsu requestPermission() API, co powoduje zresetowanie liczby odmów dla uprawnienia ACCESS_LOCAL_NETWORK. Umożliwia to bardziej zniuansowane ponowne zaangażowanie użytkownika, zwłaszcza gdy początkowa odmowa nastąpiła, zanim aplikacja mogła przekazać konieczność dostępu do sieci lokalnej w celu zapewnienia jej podstawowej funkcjonalności.
Model uprawnień podzielonych
Uprawnienie dostępu do sieci lokalnej wykorzystuje strategię migracji uprawnień podzielonych, aby inaczej traktować nowe i starsze aplikacje w zależności od ich docelowego pakietu SDK.
| Kategoria | Docelowy poziom pakietu SDK | Działanie dostępu do sieci lokalnej | Wymagane działanie dewelopera |
|---|---|---|---|
| Nowe aplikacje / zaktualizowane aplikacje | >= 37 (Android 17) | Domyślnie blokowane | Deklarowanie i żądanie uprawnień czasu działania ACCESS_LOCAL_NETWORK |
| Starsze aplikacje | < 37 | Aplikacje z uprawnieniem INTERNET otrzymują domyślnie uprawnienie ACCESS_LOCAL_NETWORK, co pozwala im zachować dostęp. Jest to rozwiązanie tymczasowe, które zostanie domyślnie zablokowane, gdy aplikacja zaktualizuje docelowy pakiet SDK do wersji 37. |
Nie musisz wprowadzać zmian w kodzie już w tej chwili. |
Strategia przenoszenia numerów według przypadku użycia
Przesyłanie: w przypadku funkcji przesyłania multimediów najbardziej odpowiednią strategią, która zapewnia ochronę prywatności, jest użycie przełącznika wyjścia. Ta metoda umożliwia systemowi obsługę wykrywania i nawiązywania połączeń w sieci lokalnej w imieniu użytkownika, eliminując konieczność proszenia przez aplikację o
ACCESS_LOCAL_NETWORKuprawnienia.Przeglądarki: obsługa błędów wymaga różnych podejść w zależności od protokołu. Błędy UDP powodują kod błędu
EPERM. W przypadku połączeń TCP przeglądarki powinny używać interfejsu NDK APIandroid_getnetworkblockedreason(int sockFd), aby określić, czy pakiet został zablokowany przez LNP. Ten interfejs API zwracaANDROID_NETWORK_BLOCKED_REASON_LNP.Inne przypadki użycia (np. IoT): aplikacje, które wyszukują urządzenia za pomocą mDNS, powinny używać
android.net.nsd.DiscoveryRequest#FLAG_SHOW_PICKER, co umożliwia wyszukiwanie urządzeń bez uprawnień, orazNsdManager#registerServiceInfoCallback/NsdManager#resolveServicedo uzyskiwania adresów IP. Połączenia z adresami IP uzyskanymi w ten sposób nie wymagają uprawnieniaACCESS_LOCAL_NETWORK.
W przypadku aplikacji, które wymagają bezpośredniej komunikacji w sieci lokalnej i nie mogą korzystać z selektorów obsługiwanych przez system, zalecane jest użycie strategii licznika resetowania uprawnień. Jeśli użytkownik cofnie uprawnienie ACCESS_LOCAL_NETWORK, ten mechanizm daje aplikacji dodatkowe możliwości ponownego poproszenia o nie, co pozwala deweloperom przedstawić użytkownikowi bardziej przejrzyste uzasadnienie.
Wskazówki dotyczące Androida 16
Aby włączyć ograniczenia dotyczące sieci lokalnej, wykonaj te czynności:
- Zainstaluj na urządzeniu kompilację z Androidem 16 w wersji beta 3 lub nowszej.
- Instalowanie aplikacji do testowania
Przełączanie konfiguracji Appcompat za pomocą adb
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>Uruchom ponownie urządzenie
Dostęp aplikacji do sieci lokalnej jest teraz ograniczony, a każda próba uzyskania dostępu do sieci lokalnej powoduje błędy gniazda.
Jeśli używasz interfejsów API, które wykonują operacje w sieci lokalnej poza procesem aplikacji (np. NsdManager), nie ma to wpływu na rezygnację.
Aby przywrócić dostęp, musisz przyznać aplikacji uprawnienia do NEARBY_WIFI_DEVICES.
- Sprawdź, czy aplikacja deklaruje uprawnienie
NEARBY_WIFI_DEVICESw plikumanifest. - Otwórz Ustawienia > Aplikacje > [Nazwa aplikacji] > Uprawnienia > Urządzenia w pobliżu > Zezwól.
Dostęp aplikacji do sieci lokalnej powinien zostać przywrócony, a wszystkie scenariusze powinny działać tak jak przed włączeniem dostępu. Oto jak wpłynie to na ruch sieciowy aplikacji.
| Uprawnienia | Żądanie wychodzące z sieci LAN | Żądanie internetowe wychodzące/przychodzące | Żądanie przychodzące z sieci LAN |
|---|---|---|---|
| Przyznano | Works | Works | Works |
| Nie przyznano | Wpadki | Works | Wpadki |
Aby wyłączyć konfigurację Appcompat, użyj tego polecenia:
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
Błędy
Jeśli żądanie dostępu do sieci lokalnej nie powiedzie się z powodu braku uprawnień:
Połączenia TCP zwykle powodują błąd przekroczenia limitu czasu.
Błędy UDP i ogólne odmowy uprawnień zwykle powodują zwrócenie kodu błędu EPERM.
Błędy
Przesyłaj zgłoszenia błędów i opinie dotyczące:
- Rozbieżności w dostępie do sieci LAN (uważasz, że określony dostęp nie powinien być traktowany jako dostęp do „sieci lokalnej”)
- Błędy, w których dostęp do sieci LAN powinien być zablokowany, ale nie jest
- Błędy, w których dostęp do sieci LAN nie powinien być blokowany, ale jest
Ta zmiana nie powinna mieć wpływu na:
- Dostęp do internetu
- Sieć komórkowa