หน้านี้อธิบายวิธีที่ Android เลือกระหว่างเครือข่ายที่พร้อมใช้งานพร้อมกัน กลไกการเลือกเครือข่ายนี้ส่งผลต่อวิธีที่ Android ตอบสนองแอปและคำขอเครือข่ายของระบบ และส่งผลต่อวิธีการเลือกเครือข่ายเริ่มต้นสำหรับแอป
ลักษณะการเลือกเครือข่าย
ส่วนนี้อธิบายพฤติกรรมการเลือกเครือข่ายสำหรับอุปกรณ์ที่ใช้ Android 12 ขึ้นไป และอุปกรณ์ที่ใช้ Android 11 และต่ำกว่า
แอนดรอยด์ 12
สำหรับอุปกรณ์ที่ใช้ Android 12 ขึ้นไป Android จะใช้คลาส NetworkScore
เพื่อเลือกระหว่างเครือข่ายที่ใช้ได้ คลาสนี้ประกอบด้วยแฟล็กจำนวนหนึ่งที่จำเป็นสำหรับการตัดสินใจด้านนโยบาย แต่ละแฟล็กแสดงถึงคุณลักษณะของเครือข่ายที่มีความสำคัญต่อการเลือกเครือข่ายตามความหมาย
ตัวแทนเครือข่าย ( NetworkAgent
) ใช้แฟล็ก POLICY_TRANSPORT_PRIMARY
เพื่อระบุว่าเครือข่ายเป็นที่ต้องการเมื่อมีเครือข่ายหลายเครือข่ายในการขนส่งเดียวกัน ตัวอย่างทั่วไปของกรณีนี้คืออุปกรณ์ซิมคู่ที่มีสวิตช์ในการตั้งค่าเพื่อให้ผู้ใช้เลือกได้ว่าจะใช้ซิมการ์ดใดเป็นค่าเริ่มต้น ภายในการขนส่งที่กำหนด Android ต้องการเครือข่ายที่มีการตั้งค่าสถานะ POLICY_TRANSPORT_PRIMARY
มากกว่าเครือข่ายที่ไม่มีการตั้งค่าสถานะ
ตัวแทนเครือข่ายใช้แฟล็ก POLICY_EXITING
เพื่อระบุเครือข่ายที่คาดว่าจะยกเลิกการเชื่อมต่อเร็วๆ นี้ ตัวอย่างทั่วไปของกรณีนี้คือเมื่อคุณภาพเครือข่าย Wi-Fi ลดลงเมื่อผู้ใช้เดินออกนอกขอบเขตของเครือข่าย Android หลีกเลี่ยงการใช้เครือข่ายที่มีแฟล็กนี้ หากมีเครือข่ายอื่นที่ไม่มีแฟล็กนี้ เอเจนต์เครือข่ายแต่ละรายสามารถกำหนดได้ว่าเมื่อใดที่เครือข่ายลดระดับลงเพียงพอที่จะพิจารณาออก
คลาส NetworkScore
ยังอนุญาตให้เอเจนต์เครือข่ายประกาศว่าเครือข่ายถูกเก็บไว้โดยใช้แฟล็ก KEEP_CONNECTED_FOR_HANDOVER
และเมธอด NetworkScore.Builder.setKeepConnectedReason
การตั้งค่าสถานะ KEEP_CONNECTED_FOR_HANDOVER
นี้มีประโยชน์สำหรับเครือข่ายในอนาคตที่อนุญาตให้ตัวแทนเครือข่ายเรียกใช้เครือข่ายบน Wi-Fi STA รองโดยไม่ทำให้เป็นเครือข่ายหลักจนกว่าประสิทธิภาพของเครือข่ายจะได้รับการประเมิน หากตัวแทนเครือข่ายไม่ประกาศแฟล็กนี้ เครือข่ายในอนาคตจะถูกรื้อลงเนื่องจากไม่ได้ให้บริการตามคำขอใดๆ ก่อนที่ตัวแทนจะมีโอกาสประเมินประสิทธิภาพของเครือข่าย
หากสองเครือข่ายสามารถตอบสนองคำขอที่กำหนดได้และเทียบเท่ากันในมุมมองนโยบาย การเลือกจะเลือกใช้เครือข่ายที่กำลังให้บริการคำขออยู่ในปัจจุบัน หากไม่มีเครือข่ายใดที่ให้บริการตามคำขอ ระบบจะเลือกเครือข่ายใดเครือข่ายหนึ่ง หลังจากนั้นเครือข่ายนี้ยังคงเป็นที่ต้องการต่อไปจนกว่าการตั้งค่าสถานะนโยบายจะเปลี่ยนไป
การใช้งานคุณสมบัติการเลือกเครือข่ายอยู่ใน โมดูลการเชื่อมต่อ ใน AOSP ตรรกะนโยบายสำหรับการเลือกเครือข่ายจะพบได้ในคลาส NetworkRanker
และคลาสตัวช่วย ซึ่งหมายความว่าผู้ผลิตอุปกรณ์ไม่สามารถปรับแต่งรหัสการเลือกเครือข่ายได้โดยตรง แต่ต้องใช้แฟล็กใน NetworkScore
เพื่อถ่ายทอดข้อมูลที่จำเป็นเกี่ยวกับเครือข่ายแทน
แอนดรอยด์ 11
สำหรับอุปกรณ์ที่ใช้ Android 11 หรือต่ำกว่า Android จะทำการเลือกเครือข่ายโดยอิงตามจำนวนเต็มธรรมดาที่ส่งมาจากการใช้งานตัวแทนเครือข่าย ( NetworkAgent
) สำหรับแต่ละคำขอ Android จะเลือกเครือข่ายที่มีคะแนนตัวเลขสูงสุดที่สามารถตอบสนองคำขอได้ คะแนนตัวเลขนี้ประกอบด้วยจำนวนเต็มที่ส่งโดยตัวแทนเครือข่ายบวกกับโบนัสเพิ่มเติมหรือบทลงโทษที่กำหนดตามเงื่อนไขหลายประการ เช่น เครือข่ายได้รับการตรวจสอบหรือไม่ หรือเครือข่ายนั้นเป็น VPN หรือไม่ ตัวแทนเครือข่ายแต่ละรายจะซิงโครไนซ์ซึ่งกันและกันเพื่อตัดสินใจเกี่ยวกับนโยบาย
หากสองเครือข่ายสามารถตอบสนองคำขอที่กำหนดได้และมีคะแนนตัวเลขเท่ากัน ลักษณะการทำงานจะไม่ถูกกำหนด
คลาส NetworkScore
คลาสกลางสำหรับคุณสมบัติการเลือกเครือข่ายคือ NetworkScore
คลาสนี้ประกอบด้วย API และเอกสารประกอบของแฟล็กที่มีอยู่และเมธอด 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 ผู้ผลิตอุปกรณ์จะต้องแสดงการเปลี่ยนแปลงที่ต้องการโดยใช้แฟล็ก NetworkScore
จากนั้นโมดูล 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
)
ปัญหาที่เป็นไปได้อีกประการหนึ่งของการใช้งานที่ไม่ถูกต้องคือแบตเตอรี่หมดอย่างรุนแรงซึ่งเกิดจากตัวแทนเครือข่ายได้รับคะแนนที่ไม่ปล่อยให้มีคุณสมบัติสำหรับคำขอใด ๆ และถูกรื้อทิ้งทันทีหลังจากนั้น หากนำสารขึ้นและรื้อถอนซ้ำๆ อาจทำให้สิ้นเปลืองแบตเตอรี่ได้มาก