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

หน้านี้อธิบายวิธีที่ Android เลือกระหว่างเครือข่ายที่ใช้ได้พร้อมกัน กลไกการเลือกเครือข่ายนี้ส่งผลต่อวิธีที่ Android ตอบสนองคำขอของแอปและเครือข่ายของระบบ และส่งผลต่อวิธีการเลือกเครือข่ายเริ่มต้นสำหรับแอป

พฤติกรรมการเลือกเครือข่าย

ส่วนนี้อธิบายพฤติกรรมการเลือกเครือข่ายสำหรับอุปกรณ์ที่ใช้ Android 12 หรือสูงกว่า และสำหรับอุปกรณ์ที่ใช้ Android 11 หรือต่ำกว่า

Android 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 เพื่อถ่ายทอดข้อมูลที่จำเป็นเกี่ยวกับเครือข่าย

Android 11

สำหรับอุปกรณ์ที่ใช้ Android 11 หรือต่ำกว่านั้น Android จะทำการเลือกเครือข่ายตามจำนวนเต็มอย่างง่ายที่ส่งจากการปรับใช้ตัวแทนเครือข่าย ( NetworkAgent ) สำหรับแต่ละคำขอ Android จะเลือกเครือข่ายที่มีคะแนนตัวเลขสูงสุดที่สามารถตอบสนองคำขอได้ คะแนนที่เป็นตัวเลขนี้ประกอบด้วยจำนวนเต็มที่ส่งโดยตัวแทนเครือข่าย บวกกับโบนัสหรือบทลงโทษเพิ่มเติมที่กำหนดตามเงื่อนไขหลายประการ เช่น เครือข่ายได้รับการตรวจสอบหรือว่าเครือข่ายเป็น VPN หรือไม่ เอเจนต์เครือข่ายแต่ละรายการจะซิงโครไนซ์ซึ่งกันและกันเพื่อทำการตัดสินใจด้านนโยบาย

หากสองเครือข่ายสามารถให้บริการตามคำขอหนึ่งๆ และมีคะแนนตัวเลขเท่ากัน พฤติกรรมจะไม่ถูกกำหนด

คลาส NetworkScore

คลาสกลางสำหรับคุณลักษณะการเลือกเครือข่ายคือ NetworkScore คลาสนี้มี API และเอกสารประกอบของแฟล็กที่พร้อมใช้งานและเมธอด setKeepConnectedReason

คลาส NetworkScore ต้องสร้างผ่านคลาสตัวสร้าง และส่งผ่านไปยังตัว สร้าง NetworkAgent เมื่อเริ่มต้น คะแนนเครือข่ายสามารถอัปเดตได้ตลอดเวลาโดยใช้วิธี NetworkAgent#sendNetworkScore

ตัวอย่างการใช้งานตัวแทนเครือข่าย

AOSP มีตัวอย่างการใช้งานเอเจนต์เครือข่ายต่างๆ ต่อไปนี้คือตัวอย่างการใช้งาน:

  • DcNetworkAgent : ใช้คะแนนเครือข่ายเพื่อสื่อสารนโยบายสำหรับเครือข่ายมือถือ
  • 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 )

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