การเลือกเครือข่าย

หน้านี้อธิบายวิธีที่ Android เลือกเครือข่ายที่พร้อมใช้งานพร้อมกัน กลไกการเลือกเครือข่ายนี้ส่งผลต่อวิธีที่ Android ดำเนินการตามคำขอเครือข่ายของแอปและระบบ รวมถึงมีผลต่อวิธีที่ Android เลือกเครือข่ายเริ่มต้นสำหรับแอป

ลักษณะการทำงานของการเลือกเครือข่าย

ส่วนนี้อธิบายลักษณะการทำงานของการเลือกเครือข่ายสำหรับอุปกรณ์ที่ใช้ Android 12 ขึ้นไป และสำหรับอุปกรณ์ที่ใช้ Android 11 (API ระดับ 30) ลงไป

Android 12

สำหรับอุปกรณ์ที่ใช้ Android 12 ขึ้นไป Android จะใช้คลาส NetworkScore เพื่อเลือกเครือข่ายที่พร้อมใช้งาน คลาสนี้ มีค่าสถานะที่ใช้ในการตัดสินใจด้านนโยบาย แต่ละแฟล็กแสดงถึงแอตทริบิวต์เครือข่าย ที่มีความสำคัญต่อการเลือกเครือข่าย

ตัวแทนเครือข่าย (NetworkAgent) ใช้แฟล็ก POLICY_TRANSPORT_PRIMARY เพื่อระบุว่า Android ต้องการเครือข่ายหากมีหลายเครือข่ายที่มีการรับส่งข้อมูลเดียวกัน เช่น อุปกรณ์แบบ 2 ซิมจะมีสวิตช์ในการตั้งค่าที่ให้คุณเลือกซิมการ์ดที่จะใช้เป็นค่าเริ่มต้น ภายใน การรับส่งที่กำหนด Android จะเลือกใช้เครือข่ายที่มีPOLICY_TRANSPORT_PRIMARY แฟล็กมากกว่าเครือข่ายที่ไม่มีแฟล็ก

ตัวแทนเครือข่ายใช้แฟล็ก POLICY_EXITING เพื่อระบุเครือข่ายที่คาดว่าจะตัดการเชื่อมต่อ เช่น คุณภาพเครือข่าย Wi-Fi จะลดลงหากผู้ใช้เดินออกนอกช่วงของเครือข่าย Android จะหลีกเลี่ยงการใช้เครือข่ายที่มีแฟล็กนี้ หากมีเครือข่ายอื่นที่ไม่มีแฟล็กนี้พร้อมใช้งาน Agent เครือข่ายแต่ละรายสามารถกำหนดได้ เมื่อเครือข่ายเสื่อมถอยจนถึงระดับที่ควรพิจารณาว่าควรออกจากเครือข่าย

NetworkScore คลาสยังช่วยให้ตัวแทนเครือข่ายประกาศได้ว่า Android จะรักษาการเชื่อมต่อเครือข่ายโดยใช้แฟล็ก KEEP_CONNECTED_FOR_HANDOVER และเมธอด NetworkScore.Builder.setKeepConnectedReason KEEP_CONNECTED_FOR_HANDOVER แฟล็กนี้ช่วยเครือข่ายที่คาดหวัง โดยแฟล็กนี้จะช่วยให้ตัวแทนเครือข่าย สร้างเครือข่ายใน Wi-Fi STA รองได้โดยไม่ต้องทำให้เป็นเครือข่ายหลัก จนกว่า Android จะประเมินประสิทธิภาพของเครือข่าย หากตัวแทนเครือข่าย ไม่ประกาศค่าสถานะนี้ Android จะปิดเครือข่ายที่คาดหวังเนื่องจากไม่ได้ ให้บริการคำขอก่อนที่ตัวแทนจะประเมินประสิทธิภาพของเครือข่าย

