ตั้งแต่วันที่ 27 มีนาคม 2025 เป็นต้นไป เราขอแนะนำให้ใช้ android-latest-release
แทน aosp-main
เพื่อสร้างและมีส่วนร่วมใน AOSP โปรดดูข้อมูลเพิ่มเติมที่หัวข้อการเปลี่ยนแปลงใน AOSP
รีโซลเวอร์ DNS
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
โมดูลโปรแกรมแก้ไข DNS ให้การปกป้องผู้ใช้จากการสกัดกั้น DNS และการโจมตีการอัปเดตการกำหนดค่า และปรับปรุงประสิทธิภาพเครือข่ายสำหรับการแก้ไข DNS โมดูลนี้มีโค้ดที่ใช้โปรแกรมแก้ไข DNS Stub ซึ่งจะแปลชื่อ เช่น www.google.com เป็นที่อยู่ IP เช่น 2001:db8::1 โปรแกรมแก้ไขข้อมูล DNS ย่อยรองรับองค์ประกอบ Java API เช่น InetAddress#getAllByName และ Network#getAllByName รวมถึงฟังก์ชันการทํางานเครือข่ายดั้งเดิม และใช้งานการส่งและรับการค้นหา DNS รวมถึงแคชผลลัพธ์
การเปลี่ยนแปลงใน Android 10
ในอุปกรณ์ที่ใช้ Android 9 และต่ำกว่า โค้ดโปรแกรมแก้ไข DNS จะกระจายอยู่ใน Bionic และ netd
การค้นหา DNS จะรวมอยู่ในไดแอม่อน netd
เพื่อใช้แคชทั้งระบบ ขณะที่แอปเรียกใช้ฟังก์ชัน (เช่น getaddrinfo
) ใน Bionic ระบบจะส่งการค้นหาผ่านซ็อกเก็ต 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/server/ResolverController
system/netd/resolv
ระบบจะส่งโมดูลโปรแกรมแก้ไข DNS ("com.android.resolv") เป็นไฟล์ APEX และ netd
จะลิงก์แบบไดนามิก แต่ netd
ไม่ใช่ข้อกำหนดเนื่องจากโมดูลจะให้บริการซ็อกเก็ตในเครื่อง /dev/socket/dnsproxyd
โดยตรง ระบบได้ย้ายปลายทาง Binder สําหรับการกําหนดค่าโปรแกรมแก้ไขจาก netd
ไปยังโปรแกรมแก้ไขแล้ว ซึ่งหมายความว่าบริการของระบบสามารถเรียกใช้โมดูลโปรแกรมแก้ไขได้โดยตรงโดยไม่ต้องผ่าน netd
โมดูล DNS Resolver ขึ้นอยู่กับ libc
(Bionic) และลิงก์ทรัพยากร Dependency แบบคงที่ โดยไม่จำเป็นต้องใช้ไลบรารีอื่นๆ
การแปลง .local ของ mDNS
ตั้งแต่เดือนพฤศจิกายน 2021 เป็นต้นไป โปรแกรมแก้ไขของ Android จะรองรับการแก้ไข mDNS .local ซึ่งใช้ "5.1 One-Shot multicast DNS Queries" ใน RFC 6762 เพื่อส่งการค้นหา DNS มาตรฐานแบบสุ่มไปยัง 224.0.0.251:5353 หรือ [FF02::FB]:5353 การแก้ไข mDNS จะได้รับการรองรับอย่างโปร่งใสโดยการเรียกใช้ getaddrinfo()
ที่มีชื่อโฮสต์ลงท้ายด้วย *.local
การแก้ไข .local ของ mDNS ช่วยเสริมฟังก์ชันที่มีอยู่ของ getaddrinfo()
เพื่อรับที่อยู่ หากอุปกรณ์รองรับการแก้ไข .local ของ mDNS getaddrinfo()
API จะส่งการค้นหา mDNS ไปยัง 224.0.0.251:5353 หรือ [FF02::FB]:5353 และแสดงผลที่อยู่ภายใน หากอุปกรณ์ไม่รองรับการแก้ไข mDNS .local วิธีการ getaddrinfo()
API จะส่งการค้นหา DNS ไปยังเซิร์ฟเวอร์ DNS
รหัสอยู่ใน AOSP ซึ่งอยู่ใน packages/modules/DnsResolver
ผู้ใช้สามารถใช้การออกแบบ mDNS ปัจจุบันเพื่อรับที่อยู่ หรือจะใช้ getaddrinfo()
แทนก็ได้ ลักษณะการทํางานของฟีเจอร์นี้เหมือนกับการค้นหา DNS ปกติที่ส่งไปยังที่อยู่มัลติแคสต์ mDNS ฟีเจอร์นี้ไม่มีผลต่อประสิทธิภาพของระบบ
ผู้ใช้สามารถใช้คำสั่ง adb shell ping6 HOSTNAME.local
โดยที่ HOSTNAME คือชื่อโฮสต์ของอุปกรณ์เป้าหมายใน LAN เช่น adb shell ping6 ipad.local
การเชื่อมต่อ VPN และอินเทอร์เน็ตมือถือจะยกเว้นจากการแก้ไข .local
ตัวอย่างเนื้อหาและโค้ดในหน้าเว็บนี้ขึ้นอยู่กับใบอนุญาตที่อธิบายไว้ในใบอนุญาตการใช้เนื้อหา Java และ OpenJDK เป็นเครื่องหมายการค้าหรือเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2025-07-27 UTC
[[["เข้าใจง่าย","easyToUnderstand","thumb-up"],["แก้ปัญหาของฉันได้","solvedMyProblem","thumb-up"],["อื่นๆ","otherUp","thumb-up"]],[["ไม่มีข้อมูลที่ฉันต้องการ","missingTheInformationINeed","thumb-down"],["ซับซ้อนเกินไป/มีหลายขั้นตอนมากเกินไป","tooComplicatedTooManySteps","thumb-down"],["ล้าสมัย","outOfDate","thumb-down"],["ปัญหาเกี่ยวกับการแปล","translationIssue","thumb-down"],["ตัวอย่าง/ปัญหาเกี่ยวกับโค้ด","samplesCodeIssue","thumb-down"],["อื่นๆ","otherDown","thumb-down"]],["อัปเดตล่าสุด 2025-07-27 UTC"],[],[],null,["# DNS Resolver\n\nThe DNS Resolver module provides user protection for DNS interception\nand configuration update attacks and improved network performance for DNS\nresolutions. The module contains the code that implements the DNS stub\nresolver, which translates names such as **www.google.com** to IP\naddresses such as **2001:db8::1** . The DNS stub resolver backs\nJava API elements such as\n[InetAddress#getAllByName](https://developer.android.com/reference/java/net/InetAddress#getAllByName(java.lang.String)) and\n[Network#getAllByName](https://developer.android.com/reference/android/net/Network#getAllByName(java.lang.String)), as well as\n[native networking functions](https://developer.android.com/ndk/reference/group/networking), and implements sending and\nreceiving DNS queries and caching the results.\n\nChanges in Android 10\n---------------------\n\n\nOn devices running Android 9 and lower, the DNS resolver code is spread across\nBionic and `netd`. DNS lookups are centralized in the\n`netd` daemon to allow for system-wide caching, while apps\ncall functions (such as `getaddrinfo`) in Bionic. The query is sent\nover a UNIX socket to `/dev/socket/dnsproxyd` to the\n`netd` daemon, which parses the request and calls\n`getaddrinfo` again to issue DNS lookups, then caches the results\nso that other apps can use them. The DNS resolver implementation was mostly\ncontained in `bionic/libc/dns/` and partly in\n`system/netd/server/dns`.\n\n\nAndroid 10 moves the DNS resolver code to\n`system/netd/resolv,` converts it to C++, then modernizes and\nrefactors the code. The code in Bionic continues to exist for app\ncompatibility reasons, but is no longer called by the system. These source\npaths are affected by the refactoring:\n\n- `bionic/libc/dns`\n- `system/netd/client`\n- `system/netd/server/dns`\n- `system/netd/server/DnsProxyListener`\n- `system/netd/server/ResolverController`\n- `system/netd/resolv`\n\nFormat and dependencies\n-----------------------\n\n\nThe DNS Resolver module (\\`com.android.resolv\\`) is delivered as an\n[APEX](/docs/core/ota/apex) file and is dynamically linked by\n`netd`; however, `netd` is **not** a\ndependency as the module serves the local socket\n`/dev/socket/dnsproxyd` directly. The Binder endpoint for the\nresolver configuration was moved from `netd` to the resolver,\nmeaning that the system service can call directly into the resolver module\nwithout going through `netd`.\n\n\nThe DNS Resolver module depends on `libc` (Bionic) and\nstatically links its dependencies; no other libraries are required.\n\nmDNS .local resolution\n----------------------\n\nStarting from November 2021, Android resolver supports mDNS .local resolution, which implements\n\"5.1 One-Shot multicast DNS Queries\" in RFC 6762 to send standard DNS queries blindly to\n224.0.0.251:5353 or \\[FF02::FB\\]:5353. mDNS resolution is transparently supported\nby calling `getaddrinfo()` with a hostname ending in `*.local`.\n\nmDNS .local resolution augments the existing functionality of `getaddrinfo()`\nto get the addresses. If a device supports mDNS .local resolution, then the\n`getaddrinfo()` API sends mDNS queries to 224.0.0.251:5353 or \\[FF02::FB\\]:5353\nand returns the local addresses. If a device doesn't support mDNS .local\nresolution, then the `getaddrinfo()` API method sends a DNS query to the DNS\nserver.\n\nThe code is in AOSP, located in `packages/modules/DnsResolver`. Users can keep their\ncurrent mDNS design to get the addresses, or use `getaddrinfo()` instead. The behavior of\nthis feature is like a regular DNS query sent to the mDNS multicast addresses. This feature has no\nimpact on system health.\n\nUsers can use the command `adb shell ping6 `\u003cvar translate=\"no\"\u003eHOSTNAME\u003c/var\u003e`.local`,\nwhere \u003cvar translate=\"no\"\u003eHOSTNAME\u003c/var\u003e is the hostname of a target device on the LAN, for example,\n`adb shell ping6 ipad.local`.\n\nVPN and mobile data connections are excluded from .local resolution."]]