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

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

ลักษณะการเลือกเครือข่าย

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

Android 12

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

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

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

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

หากเครือข่าย 2 เครือข่ายแสดงคำขอหนึ่งๆ ได้และเทียบเท่ากันจากมุมมองนโยบาย การเลือกจะเลือกเครือข่ายที่กำลังให้บริการคำขอนั้นอยู่ หากไม่มีเครือข่ายใดให้บริการตามคำขอ เครือข่ายจะเลือก 1 จาก 2 เครือข่าย หลังจากนั้นระบบจะยังคงใช้เครือข่ายนี้ต่อไปจนกว่าแฟล็กนโยบายจะมีการเปลี่ยนแปลง

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

Android 11

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

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

คลาส NetworkScore

คลาสหลักสําหรับฟีเจอร์การเลือกเครือข่ายคือ NetworkScore คลาสนี้ประกอบด้วย API และเอกสารประกอบของ Flag ที่ใช้ได้และเมธอด setKeepConnectedReason

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

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

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

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

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

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

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

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

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

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

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

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