DNS Resolver

DNS Resolver モジュールは、DNS 傍受や設定の更新攻撃からユーザーを保護し、DNS 解決のネットワーク パフォーマンスを改善します。このモジュールには、名前(www.google.com など)を IP アドレス(2001:db8::1 など)に変換する DNS スタブリゾルバを実装するためのコードが含まれています。DNS スタブリゾルバは、InetAddress#getAllByNameNetwork#getAllByName などの Java API 要素、およびネイティブ ネットワーク機能をサポートし、DNS クエリを送受信して結果をキャッシュします。

Android 10 の変更点

Android 9 以下を搭載するデバイスでは、DNS リゾルバコードは Bionic と netd で配布されます。DNS ルックアップは、システムレベルのキャッシュのために netd デーモンに集中化され、アプリは Bionic の関数(getaddrinfo など)を呼び出します。クエリは、UNIX ソケットを介して /dev/socket/dnsproxyd に送信され、次に netd デーモンに送信されます。このデーモンはリクエストを解析し、getaddrinfo を再度呼び出して DNS ルックアップを発行し、他のアプリが使用できるように結果をキャッシュします。DNS リゾルバの実装は、大部分が bionic/libc/dns/ に含まれ、一部は system/netd/server/dns に含まれています。

Android 10 では DNS リゾルバコードは system/netd/resolv, に移動されます。コードは C ++ に変換されてから、モダナイズおよびリファクタリングされます。Bionic のコードはアプリの互換性を維持するために残されていますが、システムから呼び出されることはありません。次のソースパスは、リファクタリングの影響を受けます。

  • bionic/libc/dns
  • system/netd/client
  • system/netd/server/dns
  • system/netd/server/DnsProxyListener.*
  • system/netd/resolv

形式と依存関係

DNS リゾルバ モジュールは、APEX ファイルとして提供され、netd によって動的にリンクされます。しかし、モジュールがローカル ソケット /dev/socket/dnsproxyd を直接提供するため、netd には依存関係はありません。リゾルバ構成の Binder エンドポイントは、netd からリゾルバに移動されました。つまり、システム サービスは、netd を経由せずにリゾルバ モジュールに直接呼び出すことができます。

DNS Resolver モジュールは libc(Bionic)に依存し、その依存関係を静的にリンクします。他のライブラリは必要ありません。