การเปลี่ยนแปลงลักษณะการทำงาน: แอปที่กำหนดเป้าหมายเป็น Android 16 ขึ้นไป

เช่นเดียวกับรุ่นก่อนหน้า 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 设备上也能支持无边框设计。如需支持从边缘到边缘的显示,请参阅 ComposeView 指南。

ต้องย้ายข้อมูลหรือเลือกไม่ใช้เพื่อใช้การคาดการณ์การย้อนกลับ

对于以 Android 16(API 级别 36)或更高版本为目标平台且在搭载 Android 16 或更高版本的设备上运行的应用,预测性返回系统动画(返回主屏幕、跨任务和跨 activity)默认处于启用状态。此外,系统不再调用 onBackPressed,也不再调度 KeyEvent.KEYCODE_BACK

如果您的应用会拦截返回事件,但您尚未迁移到预测性返回,请更新应用以使用受支持的返回导航 API,或者暂时选择停用,方法是在应用的 AndroidManifest.xml 文件的 <application><activity> 标记中将 android:enableOnBackInvokedCallback 属性设置为 false

“返回主页”预测性返回动画。
预测性跨 activity 动画。
预测性跨任务动画。

เลิกใช้งานและปิดใช้ Elegant Font API

แอปที่กำหนดเป้าหมายเป็น Android 15 (API ระดับ 35) จะมีแอตทริบิวต์ elegantTextHeight TextView ตั้งค่าเป็น true โดยค่าเริ่มต้น ซึ่งจะแทนที่แบบอักษรแบบย่อด้วยแบบอักษรที่อ่านง่ายกว่ามาก คุณลบล้างค่านี้ได้โดยตั้งค่าแอตทริบิวต์ elegantTextHeight เป็น false

Android 16 จะเลิกใช้งานแอตทริบิวต์ elegantTextHeight และระบบจะละเว้นแอตทริบิวต์เมื่อแอปกำหนดเป้าหมายเป็น Android 16 เราจะเลิกใช้ "UI fonts" ที่ควบคุมโดย API เหล่านี้ ดังนั้นคุณควรปรับเลย์เอาต์ใดๆ เพื่อให้การแสดงข้อความในภาษาอาหรับ ลาว เมียนมาร์ ทมิฬ คุชราต กันนาดา มาลายาลัม โอเดีย เตลูกู หรือไทยมีความสอดคล้องกันและพร้อมใช้งานในอนาคต

ลักษณะการทำงานของ
elegantTextHeight สำหรับแอปที่กำหนดเป้าหมายเป็น Android 14 (API ระดับ 34) และต่ำกว่า หรือสำหรับแอปที่กำหนดเป้าหมายเป็น Android 15 (API ระดับ 35) ซึ่งลบล้างค่าเริ่มต้นโดยการตั้งค่าแอตทริบิวต์ elegantTextHeight เป็น false
ลักษณะการทํางานของ
elegantTextHeight สําหรับแอปที่กําหนดเป้าหมายเป็น Android 16 (API ระดับ 36) หรือสําหรับแอปที่กําหนดเป้าหมายเป็น 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 正在向一种模型转变,在该模型中,应用需要适应各种屏幕方向、显示大小和宽高比。固定屏幕方向或有限的尺寸可调整性等限制会阻碍应用的适应性,因此我们建议让应用具备自适应能力,以提供尽可能出色的用户体验。

您还可以使用应用兼容性框架并启用 UNIVERSAL_RESIZABLE_BY_DEFAULT 兼容性标志来测试此行为。

常见的重大更改

忽略屏幕方向、可调整大小性和宽高比限制可能会影响应用在某些设备上的界面,尤其是那些专为锁定为纵向的小布局设计的元素,例如布局拉伸、动画和组件超出屏幕等问题。任何关于宽高比或屏幕方向的假设都可能导致应用出现视觉问题。详细了解如何避免这些问题并改进应用的自适应行为。

允许设备旋转会导致更多 activity 重新创建,如果未正确保留,可能会导致用户状态丢失。如需了解如何正确保存界面状态,请参阅保存界面状态

实现细节

在全屏模式和多窗口模式下,以下清单属性和运行时 API 会被大屏设备忽略:

系统会忽略 screenOrientationsetRequestedOrientation()getRequestedOrientation() 的以下值:

  • portrait
  • reversePortrait
  • sensorPortrait
  • userPortrait
  • landscape
  • reverseLandscape
  • sensorLandscape
  • userLandscape