หาก 2 เครือข่ายสามารถแสดงคำขอที่กำหนดและมีนโยบายที่เทียบเท่ากัน Android จะเลือกเครือข่ายที่แสดงคำขอ หากไม่มีเครือข่ายใดแสดงคำขอ Android จะเลือกเครือข่ายใดเครือข่ายหนึ่งจาก 2 เครือข่าย ระบบจะยังคงเลือกใช้เครือข่ายนี้ จนกว่าการแจ้งนโยบายจะมีการเปลี่ยนแปลง

ฟีเจอร์การเลือกเครือข่ายมีการใช้งานในโมดูลการเชื่อมต่อใน โครงการโอเพนซอร์ส Android (AOSP) ตรรกะของนโยบายสำหรับการเลือกเครือข่าย อยู่ในคลาส NetworkRanker และคลาสตัวช่วย ซึ่งหมายความว่าผู้ผลิตอุปกรณ์ ไม่สามารถปรับแต่งโค้ดการเลือกเครือข่ายได้โดยตรง แต่ต้องใช้ Flag ใน NetworkScore เพื่อสื่อสารข้อมูลเกี่ยวกับเครือข่ายแทน

Android 11

สำหรับอุปกรณ์ที่ใช้ Android 11 หรือต่ำกว่า Android จะเลือกเครือข่าย โดยอิงตามจำนวนเต็มที่ส่งจากตัวแทนเครือข่าย (NetworkAgent) สำหรับคำขอแต่ละรายการ Android จะเลือกเครือข่ายที่มีคะแนนตัวเลขสูงสุดซึ่งสามารถ ตอบสนองคำขอได้ คะแนนตัวเลขนี้ประกอบด้วยจำนวนเต็มที่เอเจนต์เครือข่ายส่งมา รวมถึงโบนัสหรือค่าปรับเพิ่มเติม Android จะใช้ โบนัสหรือค่าปรับเหล่านี้ตามเงื่อนไข เช่น เครือข่าย ได้รับการตรวจสอบแล้วหรือเป็น VPN เอเจนต์เครือข่ายจะซิงค์กันเพื่อตัดสินใจเกี่ยวกับนโยบาย

หาก 2 เครือข่ายสามารถแสดงคำขอที่ระบุและมีคะแนนตัวเลขเหมือนกัน ระบบจะไม่กำหนดลักษณะการทำงาน

คลาส NetworkScore

NetworkScore คลาสเป็นหัวใจสำคัญของฟีเจอร์การเลือกเครือข่าย คลาสนี้ มี API และเอกสารประกอบสำหรับฟีเจอร์ที่พร้อมใช้งานและเมธอด NetworkScore.Builder.setKeepConnectedReason

คุณต้องสร้างคลาส NetworkScore โดยใช้คลาส Builder และส่งไปยังNetworkAgent Constructor ในระหว่างการเริ่มต้น คุณอัปเดตคะแนนเครือข่ายได้ทุกเมื่อโดยใช้วิธี NetworkAgent#sendNetworkScore

ตัวอย่างการติดตั้งใช้งานตัวแทนเครือข่าย

AOSP มีการติดตั้งใช้งานตัวอย่างของเอเจนต์เครือข่ายต่างๆ รายการต่อไปนี้คือตัวอย่างการใช้งาน

  • TelephonyNetworkAgent: ใช้คะแนนเครือข่ายเพื่อสื่อสารนโยบายสำหรับ เครือข่ายมือถือ
  • ClientModeImpl.WifiNetworkAgent: ใช้คะแนนเครือข่ายเพื่อสื่อสาร นโยบายสำหรับเครือข่าย Wi-Fi การใช้งานนี้ช่วยให้เข้ากันได้แบบย้อนหลังกับจำนวนเต็มเดิมสำหรับคะแนนเครือข่ายโดยใช้แฟล็ก POLICY_EXITING

อุปกรณ์ที่อัปเกรดเป็น Android 12

