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

เช่นเดียวกับรุ่นก่อนๆ Android 16 มีการเปลี่ยนแปลงลักษณะการทำงานที่อาจส่งผลต่อแอปของคุณ การเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้มีผลเฉพาะกับแอปที่กำหนดเป้าหมายเป็น Android 16 ขึ้นไป หากแอปกำหนดเป้าหมายเป็น Android 16 ขึ้นไป คุณควรแก้ไขแอปให้รองรับลักษณะการทำงานเหล่านี้ในกรณีที่เกี่ยวข้อง

นอกจากนี้ โปรดตรวจสอบรายการการเปลี่ยนแปลงลักษณะการทำงานที่มีผลต่อแอปทั้งหมด ที่ทำงานบน Android 16 ไม่ว่า targetSdkVersion ของแอปจะเป็นอย่างไร

ประสบการณ์ของผู้ใช้และ UI ของระบบ

Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ซึ่งมีจุดประสงค์ เพื่อสร้างประสบการณ์ของผู้ใช้ที่สอดคล้องกันและใช้งานง่ายยิ่งขึ้น

การเลือกไม่ใช้แบบไร้ขอบจะสิ้นสุดลง

Android 15 强制执行全屏显示,但您的应用可以通过将 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 设备上也能支持无边框设计。如需支持从边缘到边缘的显示,请参阅 ComposeViews 指南。

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

对于以 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 ซึ่ง Health Connect ก็ใช้ด้วย และตั้งแต่ Android 16 เป็นต้นไป API ใดก็ตามที่ก่อนหน้านี้ต้องใช้ BODY_SENSORS หรือ BODY_SENSORS_BACKGROUND จะต้องใช้สิทธิ์ android.permissions.health ที่เกี่ยวข้องแทน ซึ่งจะส่งผลต่อประเภทข้อมูล, API และประเภทบริการที่ทำงานอยู่เบื้องหน้าต่อไปนี้

หากแอปใช้ API เหล่านี้ แอปควรขอสิทธิ์แบบละเอียดที่เกี่ยวข้อง

  • สำหรับการตรวจสอบอัตราการเต้นของหัวใจ ค่าความอิ่มตัวของออกซิเจนในเลือด หรืออุณหภูมิผิวหนังขณะใช้งาน ให้ขอสิทธิ์แบบละเอียดภายใต้ 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) มีการเปลี่ยนแปลงต่อไปนี้ในสแต็กบลูทูธ เพื่อปรับปรุงการเชื่อมต่อกับอุปกรณ์ต่อพ่วง

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

การจัดการการสูญเสียการเชื่อมโยงที่ดีขึ้นทำให้ Android 16 เปิดตัว Intent ใหม่ 2 รายการเพื่อให้แอปรับรู้ถึงการสูญเสียการเชื่อมโยงและการเปลี่ยนแปลงการเข้ารหัสได้ดียิ่งขึ้น

ตอนนี้แอปที่กําหนดเป้าหมายเป็น Android 16 ทําสิ่งต่อไปนี้ได้

  • รับ Intent ACTION_KEY_MISSING เมื่อตรวจพบการสูญเสียการเชื่อมโยงระยะไกล ซึ่งช่วยให้สามารถแสดงความคิดเห็นที่เป็นประโยชน์ต่อผู้ใช้มากขึ้นและดำเนินการที่เหมาะสม
  • รับ Intent ACTION_ENCRYPTION_CHANGE เมื่อใดก็ตามที่สถานะการเข้ารหัสของลิงก์มีการเปลี่ยนแปลง ซึ่งรวมถึงการเปลี่ยนแปลงสถานะการเข้ารหัส การเปลี่ยนแปลงอัลกอริทึมการเข้ารหัส และการเปลี่ยนแปลงขนาดคีย์การเข้ารหัส แอปต้องถือว่าการเชื่อมโยงได้รับการคืนค่าหากลิงก์ได้รับการเข้ารหัสเรียบร้อยแล้วเมื่อได้รับ Intent ACTION_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 สามารถยกเลิกการจับคู่อุปกรณ์บลูทูธได้โดยใช้ API สาธารณะใน CompanionDeviceManager หากอุปกรณ์ที่ใช้ร่วมกันได้รับการจัดการเป็นการเชื่อมโยง CDM แอปจะทริกเกอร์การนำการเชื่อมโยงบลูทูธออกได้โดยใช้ removeBond(int) API ใหม่ในอุปกรณ์ที่เชื่อมโยง แอปสามารถตรวจสอบการเปลี่ยนแปลงสถานะการเชื่อมโยงได้โดยฟังเหตุการณ์การแพร่กระจายข้อมูลของอุปกรณ์บลูทูธ ACTION_BOND_STATE_CHANGED

