Android 16 มีการทํางานบางอย่างที่อาจส่งผลต่อแอปของคุณเช่นเดียวกับเวอร์ชันก่อนหน้า การเปลี่ยนแปลงลักษณะการทํางานต่อไปนี้มีผลกับแอปที่กําหนดเป้าหมายเป็น Android 16 ขึ้นไปเท่านั้น หากแอปกำหนดเป้าหมายเป็น Android 16 ขึ้นไป คุณควรแก้ไขแอปให้รองรับลักษณะการทำงานเหล่านี้ (หากมี)
นอกจากนี้ โปรดตรวจสอบรายการการเปลี่ยนแปลงลักษณะการทำงานที่ส่งผลต่อแอปทั้งหมดที่ทำงานบน Android 16 โดยไม่คำนึงถึง targetSdkVersion
ของแอป
ประสบการณ์ของผู้ใช้และ UI ของระบบ
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ซึ่งมีจุดประสงค์เพื่อสร้างประสบการณ์การใช้งานที่สม่ำเสมอและใช้งานง่ายยิ่งขึ้น
ตัวเลือกการไม่ใช้แบบเต็มหน้าจอจะหยุดให้บริการ
Android 15 enforced edge-to-edge for apps targeting Android 15 (API
level 35), but your app could opt-out by setting
R.attr#windowOptOutEdgeToEdgeEnforcement
to true
. For apps
targeting Android 16 (API level 36),
R.attr#windowOptOutEdgeToEdgeEnforcement
is deprecated and disabled, and your
app can't opt-out of going edge-to-edge.
- If your app targets Android 16 (API level 36) and is running on an
Android 15 device,
R.attr#windowOptOutEdgeToEdgeEnforcement
continues to work. - If your app targets Android 16 (API level 36) and is running on an
Android 16 device,
R.attr#windowOptOutEdgeToEdgeEnforcement
is disabled.
For testing in Android 16 Beta 3, ensure your app supports edge-to-edge and
remove any use of R.attr#windowOptOutEdgeToEdgeEnforcement
so that your app
also supports edge-to-edge on an Android 15 device. To support edge-to-edge,
see the Compose and Views guidance.
ต้องย้ายข้อมูลหรือเลือกไม่ใช้ฟีเจอร์การย้อนกลับแบบคาดคะเน
For apps targeting Android 16 (API level 36) or higher and running on an
Android 16 or higher device, the predictive back system animations
(back-to-home, cross-task, and cross-activity) are enabled by default.
Additionally, onBackPressed
is not called and
KeyEvent.KEYCODE_BACK
is not dispatched anymore.
If your app intercepts the back event and you haven't migrated to predictive
back yet, update your app to use supported back navigation APIs. or
temporarily opt out by setting the
android:enableOnBackInvokedCallback
attribute to false
in the
<application>
or <activity>
tag of your app's AndroidManifest.xml
file.
เลิกใช้งานและปิดใช้ 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
การเพิ่มประสิทธิภาพการจัดกำหนดเวลาสำหรับงานแบบอัตราคงที่
Prior to targeting Android 16, when scheduleAtFixedRate
missed a task execution due to being outside a valid
process lifecycle, all missed executions immediately
execute when the app returns to a valid lifecycle.
When targeting Android 16, at most one missed execution of
scheduleAtFixedRate
is immediately executed when the app
returns to a valid lifecycle. This behavior change is expected to improve app
performance. Test this behavior in your app to check if your app is impacted.
You can also test by using the app compatibility framework
and enabling the STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS
compat flag.
รูปแบบของอุปกรณ์
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 ใหม่สำหรับจัดการการสูญเสียพันธบัตรและการเปลี่ยนแปลงการเข้ารหัส
As part of the Improved bond loss handling, Android 16 also introduces 2 new intents to provide apps with greater awareness of bond loss and encryption changes.
Apps targeting Android 16 can now:
- Receive an
ACTION_KEY_MISSING
intent when remote bond loss is detected, allowing them to provide more informative user feedback and take appropriate actions. - Receive an
ACTION_ENCRYPTION_CHANGE
intent whenever encryption status of the link changes. This includes encryption status change, encryption algorithm change, and encryption key size change. Apps must consider the bond restored if the link is successfully encrypted upon receivingACTION_ENCRYPTION_CHANGE
intent later.
If your app currently uses custom mechanisms for bond loss handling, migrate to
the new intent ACTION_KEY_MISSING
to detect and manage bond loss
events. We recommend your app guide the user to confirm the remote device is in
range before initiating device forgetting and re-pairing.
Moreover, if a device disconnects after ACTION_KEY_MISSING
intent
is received, your app should be mindful about reconnecting to the device as that
device may no longer be bonded with the system.
ความปลอดภัย
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงด้านความปลอดภัยดังต่อไปนี้
การล็อกเวอร์ชัน MediaStore
สำหรับแอปที่กําหนดเป้าหมายเป็น Android 16 ขึ้นไป MediaStore#getVersion()
จะมีลักษณะเฉพาะสำหรับแต่ละแอป ซึ่งจะนําพร็อพเพอร์ตี้ระบุออกจากสตริงเวอร์ชันเพื่อป้องกันการละเมิดและการใช้เทคนิคการระบุตัวตน แอปไม่ควรคาดเดารูปแบบของเวอร์ชันนี้ แอปควรจัดการการเปลี่ยนแปลงเวอร์ชันอยู่แล้วเมื่อใช้ API นี้ และในกรณีส่วนใหญ่ก็ไม่จำเป็นต้องเปลี่ยนแปลงลักษณะการทำงานปัจจุบัน เว้นแต่นักพัฒนาแอปจะพยายามอนุมานข้อมูลเพิ่มเติมที่อยู่นอกเหนือขอบเขตที่ตั้งใจไว้ของ API นี้
เพิ่มความปลอดภัยให้ Intent
The Safer Intents feature is a multi-phase security initiative designed to improve the security of Android's intent resolution mechanism. The goal is to protect apps from malicious actions by adding checks during intent processing and filtering intents that don't meet specific criteria.
In Android 15 the feature focused on the sending app, now with Android 16, shifts control to the receiving app, allowing developers to opt-in to strict intent resolution using their app manifest.
Two key changes are being implemented:
Explicit Intents Must Match the Target Component's Intent Filter: If an intent explicitly targets a component, it should match that component's intent filter.
Intents Without an Action Cannot Match any Intent Filter: Intents that don't have an action specified shouldn't be resolved to any intent filter.
These changes only apply when multiple apps are involved and don't affect intent handling within a single app.
Impact
The opt-in nature means that developers must explicitly enable it in their app manifest for it to take effect. As a result, the feature's impact will be limited to apps whose developers:
- Are aware of the Safer Intents feature and its benefits.
- Actively choose to incorporate stricter intent handling practices into their apps.
This opt-in approach minimizes the risk of breaking existing apps that may rely on the current less-secure intent resolution behavior.
While the initial impact in Android 16 may be limited, the Safer Intents initiative has a roadmap for broader impact in future Android releases. The plan is to eventually make strict intent resolution the default behavior.
The Safer Intents feature has the potential to significantly enhance the security of the Android ecosystem by making it more difficult for malicious apps to exploit vulnerabilities in the intent resolution mechanism.
However, the transition to opt-out and mandatory enforcement must be carefully managed to address potential compatibility issues with existing apps.
Implementation
Developers need to explicitly enable stricter intent matching using the
intentMatchingFlags
attribute in their app manifest.
Here is an example where the feature is opt-in for the entire app,
but disabled/opt-out on a receiver:
<application android:intentMatchingFlags="enforceIntentFilter">
<receiver android:name=".MyBroadcastReceiver" android:exported="true" android:intentMatchingFlags="none">
<intent-filter>
<action android:name="com.example.MY_CUSTOM_ACTION" />
</intent-filter>
<intent-filter>
<action android:name="com.example.MY_ANOTHER_CUSTOM_ACTION" />
</intent-filter>
</receiver>
</application>
More on the supported flags:
Flag Name | Description |
---|---|
enforceIntentFilter | Enforces stricter matching for incoming intents |
none | Disables all special matching rules for incoming intents. When specifying multiple flags, conflicting values are resolved by giving precedence to the "none" flag |
allowNullAction | Relaxes the matching rules to allow intents without an action to match. This flag to be used in conjunction with "enforceIntentFilter" to achieve a specific behavior |
Testing and Debugging
When the enforcement is active, apps should function correctly if the intent
caller has properly populated the intent.
However, blocked intents will trigger warning log messages like
"Intent does not match component's intent filter:"
and "Access blocked:"
with the tag "PackageManager."
This indicates a potential issue that could impact the app and requires
attention.
Logcat filter:
tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")
ความเป็นส่วนตัว
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) ยังจัดว่าเป็นที่อยู่เครือข่ายภายในด้วย