对于显示屏可调整大小性,android:resizeableActivity="false"android:minAspectRatioandroid: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_SENSORSBODY_SENSORS_BACKGROUND 的 API,现在都需要获取相应的 android.permissions.health 权限。这会影响以下数据类型、API 和前台服务类型:

如果您的应用使用这些 API,则应请求相应的精细权限:

这些权限与用于保护对 Health Connect(Android 健康、健身和身心状态数据存储区)中数据的读取访问权限相同。

移动应用

迁移到使用 READ_HEART_RATE 和其他精细权限的移动应用还必须声明 activity 以显示应用的隐私权政策。此要求与健康数据共享的要求相同。

การเชื่อมต่อ

Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ในสแต็กบลูทูธ เพื่อปรับปรุงการเชื่อมต่อกับอุปกรณ์ต่อพ่วง

เจตนาใหม่ในการจัดการการสูญเสียพันธะและการเปลี่ยนแปลงการเข้ารหัส

作为改进了对键值对丢失的处理的一部分,Android 16 还引入了 2 个新 intent,以便应用更好地了解键值对丢失和加密更改。

以 Android 16 为目标平台的应用现在可以:

  • 在检测到远程键盘连接丢失时接收 ACTION_KEY_MISSING intent,以便提供更具信息量的用户反馈并采取适当的措施。
  • 每当链接的加密状态发生变化时,都会收到 ACTION_ENCRYPTION_CHANGE intent。这包括加密状态更改、加密算法更改和加密密钥大小更改。如果应用在稍后收到 ACTION_ENCRYPTION_CHANGE intent 时成功加密了链接,则必须将该绑定视为已恢复。

适应不同的 OEM 实现

虽然 Android 16 引入了这些新 intent,但其实现和广播可能会因不同的设备制造商 (OEM) 而异。为了确保您的应用在所有设备上都能提供一致且可靠的体验,开发者应设计其绑定丢失处理机制,以妥善适应这些潜在的变化。

我们建议您采用以下应用行为:

  • 如果广播 ACTION_KEY_MISSING intent:

    系统会断开 ACL(异步无连接)链接,但会保留设备的配对信息(如此处所述)。

    您的应用应将此 intent 用作检测配对丢失的主要信号,并在发起设备忘记或重新配对之前引导用户确认远程设备是否在范围内。

    如果设备在收到 ACTION_KEY_MISSING 后断开连接,您的应用应谨慎重新连接,因为设备可能已不再与系统绑定。

  • 如果未广播 ACTION_KEY_MISSING intent:

    ACL 链接将保持连接状态,系统会移除设备的配对信息,与 Android 15 中的行为相同。

    在这种情况下,您的应用应继续使用与之前的 Android 版本相同的现有配对丢失处理机制,以检测和管理配对丢失事件。

วิธีใหม่ในการนำการเชื่อมต่อบลูทูธออก

All apps targeting Android 16 are now able to unpair bluetooth devices using a public API in CompanionDeviceManager. If a companion device is being managed as a CDM association, then the app can trigger bluetooth bond removal by using the new removeBond(int) API on the associated device. The app can monitor the bond state changes by listening to the bluetooth device broadcast event ACTION_BOND_STATE_CHANGED.

ความปลอดภัย

Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงด้านความปลอดภัยต่อไปนี้

การล็อกดาวน์เวอร์ชัน MediaStore

สำหรับแอปที่กําหนดเป้าหมายเป็น Android 16 ขึ้นไป MediaStore#getVersion() จะมีลักษณะเฉพาะสำหรับแต่ละแอป ซึ่งจะนําพร็อพเพอร์ตี้ระบุออกจากสตริงเวอร์ชันเพื่อป้องกันการละเมิดและการใช้เทคนิคการระบุตัวตน แอปไม่ควรคาดเดารูปแบบของเวอร์ชันนี้ แอปควรจัดการการเปลี่ยนแปลงเวอร์ชันอยู่แล้วเมื่อใช้ API นี้ และในกรณีส่วนใหญ่ก็ไม่จำเป็นต้องเปลี่ยนแปลงลักษณะการทำงานปัจจุบัน เว้นแต่นักพัฒนาแอปจะพยายามอนุมานข้อมูลเพิ่มเติมที่อยู่นอกเหนือขอบเขตที่ตั้งใจไว้ของ API นี้

ความตั้งใจที่ปลอดภัยยิ่งขึ้น

ฟีเจอร์เจตนาที่ปลอดภัยยิ่งขึ้นเป็นโครงการริเริ่มด้านความปลอดภัยแบบหลายเฟสที่ออกแบบมาเพื่อ ปรับปรุงความปลอดภัยของกลไกการแก้ปัญหาเจตนาของ Android เป้าหมายคือการปกป้องแอปจากการกระทำที่เป็นอันตรายโดยการเพิ่มการตรวจสอบระหว่าง การประมวลผล Intent และการกรอง Intent ที่ไม่เป็นไปตามเกณฑ์ที่เฉพาะเจาะจง

