Moduł DNS Resolver zapewnia ochronę użytkownika przed przechwyceniem DNS i aktualizacjami konfiguracji oraz poprawioną wydajność sieci dla rozdzielczości DNS. Moduł zawiera kod implementujący DNS stub resolver, który tłumaczy nazwy takie jak www.google.com na adresy IP takie jak 2001:db8::1 . Przelicznik pośredniczący DNS obsługuje elementy Java API, takie jak InetAddress#getAllByName i Network#getAllByName , a także natywne funkcje sieciowe i implementuje wysyłanie i odbieranie zapytań DNS oraz buforowanie wyników.
Zmiany w Androidzie 10
Na urządzeniach z Androidem 9 i starszym kod rozpoznawania nazw DNS jest rozłożony na Bionic i netd
. Wyszukiwania DNS są scentralizowane w demonie netd
, aby umożliwić buforowanie całego systemu, podczas gdy aplikacje wywołują funkcje (takie jak getaddrinfo
) w Bionic. Zapytanie jest wysyłane przez gniazdo UNIX do /dev/socket/dnsproxyd
do demona netd
, który analizuje żądanie i ponownie wywołuje getaddrinfo
w celu przeprowadzenia wyszukiwania DNS, a następnie buforuje wyniki, aby inne aplikacje mogły z nich korzystać. Implementacja przelicznika DNS była w większości zawarta w bionic/libc/dns/
i częściowo w system/netd/server/dns
.
Android 10 przenosi kod programu rozpoznawania nazw DNS do system/netd/resolv,
konwertuje go na C++, a następnie modernizuje i refaktoryzuje kod. Kod w Bionic nadal istnieje ze względu na kompatybilność aplikacji, ale nie jest już wywoływany przez system. Refaktoryzacja ma wpływ na te ścieżki źródłowe:
-
bionic/libc/dns
-
system/netd/client
-
system/netd/server/dns
-
system/netd/server/DnsProxyListener
-
system/netd/server/ResolverController
-
system/netd/resolv
Format i zależności
Moduł DNS Resolver (`com.android.resolv`) jest dostarczany jako plik APEX i jest dynamicznie łączony przez netd
; jednak netd
nie jest zależnością, ponieważ moduł obsługuje bezpośrednio lokalne gniazdo /dev/socket/dnsproxyd
. Punkt końcowy Binder dla konfiguracji przelicznika został przeniesiony z netd
do przelicznika, co oznacza, że usługa systemowa może wywołać bezpośrednio moduł przelicznika bez przechodzenia przez netd
.
Moduł DNS Resolver zależy od libc
(Bionic) i statycznie łączy jego zależności; żadne inne biblioteki nie są wymagane.
mDNS .lokalna rozdzielczość
Od listopada 2021 r. przelicznik dla systemu Android obsługuje rozdzielczość mDNS .local, która implementuje „5.1 One-Shot multicast DNS Queries” w RFC 6762, aby wysyłać standardowe zapytania DNS na ślepo do 224.0.0.251:5353 lub [FF02::FB]:5353. Rozdzielczość mDNS jest przezroczyście obsługiwana przez wywołanie getaddrinfo()
z nazwą hosta kończącą się na *.local
.
Rozdzielczość mDNS .local rozszerza istniejącą funkcjonalność getaddrinfo()
w celu uzyskania adresów. Jeśli urządzenie obsługuje rozdzielczość mDNS .local, wówczas funkcja API getaddrinfo()
wysyła zapytania mDNS do 224.0.0.251:5353 lub [FF02::FB]:5353 i zwraca adresy lokalne. Jeśli urządzenie nie obsługuje rozdzielczości mDNS .local, metoda API getaddrinfo()
wysyła zapytanie DNS do serwera DNS.
Kod znajduje się w AOSP, znajdującym się w packages/modules/DnsResolver
. Użytkownicy mogą zachować swój obecny projekt mDNS, aby uzyskać adresy, lub zamiast tego użyć getaddrinfo()
. Zachowanie tej funkcji przypomina zwykłe zapytanie DNS wysyłane na adresy multiemisji mDNS. Ta funkcja nie ma wpływu na kondycję systemu.
Użytkownicy mogą użyć polecenia adb shell ping6 HOSTNAME .local
, gdzie HOSTNAME to nazwa hosta urządzenia docelowego w sieci LAN, na przykład adb shell ping6 ipad.local
.
Połączenia VPN i mobilne połączenia danych są wyłączone z rozdzielczości .local.