Android 16 มีการทํางานบางอย่างที่อาจส่งผลต่อแอปของคุณเช่นเดียวกับเวอร์ชันก่อนหน้า การเปลี่ยนแปลงลักษณะการทํางานต่อไปนี้มีผลกับแอปที่กําหนดเป้าหมายเป็น Android 16 ขึ้นไปเท่านั้น หากแอปกำหนดเป้าหมายเป็น Android 16 ขึ้นไป คุณควรแก้ไขแอปให้รองรับลักษณะการทำงานเหล่านี้ (หากมี)
นอกจากนี้ โปรดตรวจสอบรายการการเปลี่ยนแปลงลักษณะการทำงานที่ส่งผลต่อแอปทั้งหมดที่ทำงานบน Android 16 โดยไม่คำนึงถึง targetSdkVersion
ของแอป
ประสบการณ์ของผู้ใช้และ UI ของระบบ
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ซึ่งมีจุดประสงค์เพื่อมอบประสบการณ์การใช้งานที่สม่ำเสมอและใช้งานง่ายยิ่งขึ้นแก่ผู้ใช้
การเลิกใช้งานแบบเต็มหน้าจอจะหยุดให้บริการ
Android 15 บังคับใช้การแสดงผลแบบเต็มหน้าจอสำหรับแอปที่กำหนดเป้าหมายเป็น Android 15 (API ระดับ 35) แต่แอปของคุณเลือกไม่ใช้ได้โดยการตั้งค่า R.attr#windowOptOutEdgeToEdgeEnforcement
เป็น true
สําหรับแอปที่กําหนดเป้าหมายเป็น Android 16 (API ระดับ 36) ระบบจะเลิกใช้งานและปิดใช้ R.attr#windowOptOutEdgeToEdgeEnforcement
และแอปจะเลือกไม่ใช้การแสดงแบบไร้ขอบไม่ได้
- หากแอปกำหนดเป้าหมายเป็น Android 16 (API ระดับ 36) และทำงานในอุปกรณ์ Android 15
R.attr#windowOptOutEdgeToEdgeEnforcement
จะยังคงทำงานต่อไป - หากแอปกำหนดเป้าหมายเป็น Android 16 (API ระดับ 36) และทำงานบนอุปกรณ์ Android 16 ระบบจะปิดใช้
R.attr#windowOptOutEdgeToEdgeEnforcement
สำหรับการทดสอบใน Android 16 Beta 3 โปรดตรวจสอบว่าแอปของคุณรองรับการแสดงผลแบบเต็มหน้าจอและนำการใช้ R.attr#windowOptOutEdgeToEdgeEnforcement
ออกเพื่อให้แอปรองรับการแสดงผลแบบเต็มหน้าจอในอุปกรณ์ Android 15 ด้วย หากต้องการรองรับการแสดงผลแบบเต็มหน้าจอ โปรดดูคำแนะนำเกี่ยวกับการเขียนและมุมมอง
ต้องย้ายข้อมูลหรือเลือกไม่ใช้ฟีเจอร์การย้อนกลับแบบคาดคะเน
สําหรับแอปที่กําหนดเป้าหมายเป็น Android 16 (API ระดับ 36) ขึ้นไปและทํางานในอุปกรณ์ Android 16 ขึ้นไป ระบบจะเปิดใช้ภาพเคลื่อนไหวการกลับไปยังระบบแบบคาดการณ์ (กลับไปยังหน้าจอหลัก ข้ามงาน และข้ามกิจกรรม) โดยค่าเริ่มต้น
นอกจากนี้ ระบบจะไม่เรียกใช้ onBackPressed
และจะไม่ส่ง KeyEvent.KEYCODE_BACK
อีกต่อไป
หากแอปของคุณขัดจังหวะเหตุการณ์ "กลับ" และคุณยังไม่ได้ย้ายข้อมูลไปยัง "กลับ" แบบคาดการณ์ ให้อัปเดตแอปเพื่อใช้ API การนําทางกลับที่รองรับ หรือเลือกไม่ใช้ชั่วคราวโดยตั้งค่าแอตทริบิวต์ android:enableOnBackInvokedCallback
เป็น false
ในแท็ก <application>
หรือ <activity>
ของไฟล์ AndroidManifest.xml
ของแอป
เลิกใช้งานและปิดใช้ Elegant Font API
แอปที่กำหนดเป้าหมายเป็น Android 15 (API ระดับ 35) จะมีการตั้งค่าแอตทริบิวต์ elegantTextHeight
TextView
เป็น true
โดยค่าเริ่มต้น ซึ่งจะแทนที่แบบอักษรแบบกะทัดรัดด้วยแบบอักษรที่อ่านง่ายกว่ามาก คุณ override การตั้งค่านี้ได้โดยตั้งค่าแอตทริบิวต์ elegantTextHeight
เป็น false
Android 16 เลิกใช้งานแอตทริบิวต์ elegantTextHeight
และระบบจะไม่สนใจแอตทริบิวต์นี้เมื่อแอปกำหนดเป้าหมายเป็น Android 16 เราจะหยุดให้บริการ "แบบอักษร UI" ที่ควบคุมโดย API เหล่านี้ ดังนั้นคุณควรปรับเลย์เอาต์เพื่อให้การแสดงผลข้อความในภาษาอาหรับ ลาว เมียนมา ทมิฬ คุชราต กันนาดา มาลายาลัม โอฑียา เตลูกู หรือไทยสอดคล้องกันและใช้งานได้ในอนาคต