ความปลอดภัย

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

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

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

เจตนาที่ปลอดภัยกว่า

ฟีเจอร์ Intent ที่ปลอดภัยยิ่งขึ้นเป็นโครงการริเริ่มด้านความปลอดภัยแบบหลายเฟสที่ออกแบบมาเพื่อ ปรับปรุงความปลอดภัยของกลไกการแก้ไข Intent ของ 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 รุ่นต่อๆ ไป แผนของเราคือการทำให้การแก้เจตนาอย่างเข้มงวดเป็นลักษณะการทำงานเริ่มต้นในที่สุด

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

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

การใช้งาน

นักพัฒนาแอปต้องเปิดใช้การจับคู่ 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 ที่ไม่มีการดำเนินการจับคู่ได้ Flag นี้ใช้ร่วมกับ "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:")

การกรอง Syscall ของ GPU

เพื่อเพิ่มความปลอดภัยของพื้นผิว Mali GPU เราจึงบล็อก IOCTL ของ Mali GPU ที่เลิกใช้งานแล้วหรือมีไว้สำหรับการพัฒนา GPU เท่านั้นในบิลด์เวอร์ชันที่ใช้งานจริง นอกจากนี้ IOCTL ที่ใช้สำหรับการสร้างโปรไฟล์ GPU ยังถูกจำกัดไว้สำหรับกระบวนการเชลล์หรือแอปพลิเคชันที่แก้ไขข้อบกพร่องได้ ดูรายละเอียดเพิ่มเติมเกี่ยวกับนโยบายระดับแพลตฟอร์มได้ที่การปรับปรุง SAC

การเปลี่ยนแปลงนี้จะมีผลในอุปกรณ์ Pixel ที่ใช้ GPU ของ Mali (Pixel 6-9) Arm ได้จัดหมวดหมู่ IOCTL อย่างเป็นทางการใน Documentation/ioctl-categories.rst ของรุ่น r54p2 เราจะดูแลรายการนี้ต่อไปในการเผยแพร่ไดรเวอร์ในอนาคต

การเปลี่ยนแปลงนี้ไม่ส่งผลต่อ API กราฟิกที่รองรับ (รวมถึง Vulkan และ OpenGL) และคาดว่าจะไม่ส่งผลต่อนักพัฒนาแอปหรือแอปพลิเคชันที่มีอยู่ เครื่องมือสร้างโปรไฟล์ GPU เช่น Streamline Performance Analyzer และ Android GPU Inspector จะไม่ได้รับผลกระทบ

การทดสอบ

หากเห็นการปฏิเสธ SELinux ที่คล้ายกับข้อความต่อไปนี้ แสดงว่าแอปพลิเคชันของคุณอาจได้รับผลกระทบจากการเปลี่ยนแปลงนี้

06-30 10:47:18.617 20360 20360 W roidJUnitRunner: type=1400 audit(0.0:85): avc:  denied  { ioctl }
for  path="/dev/mali0" dev="tmpfs" ino=1188 ioctlcmd=0x8023
scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:gpu_device:s0 tclass=chr_file
permissive=0 app=com.google.android.selinux.pts

