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