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