ผู้ผลิตอุปกรณ์ที่อัปเกรดอุปกรณ์เป็น Android 12 ต้องแก้ไขการใช้งาน Network Agent เพื่อใช้คลาส NetworkScore จำนวนเต็มเดิมที่ใช้ใน Android 11 หรือต่ำกว่าจะ ส่งใน NetworkScore แต่จะใช้เพื่อการบันทึกและการทดสอบการถดถอยเท่านั้น ใน Android 12 ใน Android 12 ผู้ผลิตอุปกรณ์ต้องแสดงการเปลี่ยนแปลงโดยใช้ NetworkScore Flag จากนั้นโมดูล Connectivity Mainline จะใช้ค่าสถานะเพื่อ ตัดสินใจเลือกเครือข่าย ผู้ผลิตอุปกรณ์ที่ใช้โค้ดสำหรับ Android 11 หรือต่ำกว่า แต่สร้างเทียบกับการใช้งานใน Android 12 อาจพบข้อผิดพลาดในการสร้างเนื่องจากมีการนำวิธีการ อัปเดตจำนวนเต็มเดิมออกใน Android 12

สำหรับตัวแทนเครือข่ายที่ใช้คลาส NetworkFactory ภายใน คุณต้อง แสดงตัวกรองคะแนนในออบเจ็กต์ NetworkScore ที่แสดง คะแนนที่แข็งแกร่งที่สุดของเครือข่ายที่โรงงานสร้างได้ เนื่องจากใน Android 12 คลาส NetworkFactory จะส่งต่อเฉพาะคำขอที่ตรงกับตัวกรองคะแนนที่ประกาศไว้ใน NetworkFactory เท่านั้น ซึ่งแตกต่างจากใน Android 11 และเวอร์ชันที่ต่ำกว่าซึ่งจะส่งต่อคำขอทั้งหมด

คุณส่งตัวกรองเพื่อลดความซับซ้อนในการติดตั้งใช้งานและประหยัดแบตเตอรี่ได้ ซึ่งจะช่วยให้มั่นใจได้ว่า NetworkFactory จะไม่ประมวลผลคำขอทั้งหมด อย่างไรก็ตาม หากการติดตั้งใช้งานที่กำหนดเอง กำหนดให้ส่งคำขอทั้งหมดไปยัง NetworkFactory คุณสามารถ ลงทะเบียน NetworkFactory.registerIgnoringScore แทนวิธีการ NetworkFactory.register ปกติได้ หากใช้วิธีนี้ ให้ส่งตัวกรองคะแนน ที่แสดงคะแนนที่ดีที่สุดที่โรงงานสร้างขึ้นได้อย่างแม่นยำที่สุด ซึ่งจะช่วยประหยัดแบตเตอรี่โดยป้องกันการประเมินคำขอที่โรงงานไม่สามารถ ดำเนินการให้ได้

การตรวจสอบความถูกต้อง

หากต้องการยืนยันลักษณะการทำงานของการเลือกเครือข่ายในอุปกรณ์ที่ใช้ Android ให้ใช้การทดสอบต่อไปนี้

  • NetworkScoreTest การทดสอบ CTS
  • NetworkRanker การทดสอบหน่วย

การติดตั้งที่ไม่ถูกต้องอาจส่งผลให้เครือข่ายที่ไม่คาดคิดกลับมายังแอป เมื่อใช้ NetworkCallback ซึ่งรวมถึงการเลือกเครือข่ายเริ่มต้นของอุปกรณ์ (เครือข่ายที่ระบบส่งไปยังแอปเมื่อใช้การเรียกกลับเครือข่าย เช่น กับ ConnectivityManager.registerDefaultNetworkCallback)

อีกปัญหาที่อาจเกิดขึ้นจากการติดตั้งใช้งานที่ไม่ถูกต้องคือแบตเตอรี่หมดเร็ว ซึ่งจะเกิดขึ้นเมื่อมีการเรียกใช้เอเจนต์เครือข่ายที่มีคะแนนซึ่งไม่ทำให้เอเจนต์มีสิทธิ์สำหรับคำขอใดๆ และจะถูกปิดทันทีหลังจากนั้น หากเอเจนต์ เปิดและปิดซ้ำๆ อาจทำให้แบตเตอรี่หมดอย่างรวดเร็ว