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) มีการเปลี่ยนแปลงต่อไปนี้สำหรับแอปเมื่อแสดงบนอุปกรณ์หน้าจอขนาดใหญ่
เลย์เอาต์ที่ปรับเปลี่ยนได้
With Android apps now running on a variety of devices (such as phones, tablets, foldables, desktops, cars, and TVs) and windowing modes on large screens (such as split screen and desktop windowing), developers should build Android apps that adapt to any screen and window size, regardless of device orientation. Paradigms like restricting orientation and resizability are too restrictive in today's multidevice world.
Ignore orientation, resizability, and aspect ratio restrictions
For apps targeting Android 16 (API level 36), Android 16 includes changes to how the system manages orientation, resizability, and aspect ratio restrictions. On displays with smallest width >= 600dp, the restrictions no longer apply. Apps also fill the entire display window, regardless of aspect ratio or a user's preferred orientation, and pillarboxing isn't used.
This change introduces a new standard platform behavior. Android is moving toward a model where apps are expected to adapt to various orientations, display sizes, and aspect ratios. Restrictions like fixed orientation or limited resizability hinder app adaptability, so we recommend making your app adaptive to deliver the best possible user experience.
You can also test this behavior by using the
app compatibility framework and
enabling the UNIVERSAL_RESIZABLE_BY_DEFAULT
compat flag.
Common breaking changes
Ignoring orientation, resizability, and aspect ratio restrictions might impact your app's UI on some devices, especially elements that were designed for small layouts locked in portrait orientation: for example, issues like stretched layouts and off-screen animations and components. Any assumptions about aspect ratio or orientation can cause visual issues with your app. Learn more about how to avoid them and improve your app's adaptive behaviour.
Allowing device rotation results in more activity re-creation, which can result in losing user state if not properly preserved. Learn how to correctly save UI state in Save UI states.
Implementation details
The following manifest attributes and runtime APIs are ignored across large screen devices in full-screen and multi-window modes:
screenOrientation
resizableActivity
minAspectRatio
maxAspectRatio
setRequestedOrientation()
getRequestedOrientation()
The following values for screenOrientation
, setRequestedOrientation()
, and
getRequestedOrientation()
are ignored:
portrait
reversePortrait
sensorPortrait
userPortrait
landscape
reverseLandscape
sensorLandscape
userLandscape
Regarding display resizability, android:resizeableActivity="false"
,
android:minAspectRatio
, and android:maxAspectRatio
have no effect.
For apps targeting Android 16 (API level 36), app orientation, resizability, and aspect ratio constraints are ignored on large screens by default, but every app that isn't fully ready can temporarily override this behavior by opting out (which results in the previous behavior of being placed in compatibility mode).
Exceptions
The Android 16 orientation, resizability, and aspect ratio restrictions don't apply in the following situations:
- Games (based on the
android:appCategory
flag) - Users explicitly opting in to the app's default behavior in aspect ratio settings of the device
- Screens that are smaller than
sw600dp
Opt out temporarily
To opt out a specific activity, declare the
PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY
manifest property:
<activity ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
...
</activity>
If too many parts of your app aren't ready for Android 16, you can opt out completely by applying the same property at the application level:
<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) ยังจัดว่าเป็นที่อยู่เครือข่ายภายในด้วย