หากแอปพลิเคชันของคุณต้องใช้ IOCTL ที่ถูกบล็อก โปรดรายงานข้อบกพร่องและมอบหมายให้ android-partner-security@google.com

คำถามที่พบบ่อย

  1. การเปลี่ยนแปลงนโยบายนี้มีผลกับ OEM ทุกรายไหม การเปลี่ยนแปลงนี้จะเป็นแบบเลือกใช้ แต่พร้อมให้บริการแก่ OEM ทุกรายที่ต้องการใช้วิธีการเสริมความแข็งแกร่งนี้ ดูวิธีการใช้การเปลี่ยนแปลงได้ใน เอกสารประกอบการใช้งาน

  2. จำเป็นต้องทำการเปลี่ยนแปลงในฐานของโค้ด OEM เพื่อใช้ฟีเจอร์นี้ไหม หรือฟีเจอร์นี้จะมาพร้อมกับ AOSP รุ่นใหม่โดยค่าเริ่มต้น การเปลี่ยนแปลงระดับแพลตฟอร์มจะมาพร้อมกับการเปิดตัว AOSP ใหม่โดยค่าเริ่มต้น ผู้ให้บริการ อาจเลือกใช้การเปลี่ยนแปลงนี้ในโค้ดเบสหากต้องการใช้

  3. SoC มีหน้าที่รับผิดชอบในการอัปเดตรายการ IOCTL ให้เป็นปัจจุบันใช่ไหม เช่น หากอุปกรณ์ของฉันใช้ GPU ของ ARM Mali ฉันจะต้องติดต่อ ARM เพื่อขอรับการเปลี่ยนแปลงไหม SoC แต่ละรายการต้องอัปเดตรายการ IOCTL ต่ออุปกรณ์เมื่อมีการเผยแพร่ไดรเวอร์ เช่น ARM จะอัปเดตรายการ IOCTL ที่เผยแพร่เมื่อมีการอัปเดตไดรเวอร์ อย่างไรก็ตาม OEM ควรตรวจสอบว่าได้รวมการอัปเดตไว้ใน SEPolicy และเพิ่ม IOCTL ที่กำหนดเองที่เลือกไว้ลงในรายการตามที่จำเป็น

  4. การเปลี่ยนแปลงนี้จะมีผลกับอุปกรณ์ Pixel ทุกรุ่นที่วางจำหน่ายโดยอัตโนมัติ หรือผู้ใช้ต้องดำเนินการบางอย่างเพื่อเปิด/ปิดการตั้งค่าเพื่อใช้การเปลี่ยนแปลงนี้ การเปลี่ยนแปลงนี้จะมีผลกับอุปกรณ์ Pixel ทุกเครื่องที่วางจำหน่ายซึ่งใช้ GPU Mali (Pixel 6-9) ผู้ใช้ไม่จำเป็นต้องดำเนินการใดๆ เพื่อใช้การเปลี่ยนแปลงนี้

  5. การใช้นโยบายนี้จะส่งผลต่อประสิทธิภาพของไดรเวอร์เคอร์เนลไหม เราได้ทดสอบนโยบายนี้ใน GPU ของ Mali โดยใช้ GFXBench และไม่พบการเปลี่ยนแปลงที่วัดได้ ในประสิทธิภาพของ GPU

  6. จำเป็นไหมที่รายการ IOCTL จะต้องสอดคล้องกับเวอร์ชันปัจจุบันของไดรเวอร์ในเคอร์เนลและพื้นที่ผู้ใช้ ได้ รายการ IOCTL ที่อนุญาตต้องซิงค์กับ IOCTL ที่ไดรเวอร์ทั้งใน Userspace และเคอร์เนลรองรับ หากมีการอัปเดต IOCTL ในพื้นที่ผู้ใช้หรือ ไดรเวอร์เคอร์เนล จะต้องอัปเดตรายการ IOCTL ของ SEPolicy ให้ตรงกัน

  7. ARM ได้จัดหมวดหมู่ IOCTL เป็น "จำกัด" / "การวัด" แต่เราต้องการใช้ IOCTL บางรายการในกรณีการใช้งานจริง และ/หรือปฏิเสธรายการอื่นๆ OEM/SoC แต่ละรายมีหน้าที่รับผิดชอบในการตัดสินใจว่าจะจัดหมวดหมู่ IOCTL ที่ใช้ตามการกำหนดค่าของไลบรารี Mali ในพื้นที่ผู้ใช้ของตนอย่างไร คุณใช้รายการของ ARM เพื่อช่วยในการตัดสินใจได้ แต่กรณีการใช้งานของ OEM/SoC แต่ละรายอาจแตกต่างกัน