ใน Android 15 ฟีเจอร์นี้มุ่งเน้นที่แอปที่ส่ง แต่ใน Android 16 จะเปลี่ยนการควบคุมไปที่แอปที่รับ ซึ่งช่วยให้นักพัฒนาแอปเลือกใช้ การแก้ปัญหา Intent ที่เข้มงวดได้โดยใช้ไฟล์ Manifest ของแอป

เราจะดำเนินการเปลี่ยนแปลงที่สำคัญ 2 อย่างดังนี้

  1. Intent แบบเจาะจงปลายทางต้องตรงกับตัวกรอง Intent ของคอมโพเนนต์เป้าหมาย: หาก Intent กำหนดเป้าหมายคอมโพเนนต์อย่างชัดแจ้ง Intent นั้นควรตรงกับ ตัวกรอง Intent ของคอมโพเนนต์นั้น

  2. Intent ที่ไม่มีการดำเนินการจะจับคู่กับตัวกรอง Intent ไม่ได้: Intent ที่ไม่ได้ระบุการดำเนินการไม่ควรได้รับการแก้ไขเป็นตัวกรอง Intent ใดๆ

การเปลี่ยนแปลงเหล่านี้จะมีผลเมื่อเกี่ยวข้องกับแอปหลายรายการเท่านั้น และจะไม่มีผลต่อ การจัดการ Intent ภายในแอปเดียว

ผลกระทบ

ลักษณะการเลือกใช้หมายความว่านักพัฒนาแอปต้องเปิดใช้ฟีเจอร์นี้อย่างชัดแจ้งใน ไฟล์ Manifest ของแอปเพื่อให้มีผล ด้วยเหตุนี้ ผลกระทบของฟีเจอร์นี้จึงจำกัดอยู่เฉพาะแอปที่นักพัฒนาแอปมีคุณสมบัติดังนี้

  • ทราบถึงฟีเจอร์เจตนาที่ปลอดภัยยิ่งขึ้นและประโยชน์ของฟีเจอร์นี้
  • เลือกที่จะนำแนวทางปฏิบัติในการจัดการ Intent ที่เข้มงวดมากขึ้นมาใช้ในแอปของตน

แนวทางในการเลือกใช้นี้ช่วยลดความเสี่ยงที่จะทำให้แอปที่มีอยู่ซึ่งอาจต้องอาศัย ลักษณะการทำงานของการแก้ปัญหา Intent ที่มีความปลอดภัยน้อยในปัจจุบันใช้งานไม่ได้

แม้ว่าผลกระทบเริ่มต้นใน Android 16 อาจมีจำกัด แต่โครงการ Safer Intents มีแผนงานที่จะสร้างผลกระทบในวงกว้างขึ้นใน Android รุ่นต่อๆ ไป แผนของเราคือการทำให้การแก้ปัญหาความตั้งใจที่เข้มงวดเป็นลักษณะการทำงานเริ่มต้นในที่สุด

ฟีเจอร์เจตนาที่ปลอดภัยยิ่งขึ้นมีศักยภาพในการปรับปรุง ความปลอดภัยของระบบนิเวศ Android ได้อย่างมากด้วยการทำให้แอปที่เป็นอันตราย ใช้ประโยชน์จากช่องโหว่ในกลไกการแก้ปัญหาเจตนาได้ยากขึ้น

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

การใช้งาน

นักพัฒนาแอปต้องเปิดใช้การจับคู่ Intent ที่เข้มงวดขึ้นอย่างชัดแจ้งโดยใช้แอตทริบิวต์ intentMatchingFlags ในไฟล์ Manifest ของแอป ต่อไปนี้คือตัวอย่างกรณีที่ฟีเจอร์นี้เป็นแบบเลือกใช้สำหรับทั้งแอป แต่ปิดใช้/เลือกไม่ใช้ในตัวรับ

<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 ขาเข้า
ไม่มี ปิดใช้กฎการจับคู่พิเศษทั้งหมดสำหรับ Intent ขาเข้า เมื่อระบุหลายแฟล็ก ค่าที่ขัดแย้งกันจะได้รับการแก้ไขโดยให้ความสำคัญกับแฟล็ก "none"
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) มีการเปลี่ยนแปลงด้านความเป็นส่วนตัวต่อไปนี้

สิทธิ์เข้าถึงเครือข่ายภายใน

