โมดูลโปรแกรมแก้ไข 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
รูปแบบและทรัพยากร Dependency
ระบบจะส่งโมดูลโปรแกรมแก้ไข 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