ความเป็นส่วนตัว

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

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

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

โปรเจ็กต์การปกป้องเครือข่าย LAN มีเป้าหมายเพื่อปกป้องความเป็นส่วนตัวของผู้ใช้โดย จำกัดการเข้าถึงเครือข่าย LAN ไว้เบื้องหลังสิทธิ์รันไทม์ใหม่

แผนการเปิดตัว

การเปลี่ยนแปลงนี้จะเปิดตัวระหว่าง 2 รุ่น ได้แก่ 25Q2 และ 26Q2 ตามลำดับ นักพัฒนาแอปต้องปฏิบัติตามคำแนะนำนี้สำหรับ 25Q2 และแชร์ความคิดเห็น เนื่องจากระบบจะบังคับใช้การป้องกันเหล่านี้ใน Android รุ่นต่อๆ ไป นอกจากนี้ นักพัฒนาแอปจะต้องอัปเดตสถานการณ์ที่ขึ้นอยู่กับการเข้าถึงเครือข่ายภายในโดยนัยโดยใช้คำแนะนำต่อไปนี้ และเตรียมพร้อมสำหรับการปฏิเสธของผู้ใช้ และการเพิกถอนสิทธิ์ใหม่

ผลกระทบ

ในระยะปัจจุบัน LNP เป็นฟีเจอร์ที่ต้องเลือกใช้ ซึ่งหมายความว่าจะมีผลกับแอปที่เลือกใช้เท่านั้น เป้าหมายของระยะการเลือกใช้คือการช่วยให้นักพัฒนาแอป เข้าใจว่าส่วนใดของแอปที่ต้องอาศัยการเข้าถึงเครือข่าย LAN โดยนัย เพื่อเตรียมพร้อมที่จะใช้การป้องกันสิทธิ์สำหรับส่วนดังกล่าวในการเปิดตัวครั้งถัดไป

แอปจะได้รับผลกระทบหากเข้าถึงเครือข่ายท้องถิ่นของผู้ใช้โดยใช้สิ่งต่อไปนี้

  • การใช้ซ็อกเก็ตดิบโดยตรงหรือผ่านไลบรารีในที่อยู่เครือข่ายภายใน (เช่น โปรโตคอลการค้นพบบริการ mDNS หรือ SSDP)
  • การใช้คลาสระดับเฟรมเวิร์กที่เข้าถึงเครือข่ายในเครื่อง (เช่น NsdManager)

การรับส่งข้อมูลไปยังและจากที่อยู่เครือข่ายภายในต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน ตารางต่อไปนี้แสดงกรณีที่พบบ่อย

การดำเนินการเครือข่ายระดับต่ำของแอป ต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน
สร้างการเชื่อมต่อ TCP ขาออก ใช่
ยอมรับการเชื่อมต่อ TCP ขาเข้า ใช่
การส่ง Unicast, Multicast, Broadcast แบบ UDP ใช่
การรับ Unicast, Multicast, Broadcast UDP ขาเข้า ใช่