Devices on the LAN can be accessed by any app that has the INTERNET permission. This makes it easy for apps to connect to local devices but it also has privacy implications such as forming a fingerprint of the user, and being a proxy for location.

The Local Network Protections project aims to protect the user's privacy by gating access to the local network behind a new runtime permission.

Release plan

This change will be deployed between two releases, 25Q2 and TBD respectively. It is imperative that developers follow this guidance for 25Q2 and share feedback because these protections will be enforced at a later Android release. Moreover, they will need to update scenarios which depend on implicit local network access by using the following guidance and prepare for user rejection and revocation of the new permission.

Impact

At the current stage, LNP is an opt-in feature which means only the apps that opt in will be affected. The goal of the opt-in phase is for app developers to understand which parts of their app depend on implicit local network access such that they can prepare to permission guard them for the next release.

Apps will be affected if they access the user's local network using:

  • Direct or library use of raw sockets on local network addresses (e.g. mDNS or SSDP service discovery protocol)
  • Use of framework level classes that access the local network (e.g. NsdManager)

Traffic to and from a local network address requires local network access permission. The following table lists some common cases:

App Low Level Network Operation Local Network Permission Required
Making an outgoing TCP connection yes
Accepting incoming TCP connections yes
Sending a UDP unicast, multicast, broadcast yes
Receiving an incoming UDP unicast, multicast, broadcast yes

These restrictions are implemented deep in the networking stack, and thus they apply to all networking APIs. This includes sockets created in native or managed code, networking libraries like Cronet and OkHttp, and any APIs implemented on top of those. Trying to resolve services on the local network (i.e. those with a .local suffix) will require local network permission.

Exceptions to the rules above:

  • If a device's DNS server is on a local network, traffic to or from it (at port 53) doesn't require local network access permission.
  • Applications using Output Switcher as their in-app picker won't need local network permissions (more guidance to come in 2025Q4).

Developer Guidance (Opt-in)

To opt into local network restrictions, do the following:

  1. Flash the device to a build with 25Q2 Beta 3 or later.
  2. Install the app to be tested.
  3. Toggle the Appcompat flag in adb:

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. Reboot The device

Now your app's access to the local network is restricted and any attempt to access the local network will lead to socket errors. If you are using APIs that perform local network operations outside of your app process (ex: NsdManager), they won't be impacted during the opt-in phase.

To restore access, you must grant your app permission to NEARBY_WIFI_DEVICES.

  1. Ensure the app declares the NEARBY_WIFI_DEVICES permission in its manifest.
  2. Go to Settings > Apps > [Application Name] > Permissions > Nearby devices > Allow.

Now your app's access to the local network should be restored and all your scenarios should work as they did prior to opting the app in.

Once enforcement for local network protection begins, here is how the app network traffic will be impacted.

Permission Outbound LAN Request Outbound/Inbound Internet Request Inbound LAN Request
Granted Works Works Works
Not Granted Fails Works Fails

Use the following command to toggle-off the App-Compat flag

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

Errors

Errors arising from these restrictions will be returned to the calling socket whenever it invokes send or a send variant to a local network address.

Example errors:

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

Local Network Definition

A local network in this project refers to an IP network that utilizes a broadcast-capable network interface, such as Wi-Fi or Ethernet, but excludes cellular (WWAN) or VPN connections.

The following are considered local networks:

IPv4:

  • 169.254.0.0/16 // Link Local
  • 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:

  • Link-local
  • Directly-connected routes
  • Stub networks like Thread
  • Multiple-subnets (TBD)

Additionally, both multicast addresses (224.0.0.0/4, ff00::/8) and the IPv4 broadcast address (255.255.255.255) are classified as local network addresses.

รูปภาพที่เป็นของแอป

เมื่อแอปที่กำหนดเป้าหมาย SDK 36 ขึ้นไปในอุปกรณ์ที่ใช้ Android 16 ขึ้นไปแสดงข้อความแจ้งขอสิทธิ์เข้าถึงรูปภาพและวิดีโอ ผู้ใช้ที่เลือกจำกัดการเข้าถึงสื่อที่เลือกไว้จะเห็นรูปภาพทั้งหมดที่แอปเป็นเจ้าของซึ่งเลือกไว้ล่วงหน้าในเครื่องมือเลือกรูปภาพ ผู้ใช้สามารถยกเลิกการเลือกรายการที่เลือกไว้ล่วงหน้ารายการใดก็ได้ ซึ่งจะเป็นการเพิกถอนสิทธิ์เข้าถึงรูปภาพและวิดีโอเหล่านั้นของแอป