เช่นเดียวกับรุ่นก่อนหน้า 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 中进行测试,请确保您的应用支持无边框设计,并移除所有 R.attr#windowOptOutEdgeToEdgeEnforcement
用法,以便您的应用在 Android 15 设备上也能支持无边框设计。如需支持从边缘到边缘的显示,请参阅 Compose 和 View 指南。
ต้องย้ายข้อมูลหรือเลือกไม่ใช้เพื่อใช้การคาดการณ์การย้อนกลับ
对于以 Android 16(API 级别 36)或更高版本为目标平台且在搭载 Android 16 或更高版本的设备上运行的应用,预测性返回系统动画(返回主屏幕、跨任务和跨 activity)默认处于启用状态。此外,系统不再调用 onBackPressed
,也不再调度 KeyEvent.KEYCODE_BACK
。
如果您的应用会拦截返回事件,但您尚未迁移到预测性返回,请更新应用以使用受支持的返回导航 API,或者暂时选择停用,方法是在应用的 AndroidManifest.xml
文件的 <application>
或 <activity>
标记中将 android:enableOnBackInvokedCallback
属性设置为 false
。
เลิกใช้งานและปิดใช้ Elegant Font API
以 Android 15(API 级别 35)为目标平台的应用默认将 elegantTextHeight
TextView
属性设置为 true
,从而将紧凑型字体替换为可读性更高的字体。您可以通过将 elegantTextHeight
属性设置为 false
来替换此设置。
Android 16 弃用了 elegantTextHeight
属性,当您的应用以 Android 16 为目标平台后,系统会忽略该属性。由这些 API 控制的“界面字体”即将停用,因此您应调整所有布局,以确保阿拉伯语、老挝语、缅甸语、泰米尔语、古吉拉特语、卡纳达语、马拉雅拉姆语、奥里亚语、泰卢固语或泰语文本的呈现效果一致且不受未来变化的影响。
elegantTextHeight
属性设置为 false
替换默认值的应用,
elegantTextHeight
行为。elegantTextHeight
属性设置为 false
来替换默认值的应用,其 elegantTextHeight
行为。
ฟังก์ชันหลัก
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ซึ่งจะแก้ไขหรือ ขยายความสามารถหลักต่างๆ ของระบบ Android
การเพิ่มประสิทธิภาพการจัดกำหนดการสำหรับงานที่มีอัตราคงที่
在以 Android 16 为目标平台之前,如果 scheduleAtFixedRate
因不在有效的进程生命周期内而错过了任务执行,则当应用返回到有效的生命周期时,所有错过的执行会立即执行。
以 Android 16 为目标平台时,当应用返回到有效的生命周期时,系统会立即执行最多 1 次未执行的 scheduleAtFixedRate
执行。此行为变更预计会提升应用性能。在您的应用中测试此行为,检查您的应用是否受到影响。您还可以使用应用兼容性框架并启用 STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS
兼容性标志进行测试。
รูปแบบของอุปกรณ์
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้สำหรับแอปเมื่อ แสดงบนอุปกรณ์หน้าจอขนาดใหญ่
เลย์เอาต์ที่ปรับเปลี่ยนตามพื้นที่
现在,Android 应用可在各种设备(例如手机、平板电脑、可折叠设备、桌面设备、汽车和电视)上运行,并且在大屏设备上支持多种窗口模式(例如分屏和桌面窗口),因此开发者应构建能够适应任何屏幕和窗口尺寸的 Android 应用,无论设备方向如何。在当今多设备的世界中,限制屏幕方向和尺寸可调整性等范式过于严格。
忽略屏幕方向、尺寸可调整性和宽高比限制
对于以 Android 16(API 级别 36)为目标平台的应用,Android 16 包含对系统管理屏幕方向、尺寸调整能力和宽高比限制的方式的变更。在最小宽度大于或等于 600dp 的显示屏上,这些限制不再适用。应用还会填满整个显示窗口,无论宽高比或用户偏好的屏幕方向如何,都不会使用竖条模式。
此变更引入了新的标准平台行为。Android 正在向一种模型转变,在该模型中,应用需要适应各种屏幕方向、显示大小和宽高比。固定屏幕方向或有限的尺寸可调整性等限制会阻碍应用的适应性,因此我们建议让应用具备自适应能力,以提供尽可能出色的用户体验。
您还可以使用应用兼容性框架并启用 UNIVERSAL_RESIZABLE_BY_DEFAULT
兼容性标志来测试此行为。
常见的重大更改
忽略屏幕方向、可调整大小性和宽高比限制可能会影响应用在某些设备上的界面,尤其是那些专为锁定为纵向的小布局设计的元素,例如布局拉伸、动画和组件超出屏幕等问题。任何关于宽高比或屏幕方向的假设都可能导致应用出现视觉问题。详细了解如何避免这些问题并改进应用的自适应行为。
允许设备旋转会导致更多 activity 重新创建,如果未正确保留,可能会导致用户状态丢失。如需了解如何正确保存界面状态,请参阅保存界面状态。
实现细节
在全屏模式和多窗口模式下,以下清单属性和运行时 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 的屏幕方向、尺寸调整能力和宽高比限制不适用:
- 游戏(基于
android:appCategory
标志) - 用户在设备的宽高比设置中明确选择启用应用的默认行为
- 小于
sw600dp
的屏幕
暂时停用
如需选择停用特定 activity,请声明 PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY
清单属性:
<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
下更精细的权限,健康数据共享也使用这些权限。自 Android 16 起,凡是以前需要 BODY_SENSORS
或 BODY_SENSORS_BACKGROUND
的 API,现在都需要获取相应的 android.permissions.health
权限。这会影响以下数据类型、API 和前台服务类型:
HEART_RATE_BPM
来自 Wear OS 健康服务- 来自 Android 传感器管理器的
Sensor.TYPE_HEART_RATE
- 在 Wear OS 上,
ProtoLayout
中的heartRateAccuracy
和heartRateBpm
FOREGROUND_SERVICE_TYPE_HEALTH
,其中需要使用相应的android.permission.health
权限来代替BODY_SENSORS
如果您的应用使用这些 API,则应请求相应的精细权限:
- 对于使用期间的心率、血氧饱和度或体表温度监测:请求
android.permissions.health
下的精细权限,例如READ_HEART_RATE
,而不是BODY_SENSORS
。 - 对于后台传感器访问权限:请求
READ_HEALTH_DATA_IN_BACKGROUND
而不是BODY_SENSORS_BACKGROUND
。
这些权限与用于保护对 Health Connect(Android 健康、健身和身心状态数据存储区)中数据的读取访问权限相同。
移动应用
迁移到使用 READ_HEART_RATE
和其他精细权限的移动应用还必须声明 activity 以显示应用的隐私权政策。此要求与健康数据共享的要求相同。
การเชื่อมต่อ
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ในสแต็กบลูทูธ เพื่อปรับปรุงการเชื่อมต่อกับอุปกรณ์ต่อพ่วง
เจตนาใหม่ในการจัดการการสูญเสียพันธะและการเปลี่ยนแปลงการเข้ารหัส
การจัดการการสูญเสียการเชื่อมโยงที่ดีขึ้นทำให้ Android 16 เปิดตัว Intent ใหม่ 2 รายการเพื่อให้แอปรับรู้ถึงการสูญเสียการเชื่อมโยงและการเปลี่ยนแปลงการเข้ารหัสได้ดียิ่งขึ้น
ตอนนี้แอปที่กําหนดเป้าหมายเป็น Android 16 ทําสิ่งต่อไปนี้ได้
- รับ Intent
ACTION_KEY_MISSING
เมื่อตรวจพบการสูญเสียการเชื่อมโยงระยะไกล ซึ่งช่วยให้สามารถแสดงความคิดเห็นที่เป็นประโยชน์ต่อผู้ใช้มากขึ้นและดำเนินการที่เหมาะสม - รับ Intent
ACTION_ENCRYPTION_CHANGE
เมื่อใดก็ตามที่สถานะการเข้ารหัสของลิงก์มีการเปลี่ยนแปลง ซึ่งรวมถึงการเปลี่ยนแปลงสถานะการเข้ารหัส การเปลี่ยนแปลงอัลกอริทึมการเข้ารหัส และการเปลี่ยนแปลงขนาดคีย์การเข้ารหัส แอปต้องถือว่าการเชื่อมโยงได้รับการคืนค่าหากลิงก์ได้รับการเข้ารหัสเรียบร้อยแล้วเมื่อได้รับ IntentACTION_ENCRYPTION_CHANGE
ในภายหลัง
การปรับให้เข้ากับการใช้งาน OEM ที่หลากหลาย
แม้ว่า Android 16 จะเปิดตัว Intent ใหม่เหล่านี้ แต่การใช้งานและการออกอากาศอาจแตกต่างกันไปตามผู้ผลิตอุปกรณ์ (OEM) แต่ละราย นักพัฒนาแอปควรออกแบบการจัดการการสูญเสียการเชื่อมโยงให้ปรับให้เข้ากับการเปลี่ยนแปลงที่อาจเกิดขึ้นเหล่านี้ได้อย่างราบรื่น เพื่อให้แอปมอบประสบการณ์การใช้งานที่สอดคล้องกันและเชื่อถือได้ในอุปกรณ์ทุกเครื่อง
เราขอแนะนําลักษณะการทํางานของแอปดังต่อไปนี้
หากมีการออกอากาศ Intent
ACTION_KEY_MISSING
ให้ทำดังนี้ระบบจะตัดการเชื่อมต่อลิงก์ ACL (การเชื่อมต่อแบบไม่ใช้การเชื่อมต่อแบบแอซิงโครนัส) แต่ระบบจะเก็บข้อมูลการเชื่อมโยงสำหรับอุปกรณ์ไว้ (ตามที่อธิบายไว้ที่นี่)
แอปของคุณควรใช้ Intent นี้เป็นสัญญาณหลักในการจับสัญญาณการสูญเสียการเชื่อมโยงและแนะนำผู้ใช้ให้ยืนยันว่าอุปกรณ์ระยะไกลอยู่ในระยะสัญญาณก่อนที่จะเริ่มการลืมอุปกรณ์หรือการจับคู่อีกครั้ง
หากอุปกรณ์ตัดการเชื่อมต่อหลังจากได้รับ
ACTION_KEY_MISSING
แอปของคุณควรระมัดระวังเกี่ยวกับการเชื่อมต่ออีกครั้ง เนื่องจากอุปกรณ์อาจไม่ได้จับคู่กับระบบแล้วหากไม่ได้ออกอากาศ Intent
ACTION_KEY_MISSING
ลิงก์ ACL จะยังคงเชื่อมต่ออยู่ และระบบจะนำข้อมูลการเชื่อมโยงของอุปกรณ์ออก เช่นเดียวกับลักษณะการทำงานใน Android 15
ในกรณีนี้ แอปของคุณควรใช้กลไกการจัดการการสูญเสียการเชื่อมโยงที่มีอยู่ต่อไปเช่นเดียวกับใน Android รุ่นก่อนหน้า เพื่อตรวจหาและจัดการเหตุการณ์การสูญเสียการเชื่อมโยง
วิธีใหม่ในการนำการเชื่อมต่อบลูทูธออก
现在,以 Android 16 为目标平台的所有应用都可以使用 CompanionDeviceManager
中的公共 API 解除蓝牙设备配对。如果配套设备作为 CDM 关联进行管理,则应用可以在关联的设备上使用新的 removeBond(int)
API 触发蓝牙配对的移除。该应用可以通过监听蓝牙设备广播事件 ACTION_BOND_STATE_CHANGED
来监控配对状态变化。
ความปลอดภัย
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงด้านความปลอดภัยต่อไปนี้
การล็อกดาวน์เวอร์ชัน MediaStore
对于以 Android 16 或更高版本为目标平台的应用,MediaStore#getVersion()
现在将是每个应用的唯一标识。这会从版本字符串中移除标识属性,以防止滥用和用于指纹识别技术。应用不应对此版本的格式做出任何假设。在使用此 API 时,应用应已处理版本变更,并且在大多数情况下无需更改其当前行为,除非开发者尝试推断超出此 API 预期范围的其他信息。
ความตั้งใจที่ปลอดภัยยิ่งขึ้น
“更安全的 intent”功能是一项多阶段安全计划,旨在提升 Android 的 intent 解析机制的安全性。目标是在 intent 处理期间添加检查,并过滤不符合特定条件的 intent,从而保护应用免受恶意操作的侵害。
在 Android 15 中,该功能侧重于发送应用,现在在 Android 16 中,控制权转移到了接收应用,允许开发者使用其应用清单选择启用严格的 intent 解析。
我们正在实施两项关键变更:
显式 intent 必须与目标组件的 intent 过滤器相匹配:如果 intent 显式定位到某个组件,则应与该组件的 intent 过滤器相匹配。
没有操作的 intent 无法匹配任何 intent 过滤器:未指定操作的 intent 不应解析为任何 intent 过滤器。
这些变更仅在涉及多个应用时适用,不会影响单个应用内的 intent 处理。
影响
选择启用性质意味着,开发者必须在应用清单中明确启用它,才能使其生效。 因此,此功能的影响将仅限于以下应用(开发者):
- 了解“更安全的 intent”功能及其优势。
- 主动选择在应用中采用更严格的 intent 处理实践。
这种选择性采用的方法可最大限度地降低破坏可能依赖于当前不太安全的 intent 解析行为的现有应用的风险。
虽然在 Android 16 中,初始影响可能有限,但“更安全的 intent”计划的路线图显示,未来 Android 版本中会产生更广泛的影响。我们计划最终将严格的 intent 解析设为默认行为。
“更安全的 intent”功能可让恶意应用更难利用 intent 解析机制中的漏洞,从而显著提升 Android 生态系统的安全性。
不过,向选择退出和强制执行的过渡必须谨慎管理,以解决现有应用的潜在兼容性问题。
实现
开发者需要在应用清单中使用 intentMatchingFlags
属性明确启用更严格的 intent 匹配。
以下示例展示了如何为整个应用选择启用该功能,但在接收器上停用/选择停用该功能:
<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>
有关支持的标志的更多信息:
标志名称 | 说明 |
---|---|
enforceIntentFilter | 对传入的 intent 强制执行更严格的匹配 |
none | 停用针对传入 intent 的所有特殊匹配规则。指定多个标志时,系统会优先考虑“无”标志,以解决值冲突问题 |
allowNullAction | 放宽了匹配规则,允许匹配没有操作的 intent。此标志与“enforceIntentFilter”结合使用可实现特定行为 |
测试和调试
在强制执行处于有效状态时,如果 intent 调用方已正确填充 intent,应用应能正常运行。
不过,被屏蔽的 intent 会触发警告日志消息(例如 "Intent does not match component's intent filter:"
和 "Access blocked:"
),并带有标记 "PackageManager."
。这表示存在可能会影响应用的潜在问题,需要引起注意。
Logcat 过滤条件:
tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")
ความเป็นส่วนตัว
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงด้านความเป็นส่วนตัวต่อไปนี้
สิทธิ์เข้าถึงเครือข่ายภายใน
แอปที่มีINTERNET
จะเข้าถึงอุปกรณ์ใน LAN ได้
ซึ่งช่วยให้แอปเชื่อมต่อกับอุปกรณ์ในพื้นที่ได้ง่าย แต่ก็มีผลกระทบด้านความเป็นส่วนตัวด้วย เช่น การสร้างลายนิ้วมือของผู้ใช้ และการเป็นพร็อกซีสำหรับตำแหน่ง
โปรเจ็กต์การป้องกันเครือข่าย LAN มีเป้าหมายเพื่อปกป้องความเป็นส่วนตัวของผู้ใช้โดย จำกัดการเข้าถึงเครือข่าย LAN ไว้เบื้องหลังสิทธิ์รันไทม์ใหม่
แผนการเปิดตัว
การเปลี่ยนแปลงนี้จะได้รับการติดตั้งใช้งานระหว่าง 2 รุ่น ได้แก่ 25Q2 และ TBD ตามลำดับ นักพัฒนาแอปต้องปฏิบัติตามคำแนะนำนี้สำหรับ 25Q2 และแชร์ความคิดเห็น เนื่องจากระบบจะบังคับใช้การป้องกันเหล่านี้ใน Android เวอร์ชันต่อๆ ไป นอกจากนี้ นักพัฒนาแอปจะต้องอัปเดตสถานการณ์ที่ขึ้นอยู่กับการเข้าถึงเครือข่ายภายในโดยนัยโดยใช้คำแนะนำต่อไปนี้ และเตรียมพร้อมสำหรับการปฏิเสธของผู้ใช้ และการเพิกถอนสิทธิ์ใหม่
ผลกระทบ
ในระยะปัจจุบัน LNP เป็นฟีเจอร์ที่ต้องเลือกใช้ ซึ่งหมายความว่าจะมีผลกับแอปที่เลือกใช้เท่านั้น เป้าหมายของระยะการเลือกใช้คือการช่วยให้นักพัฒนาแอป เข้าใจว่าส่วนใดของแอปที่ต้องอาศัยการเข้าถึงเครือข่าย LAN โดยนัย เพื่อเตรียมพร้อมที่จะใช้การป้องกันสิทธิ์สำหรับรุ่นถัดไป
แอปจะได้รับผลกระทบหากเข้าถึงเครือข่าย LAN ของผู้ใช้โดยใช้สิ่งต่อไปนี้
- การใช้ซ็อกเก็ตดิบโดยตรงหรือผ่านไลบรารีในที่อยู่เครือข่ายภายใน (เช่น โปรโตคอลการค้นพบบริการ mDNS หรือ SSDP)
- การใช้คลาสระดับเฟรมเวิร์กที่เข้าถึงเครือข่ายภายใน (เช่น NsdManager)
การรับส่งข้อมูลไปยังและจากที่อยู่เครือข่าย LAN ต้องมีสิทธิ์เข้าถึงเครือข่าย LAN ตารางต่อไปนี้แสดงกรณีที่พบบ่อย
การดำเนินการเครือข่ายระดับต่ำของแอป | ต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน |
---|---|
สร้างการเชื่อมต่อ TCP ขาออก | ใช่ |
ยอมรับการเชื่อมต่อ TCP ขาเข้า | ใช่ |
การส่ง UDP แบบ Unicast, Multicast, Broadcast | ใช่ |
การรับ Unicast, Multicast, Broadcast UDP ขาเข้า | ใช่ |
ข้อจำกัดเหล่านี้จะใช้ในส่วนลึกของสแต็กเครือข่าย จึงมีผลกับAPI เครือข่ายทั้งหมด ซึ่งรวมถึงซ็อกเก็ตที่สร้างขึ้น ในโค้ดเนทีฟหรือโค้ดที่มีการจัดการ ไลบรารีเครือข่าย เช่น Cronet และ OkHttp และ API ใดๆ ที่ใช้งานอยู่ด้านบน การพยายามแก้ไขบริการใน เครือข่ายภายใน (เช่น บริการที่มีคำต่อท้าย .local) จะต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน
ข้อยกเว้นสำหรับกฎข้างต้น
- หากเซิร์ฟเวอร์ DNS ของอุปกรณ์อยู่ในเครือข่ายภายใน การรับส่งข้อมูลไปยังหรือจากเซิร์ฟเวอร์ (ที่พอร์ต 53) ไม่จำเป็นต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน
- แอปพลิเคชันที่ใช้ Output Switcher เป็นเครื่องมือเลือกในแอปจะไม่ต้องมีสิทธิ์เข้าถึงเครือข่ายในพื้นที่ (จะมีคำแนะนำเพิ่มเติมในไตรมาสที่ 4 ปี 2025)
คำแนะนำสำหรับนักพัฒนาแอป (เลือกใช้)
หากต้องการเลือกใช้ข้อจำกัดเครือข่ายภายใน ให้ทำดังนี้
- แฟลชอุปกรณ์เป็นบิลด์ที่มี 25Q2 เบต้า 3 ขึ้นไป
- ติดตั้งแอปที่จะทดสอบ
สลับสถานะ Appcompat ใน adb โดยทำดังนี้
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
รีบูตอุปกรณ์
ตอนนี้สิทธิ์เข้าถึงเครือข่าย LAN ของแอปถูกจำกัดแล้ว และการพยายามเข้าถึงเครือข่าย LAN จะทำให้เกิดข้อผิดพลาดของซ็อกเก็ต หากคุณใช้ API ที่ ดำเนินการในเครือข่ายภายในนอกกระบวนการของแอป (เช่น NsdManager) API เหล่านี้จะไม่ได้รับผลกระทบในระหว่างระยะการเลือกใช้
หากต้องการคืนค่าสิทธิ์เข้าถึง คุณต้องให้สิทธิ์แอปของคุณแก่ NEARBY_WIFI_DEVICES
- ตรวจสอบว่าแอปประกาศสิทธิ์
NEARBY_WIFI_DEVICES
ในไฟล์ Manifest - ไปที่การตั้งค่า > แอป > [ชื่อแอปพลิเคชัน] > สิทธิ์ > อุปกรณ์ที่อยู่ใกล้เคียง > อนุญาต
ตอนนี้การเข้าถึงเครือข่าย LAN ของแอปควรได้รับการกู้คืนแล้ว และสถานการณ์ทั้งหมดควรทํางานได้เหมือนก่อนที่จะเลือกใช้แอป
เมื่อการบังคับใช้เพื่อการปกป้องเครือข่าย LAN เริ่มต้นขึ้น การรับส่งข้อมูลเครือข่ายของแอป จะได้รับผลกระทบดังนี้
สิทธิ์ | คำขอ LAN ขาออก | คำขออินเทอร์เน็ตขาออก/ขาเข้า | คำขอ LAN ขาเข้า |
---|---|---|---|
ให้สิทธิ์ | Works | Works | Works |
ไม่ให้สิทธิ์ | เรื่องหน้าแตก | Works | เรื่องหน้าแตก |
ใช้คำสั่งต่อไปนี้เพื่อเปิด/ปิด Flag ความเข้ากันได้ของแอป
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:
- ลิงก์เฉพาะ
- เส้นทางที่เชื่อมต่อโดยตรง
- เครือข่าย Stub เช่น Thread
- หลายซับเน็ต (จะแจ้งภายหลัง)
นอกจากนี้ ทั้งที่อยู่แบบมัลติแคสต์ (224.0.0.0/4, ff00::/8) และที่อยู่ IPv4 แบบบรอดแคสต์ (255.255.255.255) จะจัดเป็นที่อยู่เครือข่ายภายใน
รูปภาพที่เป็นของแอป
当面向 SDK 36 或更高版本的应用在搭载 Android 16 或更高版本的设备上提示用户授予照片和视频权限时,如果用户选择限制对所选媒体的访问权限,则会在照片选择器中看到该应用拥有的所有照片。用户可以取消选择任何这些预选项,这会撤消该应用对这些照片和视频的访问权限。