หน้านี้อธิบายวิธีที่ 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 ให้ใช้การทดสอบต่อไปนี้
NetworkScoreTest
การทดสอบ CTSNetworkRanker
unit test
การติดตั้งใช้งานที่ไม่ถูกต้องอาจส่งผลให้ระบบส่งเครือข่ายที่ไม่คาดคิดไปยังแอปเพื่อตอบสนองต่อการใช้ NetworkCallback
รวมถึงการเลือกเครือข่ายเริ่มต้นของอุปกรณ์ (เครือข่ายที่ระบบส่งไปยังแอปเมื่อใช้การเรียกกลับของเครือข่ายด้วย ConnectivityManager.registerDefaultNetworkCallback
)
ปัญหาที่อาจเกิดขึ้นอีกประการหนึ่งจากการติดตั้งใช้งานที่ไม่ถูกต้องคือแบตเตอรี่หมดเร็วมาก ซึ่งเกิดจากการแสดงตัวแทนเครือข่ายที่มีคะแนนที่ทำให้ไม่มีสิทธิ์รับคำขอใดๆ และถูกปิดลงทันทีหลังจากนั้น หากเปิดและปิดตัวแทนหลายครั้ง แบตเตอรี่อาจหมดเร็ว