elegantTextHeight
สําหรับแอปที่กําหนดเป้าหมายเป็น Android
14 (API ระดับ 34) และต่ำกว่า หรือสําหรับแอปที่กําหนดเป้าหมายเป็น Android 15 (API ระดับ 35) ที่ลบล้างค่าเริ่มต้นโดยการตั้งค่าแอตทริบิวต์ elegantTextHeight
เป็น false

elegantTextHeight
สําหรับแอปที่กําหนดเป้าหมายเป็น Android 16 หรือสําหรับแอปที่กําหนดเป้าหมายเป็น Android 15 (API ระดับ 35) ที่ไม่ได้ลบล้างค่าเริ่มต้นโดยการตั้งค่าแอตทริบิวต์ elegantTextHeight
เป็น false
ฟังก์ชันหลัก
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ซึ่งแก้ไขหรือขยายความสามารถหลักต่างๆ ของระบบ Android
การเพิ่มประสิทธิภาพการจัดกำหนดเวลางานแบบอัตราคงที่
ก่อนที่จะกำหนดเป้าหมายเป็น Android 16 เมื่อ scheduleAtFixedRate
พลาดการเรียกใช้งานเนื่องจากอยู่นอกวงจรการประมวลผลที่ถูกต้อง การเรียกใช้ทั้งหมดที่พลาดไปจะดำเนินการทันทีเมื่อแอปกลับไปยังวงจรการประมวลผลที่ถูกต้อง
เมื่อกำหนดเป้าหมายเป็น Android 16 ระบบจะเรียกใช้scheduleAtFixedRate
ที่พลาดไปไม่เกิน1 ครั้งทันทีเมื่อแอปกลับมาอยู่ในวงจรที่ถูกต้อง การเปลี่ยนแปลงลักษณะการทำงานนี้คาดว่าจะช่วยปรับปรุงประสิทธิภาพของแอป ทดสอบลักษณะการทำงานนี้ในแอปเพื่อดูว่าแอปได้รับผลกระทบหรือไม่
นอกจากนี้ คุณยังทดสอบโดยใช้เฟรมเวิร์กความเข้ากันได้ของแอปและเปิดใช้ Flag STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS
compat ได้ด้วย
รูปแบบของอุปกรณ์
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้สำหรับแอปเมื่อแสดงบนอุปกรณ์หน้าจอขนาดใหญ่
เลย์เอาต์ที่ปรับเปลี่ยนได้
เนื่องจากตอนนี้แอป Android ทำงานได้ในอุปกรณ์ที่หลากหลาย (เช่น โทรศัพท์ แท็บเล็ต อุปกรณ์พับได้ เดสก์ท็อป รถยนต์ และทีวี) และโหมดหน้าต่างบนหน้าจอขนาดใหญ่ (เช่น หน้าจอแยกและหน้าต่างเดสก์ท็อป) นักพัฒนาแอปจึงควรสร้างแอป Android ที่ปรับให้เข้ากับหน้าจอและขนาดหน้าต่างได้ทุกขนาด ไม่ว่าจะวางแนวอุปกรณ์อย่างไรก็ตาม กระบวนทัศน์ต่างๆ เช่น การจำกัดการวางแนวและความสามารถในการปรับขนาดมีข้อจำกัดมากเกินไปในโลกที่มีอุปกรณ์หลายประเภทในปัจจุบัน
ไม่สนใจข้อจำกัดด้านการวางแนว ความสามารถในการปรับขนาด และอัตราส่วนการแสดงผล
สำหรับแอปที่กำหนดเป้าหมายเป็น Android 16 (API ระดับ 36) Android 16 จะมีการเปลี่ยนแปลงวิธีจัดการข้อจำกัดด้านการวางแนว ความสามารถในการปรับขนาด และอัตราส่วนภาพ บนจอแสดงผลที่มีความกว้างน้อยที่สุดตั้งแต่ 600dp ขึ้นไป ข้อจํากัดนี้จะไม่มีผลอีกต่อไป นอกจากนี้ แอปยังแสดงเต็มหน้าต่างแสดงผล โดยไม่คำนึงถึงสัดส่วนการแสดงผลหรือการวางแนวที่ผู้ใช้ต้องการ และจะไม่ใช้การครอบตัดเสา
การเปลี่ยนแปลงนี้จะเปิดตัวลักษณะการทํางานแบบใหม่ของแพลตฟอร์ม Android กำลังเปลี่ยนไปใช้รูปแบบที่คาดหวังให้แอปปรับเปลี่ยนให้เข้ากับการวางแนว ขนาดการแสดงผล และสัดส่วนภาพต่างๆ ข้อจำกัด เช่น การวางแนวแบบคงที่หรือความสามารถในการปรับขนาดที่จำกัด จะขัดขวางการปรับแอปให้เข้ากับอุปกรณ์ ดังนั้นเราขอแนะนำให้ทำให้แอปเป็นแบบปรับขนาดได้เพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีที่สุด
นอกจากนี้ คุณยังทดสอบลักษณะการทํางานนี้ได้โดยใช้เฟรมเวิร์กความเข้ากันได้ของแอปและเปิดใช้ Flag UNIVERSAL_RESIZABLE_BY_DEFAULT
compat
การเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบที่พบได้ทั่วไป
การละเว้นข้อจำกัดด้านการวางแนว การปรับขนาด และอัตราส่วนภาพอาจส่งผลต่อ UI ของแอปในอุปกรณ์บางรุ่น โดยเฉพาะองค์ประกอบที่ออกแบบมาสำหรับเลย์เอาต์ขนาดเล็กซึ่งล็อกไว้ในแนวตั้ง เช่น ปัญหาเกี่ยวกับเลย์เอาต์ที่ยืดออก รวมถึงภาพเคลื่อนไหวและคอมโพเนนต์ที่อยู่นอกหน้าจอ การคาดเดาเกี่ยวกับสัดส่วนการแสดงผลหรือการวางแนวอาจทำให้เกิดปัญหาด้านภาพในแอป ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีหลีกเลี่ยงปัญหาดังกล่าวและปรับปรุงลักษณะการทํางานแบบปรับเปลี่ยนของแอป
การเปิดใช้การเปลี่ยนอุปกรณ์จะส่งผลให้มีการสร้างกิจกรรมใหม่มากขึ้น ซึ่งอาจส่งผลให้สถานะผู้ใช้สูญหายหากไม่เก็บรักษาอย่างเหมาะสม ดูวิธีบันทึกสถานะ UI อย่างถูกต้องในบันทึกสถานะ UI
รายละเอียดการติดตั้งใช้งาน
ระบบจะละเว้นแอตทริบิวต์ไฟล์ Manifest และ API รันไทม์ต่อไปนี้ในอุปกรณ์ที่มีหน้าจอขนาดใหญ่ในโหมดเต็มหน้าจอและโหมดหลายหน้าต่าง
screenOrientation
resizableActivity
minAspectRatio
maxAspectRatio
setRequestedOrientation()
getRequestedOrientation()
ระบบจะละเว้นค่าต่อไปนี้สำหรับ screenOrientation
, setRequestedOrientation()
และ getRequestedOrientation()
portrait
reversePortrait
sensorPortrait
userPortrait
landscape
reverseLandscape
sensorLandscape
userLandscape
android:resizeableActivity="false"
,
android:minAspectRatio
และ android:maxAspectRatio
ไม่มีผลต่อความสามารถในการปรับขนาดการแสดงผล
สําหรับแอปที่กําหนดเป้าหมายเป็น Android 16 (API ระดับ 36) ระบบจะไม่สนใจข้อจํากัดด้านการวางแนวแอป ความสามารถในการปรับขนาด และอัตราส่วนภาพบนหน้าจอขนาดใหญ่โดยค่าเริ่มต้น แต่แอปทุกแอปที่ยังไม่พร้อมใช้งานอย่างสมบูรณ์สามารถลบล้างลักษณะการทํางานนี้ชั่วคราวได้โดยการเลือกไม่ใช้ (ซึ่งจะส่งผลให้แอปมีพฤติกรรมแบบเดิมซึ่งแสดงในโหมดความเข้ากันได้)
ข้อยกเว้น
ข้อจำกัดด้านการวางแนว ความสามารถในการปรับขนาด และอัตราส่วนการแสดงผลของ Android 16 จะไม่มีผลในกรณีต่อไปนี้
- เกม (ตาม Flag
android:appCategory
) - ผู้ใช้เลือกใช้ลักษณะการทำงานเริ่มต้นของแอปในการตั้งค่าสัดส่วนภาพของอุปกรณ์อย่างชัดเจน
- หน้าจอที่มีขนาดเล็กกว่า
sw600dp
เลือกไม่ใช้ชั่วคราว
หากต้องการเลือกไม่ใช้กิจกรรมที่เฉพาะเจาะจง ให้ประกาศPROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY
พร็อพเพอร์ตี้ไฟล์ Manifest ดังนี้
<activity ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
...
</activity>
หากส่วนต่างๆ ของแอปยังไม่พร้อมใช้งานสำหรับ Android 16 คุณสามารถเลือกไม่ใช้โดยสมบูรณ์ได้โดยใช้พร็อพเพอร์ตี้เดียวกันที่ระดับแอปพลิเคชัน ดังนี้
<application ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>
สุขภาพและการออกกำลังกาย
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ที่เกี่ยวข้องกับข้อมูลสุขภาพและการออกกำลังกาย
สิทธิ์ด้านสุขภาพและการออกกำลังกาย
สำหรับแอปที่กำหนดเป้าหมายเป็น Android 16 (API ระดับ 36) ขึ้นไป สิทธิ์ BODY_SENSORS
จะเปลี่ยนไปใช้สิทธิ์แบบละเอียดภายใต้ android.permissions.health
ซึ่ง Health Connect จะใช้ด้วย ตอนนี้ API ใดก็ตามที่ก่อนหน้านี้ต้องใช้ BODY_SENSORS
หรือ
BODY_SENSORS_BACKGROUND
ต้องใช้สิทธิ์ android.permissions.health
ที่เกี่ยวข้อง ซึ่งการดำเนินการนี้จะส่งผลต่อประเภทข้อมูล, API และประเภทบริการที่ทำงานอยู่เบื้องหน้าต่อไปนี้
HEART_RATE_BPM
จากบริการสุขภาพของ WearSensor.TYPE_HEART_RATE
จากเครื่องมือจัดการเซ็นเซอร์ของ AndroidheartRateAccuracy
และheartRateBpm
จาก WearProtoLayout
FOREGROUND_SERVICE_TYPE_HEALTH
ในกรณีที่ต้องใช้สิทธิ์android.permission.health
ที่เกี่ยวข้องแทนBODY_SENSORS
หากแอปของคุณใช้ API เหล่านี้ ตอนนี้แอปควรขอสิทธิ์แบบละเอียดต่อไปนี้
- สําหรับการตรวจสอบอัตราการเต้นของหัวใจ, SpO2 หรืออุณหภูมิผิวขณะใช้งาน ให้ขอสิทธิ์แบบละเอียดในส่วน
android.permissions.health
เช่นREAD_HEART_RATE
แทนBODY_SENSORS
- สําหรับสิทธิ์เข้าถึงเซ็นเซอร์ในเบื้องหลัง ให้ขอ
READ_HEALTH_DATA_IN_BACKGROUND
แทนBODY_SENSORS_BACKGROUND
สิทธิ์เหล่านี้เหมือนกับสิทธิ์ที่ปกป้องการเข้าถึงการอ่านข้อมูลจาก Health Connect ซึ่งเป็นที่เก็บข้อมูล Android สำหรับข้อมูลสุขภาพ การออกกำลังกาย และสุขภาวะ
แอปบนอุปกรณ์เคลื่อนที่
แอปบนอุปกรณ์เคลื่อนที่ที่ย้ายข้อมูลไปใช้ READ_HEART_RATE
และสิทธิ์แบบละเอียดอื่นๆ จะต้องประกาศกิจกรรมเพื่อแสดงนโยบายความเป็นส่วนตัวของแอปด้วย ข้อกำหนดนี้เหมือนกับ Health Connect
การเชื่อมต่อ
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ในกองซ้อนบลูทูธเพื่อปรับปรุงการเชื่อมต่อกับอุปกรณ์ต่อพ่วง
Intent ใหม่สำหรับจัดการการสูญเสียพันธบัตรและการเปลี่ยนแปลงการเข้ารหัส
การจัดการการสูญเสียการเชื่อมโยงที่ดีขึ้นทำให้ Android 16 เปิดตัว Intent ใหม่ 2 รายการเพื่อให้แอปรับรู้ถึงการสูญเสียการเชื่อมโยงและการเปลี่ยนแปลงการเข้ารหัสได้ดียิ่งขึ้น
ตอนนี้แอปที่กําหนดเป้าหมายเป็น Android 16 ทําสิ่งต่อไปนี้ได้
- รับ Intent
ACTION_KEY_MISSING
เมื่อตรวจพบการสูญเสียการเชื่อมโยงระยะไกล ซึ่งช่วยให้สามารถแสดงความคิดเห็นที่เป็นประโยชน์ต่อผู้ใช้มากขึ้นและดำเนินการที่เหมาะสม - รับ Intent
ACTION_ENCRYPTION_CHANGE
เมื่อใดก็ตามที่สถานะการเข้ารหัสของลิงก์มีการเปลี่ยนแปลง ซึ่งรวมถึงการเปลี่ยนแปลงสถานะการเข้ารหัส การเปลี่ยนแปลงอัลกอริทึมการเข้ารหัส และการเปลี่ยนแปลงขนาดคีย์การเข้ารหัส แอปต้องถือว่าการเชื่อมโยงได้รับการกู้คืนหากลิงก์ได้รับการเข้ารหัสเรียบร้อยแล้วเมื่อได้รับ IntentACTION_ENCRYPTION_CHANGE
ในภายหลัง
หากปัจจุบันแอปของคุณใช้กลไกที่กำหนดเองสำหรับการจัดการการสูญเสียพันธบัตร ให้ย้ายข้อมูลไปยัง Intent ใหม่ ACTION_KEY_MISSING
เพื่อตรวจหาและจัดการเหตุการณ์การสูญเสียพันธบัตร เราขอแนะนำให้แอปแนะนำผู้ใช้ให้ตรวจสอบว่าอุปกรณ์ระยะไกลอยู่ในระยะสัญญาณก่อนเริ่มการลืมอุปกรณ์และการจับคู่อีกครั้ง
นอกจากนี้ หากอุปกรณ์ตัดการเชื่อมต่อหลังจากได้รับ Intent ACTION_KEY_MISSING
แอปของคุณควรคำนึงถึงการเชื่อมต่อกับอุปกรณ์อีกครั้ง เนื่องจากอุปกรณ์ดังกล่าวอาจไม่ได้เชื่อมโยงกับระบบแล้ว
ความปลอดภัย
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงด้านความปลอดภัยดังต่อไปนี้
การล็อกเวอร์ชัน MediaStore
สำหรับแอปที่กําหนดเป้าหมายเป็น Android 16 ขึ้นไป MediaStore#getVersion()
จะมีลักษณะเฉพาะสำหรับแต่ละแอป ซึ่งจะนําพร็อพเพอร์ตี้ระบุออกจากสตริงเวอร์ชันเพื่อป้องกันการละเมิดและการใช้เทคนิคการระบุตัวตน แอปไม่ควรคาดเดารูปแบบของเวอร์ชันนี้ แอปควรจัดการการเปลี่ยนแปลงเวอร์ชันอยู่แล้วเมื่อใช้ API นี้ และในกรณีส่วนใหญ่ก็ไม่จำเป็นต้องเปลี่ยนแปลงลักษณะการทำงานปัจจุบัน เว้นแต่นักพัฒนาแอปจะพยายามอนุมานข้อมูลเพิ่มเติมที่อยู่นอกเหนือขอบเขตที่ตั้งใจไว้ของ API นี้
ความเป็นส่วนตัว
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงด้านความเป็นส่วนตัวดังต่อไปนี้
สิทธิ์เข้าถึงเครือข่ายภายใน
แอปใดก็ตามที่มีสิทธิ์ INTERNET
จะเข้าถึงอุปกรณ์ใน LAN ได้
ซึ่งทำให้แอปเชื่อมต่อกับอุปกรณ์ภายในเครื่องได้ง่าย แต่ก็มีผลกระทบด้านความเป็นส่วนตัวด้วย เช่น การสร้างลายนิ้วมือของผู้ใช้ และใช้เป็นพร็อกซีสำหรับตำแหน่ง
โปรเจ็กต์การป้องกันเครือข่ายภายในมีจุดประสงค์เพื่อปกป้องความเป็นส่วนตัวของผู้ใช้โดยควบคุมการเข้าถึงเครือข่ายภายในผ่านสิทธิ์รันไทม์ใหม่
แผนรุ่น
การเปลี่ยนแปลงนี้จะทํางานใน 2 รุ่น ได้แก่ 25Q2 และ TBD ตามลําดับ นักพัฒนาแอปต้องปฏิบัติตามหลักเกณฑ์นี้ในไตรมาสที่ 2 ปี 2565 และแชร์ความคิดเห็น เนื่องจากจะมีการบังคับใช้การป้องกันเหล่านี้ใน Android เวอร์ชันที่ใหม่กว่า นอกจากนี้ จะต้องอัปเดตสถานการณ์ที่ขึ้นอยู่กับการเข้าถึงเครือข่ายภายในโดยนัยโดยใช้คําแนะนําต่อไปนี้ และเตรียมพร้อมสําหรับการปฏิเสธของผู้ใช้และการเพิกถอนสิทธิ์ใหม่
ผลกระทบ
ในตอนนี้ LNP เป็นฟีเจอร์ที่ต้องเลือกใช้ ซึ่งหมายความว่าจะมีเฉพาะแอปที่เลือกใช้เท่านั้นที่ได้รับผลกระทบ เป้าหมายของระยะการเลือกรับคือเพื่อให้นักพัฒนาแอปเข้าใจว่าส่วนใดของแอปที่อาศัยการเข้าถึงเครือข่ายภายในโดยนัย เพื่อให้เตรียมการป้องกันสิทธิ์สำหรับส่วนดังกล่าวในรุ่นถัดไปได้
แอปจะได้รับผลกระทบหากเข้าถึงเครือข่ายภายในของผู้ใช้โดยใช้สิ่งต่อไปนี้
- การใช้ซ็อกเก็ตดิบโดยตรงหรือผ่านไลบรารีในที่อยู่เครือข่ายภายใน (เช่น โปรโตคอลการค้นพบบริการ mDNS หรือ SSDP)
- การใช้คลาสระดับเฟรมเวิร์กซึ่งเข้าถึงเครือข่ายภายใน (เช่น NsdManager)
การรับส่งข้อมูลไปยังและจากที่อยู่เครือข่ายภายในต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน ตารางต่อไปนี้แสดงกรณีทั่วไปบางส่วน
การดำเนินการของเครือข่ายระดับต่ำของแอป | ต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน |
---|---|
การสร้างการเชื่อมต่อ TCP ขาออก | ใช่ |
ยอมรับการเชื่อมต่อ TCP ขาเข้า | ใช่ |
การส่ง UDP unicast, multicast, broadcast | ใช่ |
การรับ UDP ยูนิแคสต์ มัลติแคสต์ บรอดแคสต์ขาเข้า | ใช่ |
ข้อจำกัดเหล่านี้มีผลกับAPI เครือข่ายทั้งหมดเนื่องจากมีการนำมาใช้ในสแต็กเครือข่าย ซึ่งรวมถึงซ็อกเก็ตที่สร้างในโค้ดเนทีฟหรือโค้ดที่มีการจัดการ ไลบรารีเครือข่าย เช่น Cronet และ OkHttp และ API ใดๆ ที่ติดตั้งใช้งานบนซ็อกเก็ตเหล่านั้น การพยายามแก้ไขบริการในเครือข่ายภายใน (เช่น บริการที่มีนามสกุล .local) จะต้องใช้สิทธิ์ในเครือข่ายภายใน
ข้อยกเว้นสำหรับกฎข้างต้น
- หากเซิร์ฟเวอร์ DNS ของอุปกรณ์อยู่ในเครือข่ายภายใน การจราจรขาเข้าหรือขาออกของเซิร์ฟเวอร์ (ที่พอร์ต 53) จะไม่ต้องใช้สิทธิ์เข้าถึงเครือข่ายภายใน
- แอปพลิเคชันที่ใช้ Output Switcher เป็นเครื่องมือเลือกในแอปจะไม่ต้องใช้สิทธิ์เครือข่ายภายใน (เราจะให้คำแนะนำเพิ่มเติมในไตรมาสที่ 4 ปี 2025)
คำแนะนำสำหรับนักพัฒนาแอป (เลือกใช้)
หากต้องการเลือกใช้ข้อจำกัดของเครือข่ายภายใน ให้ทำดังนี้
- แฟลชอุปกรณ์เป็นรุ่นที่มี 25Q2 Beta 3 ขึ้นไป
- ติดตั้งแอปที่จะทดสอบ
สลับ Flag Appcompat ใน ADB โดยทำดังนี้
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
รีบูตอุปกรณ์
ตอนนี้การเข้าถึงเครือข่ายภายในของแอปจะถูกจํากัด และการพยายามเข้าถึงเครือข่ายภายในจะทําให้เกิดข้อผิดพลาดเกี่ยวกับซ็อกเก็ต หากคุณใช้ API ที่ดำเนินการกับเครือข่ายภายในนอกกระบวนการของแอป (เช่น NsdManager) API เหล่านั้นจะไม่ได้รับผลกระทบในระยะการเลือกรับ
หากต้องการคืนค่าสิทธิ์เข้าถึง คุณต้องให้สิทธิ์เข้าถึงแอปแก่ NEARBY_WIFI_DEVICES
- ตรวจสอบว่าแอปประกาศสิทธิ์
NEARBY_WIFI_DEVICES
ในไฟล์ Manifest - ไปที่การตั้งค่า > แอป > [ชื่อแอปพลิเคชัน] > สิทธิ์ > อุปกรณ์ใกล้เคียง > อนุญาต
ตอนนี้การเข้าถึงเครือข่ายภายในของแอปควรได้รับการคืนค่าแล้ว และสถานการณ์ทั้งหมดควรทำงานได้ตามปกติเหมือนก่อนเลือกให้แอปเข้าร่วม
เมื่อการบังคับใช้การป้องกันเครือข่ายภายในเริ่มขึ้น การเข้าชมเครือข่ายของแอปจะได้รับผลกระทบดังนี้
สิทธิ์ | คำขอ LAN ขาออก | คำขออินเทอร์เน็ตขาออก/ขาเข้า | คำขอ LAN ขาเข้า |
---|---|---|---|
ให้สิทธิ์ | Works | Works | Works |
ไม่ให้สิทธิ์ | เรื่องหน้าแตก | Works | เรื่องหน้าแตก |
ใช้คำสั่งต่อไปนี้เพื่อปิด Flag App-Compat
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
ข้อผิดพลาด
ข้อผิดพลาดที่เกิดจากข้อจำกัดเหล่านี้จะแสดงในซ็อกเก็ตที่เรียกใช้ทุกครั้งที่เรียกใช้ send หรือตัวแปร send ไปยังที่อยู่เครือข่ายภายใน
ตัวอย่างข้อผิดพลาด
sendto failed: EPERM (Operation not permitted)
sendto failed: ECONNABORTED (Operation not permitted)
คําจํากัดความของเครือข่ายภายใน
เครือข่ายภายในในโปรเจ็กต์นี้หมายถึงเครือข่าย IP ที่ใช้อินเทอร์เฟซเครือข่ายที่รับส่งข้อมูลได้ เช่น Wi-Fi หรืออีเทอร์เน็ต แต่ยกเว้นการเชื่อมต่อเครือข่ายมือถือ (WWAN) หรือ VPN
เครือข่ายต่อไปนี้ถือว่าเป็นเครือข่ายภายใน
IPv4:
- 169.254.0.0/16 // ลิงก์ภายใน
- 100.64.0.0/10 // CGNAT
- 10.0.0.0/8 // RFC1918
- 172.16.0.0/12 // RFC1918
- 192.168.0.0/16 // RFC1918
IPv6:
- ลิงก์ภายใน
- เส้นทางที่เชื่อมต่อโดยตรง
- เครือข่ายจำลอง เช่น Thread
- หลายซับเน็ต (จะแจ้งภายหลัง)
นอกจากนี้ ทั้งที่อยู่มัลติแคสต์ (224.0.0.0/4, ff00::/8) และที่อยู่ IPv4 แบบบรอดแคสต์ (255.255.255.255) ยังจัดว่าเป็นที่อยู่เครือข่ายภายในด้วย