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

หน้านี้อธิบายวิธีที่ 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 ให้ใช้การทดสอบต่อไปนี้:

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

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