ข้อจำกัดเหล่านี้จะใช้ในส่วนลึกของสแต็กเครือข่าย จึงมีผลกับAPI เครือข่ายทั้งหมด ซึ่งรวมถึงซ็อกเก็ตที่สร้างขึ้นในโค้ดเนทีฟหรือโค้ดที่มีการจัดการ ไลบรารีเครือข่าย เช่น Cronet และ OkHttp รวมถึง API ใดๆ ที่ใช้งานอยู่บนไลบรารีเหล่านั้น การพยายามแก้ไขบริการใน เครือข่ายภายใน (เช่น บริการที่มีคำต่อท้าย .local) จะต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน

ข้อยกเว้นสำหรับกฎข้างต้น

  • หากเซิร์ฟเวอร์ DNS ของอุปกรณ์อยู่ในเครือข่ายภายใน การรับส่งข้อมูลไปยังหรือจากเซิร์ฟเวอร์ดังกล่าว (ที่พอร์ต 53) ไม่จำเป็นต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน
  • แอปพลิเคชันที่ใช้ตัวสลับเอาต์พุตเป็นเครื่องมือเลือกในแอปจะไม่ต้องมีสิทธิ์เข้าถึงเครือข่ายในพื้นที่ (จะมีคำแนะนำเพิ่มเติมในไตรมาสที่ 4 ปี 2025)

คำแนะนำสำหรับนักพัฒนาแอป (เลือกใช้)

หากต้องการเลือกใช้ข้อจำกัดเครือข่ายในเครื่อง ให้ทำดังนี้

  1. แฟลชอุปกรณ์เป็นบิลด์ที่มี 25Q2 เบต้า 3 ขึ้นไป
  2. ติดตั้งแอปที่จะทดสอบ
  3. สลับสถานะ Appcompat ใน adb โดยทำดังนี้

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. รีบูตอุปกรณ์

ตอนนี้สิทธิ์เข้าถึงเครือข่าย LAN ของแอปถูกจำกัดแล้ว และการพยายามเข้าถึงเครือข่าย LAN จะทำให้เกิดข้อผิดพลาดของซ็อกเก็ต หากคุณใช้ API ที่ ดำเนินการในเครือข่ายภายในนอกกระบวนการของแอป (เช่น NsdManager) API เหล่านี้จะไม่ได้รับผลกระทบในระหว่างระยะการเลือกใช้

หากต้องการกู้คืนสิทธิ์เข้าถึง คุณต้องให้สิทธิ์แอปในการเข้าถึง NEARBY_WIFI_DEVICES

  1. ตรวจสอบว่าแอปประกาศสิทธิ์ NEARBY_WIFI_DEVICES ในไฟล์ Manifest
  2. ไปที่การตั้งค่า > แอป > [ชื่อแอปพลิเคชัน] > สิทธิ์ > อุปกรณ์ที่อยู่ใกล้เคียง > อนุญาต

ตอนนี้สิทธิ์เข้าถึงเครือข่าย LAN ของแอปควรได้รับการกู้คืนแล้ว และสถานการณ์ทั้งหมดควรทํางานได้เหมือนก่อนที่จะเลือกใช้แอป

เมื่อการบังคับใช้เพื่อการปกป้องเครือข่าย LAN เริ่มขึ้น การเข้าชมเครือข่ายของแอป จะได้รับผลกระทบดังนี้

สิทธิ์ คำขอ 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:

  • ลิงก์ภายใน
  • เส้นทางที่เชื่อมต่อโดยตรง
  • เครือข่าย Stub เช่น Thread
  • หลายซับเน็ต (จะแจ้งภายหลัง)

นอกจากนี้ ทั้งที่อยู่แบบมัลติแคสต์ (224.0.0.0/4, ff00::/8) และที่อยู่ IPv4 แบบบรอดแคสต์ (255.255.255.255) จะจัดเป็นที่อยู่เครือข่ายภายใน

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

当面向 SDK 36 或更高版本的应用在搭载 Android 16 或更高版本的设备上提示用户授予照片和视频权限时,如果用户选择限制对所选媒体的访问权限,则会在照片选择器中看到该应用拥有的所有照片。用户可以取消选择任何这些预选项,这会撤消该应用对这些照片和视频的访问权限。