การเปลี่ยนแปลงลักษณะการทํางาน: แอปทั้งหมด

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

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

ฟังก์ชันหลัก

Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ซึ่งแก้ไขหรือ ขยายความสามารถหลักต่างๆ ของระบบ Android

การเพิ่มประสิทธิภาพโควต้า JobScheduler

Starting in Android 16, we're adjusting regular and expedited job execution runtime quota based on the following factors:

  • Which app standby bucket the application is in: in Android 16, active standby buckets will start being enforced by a generous runtime quota.
  • If the job starts execution while the app is in a top state: in Android 16, Jobs started while the app is visible to the user and continues after the app becomes invisible, will adhere to the job runtime quota.
  • If the job is executing while running a Foreground Service: in Android 16, jobs that are executing while concurrently with a foreground service will adhere to the job runtime quota. If you're leveraging jobs for user initiated data transfer, consider using user initiated data transfer jobs instead.

This change impacts tasks scheduled using WorkManager, JobScheduler, and DownloadManager. To debug why a job was stopped, we recommend logging why your job was stopped by calling WorkInfo.getStopReason() (for JobScheduler jobs, call JobParameters.getStopReason()).

For information about how your app's state affects the resources it can use, see Power management resource limits. For more information on battery-optimal best practices, refer to guidance on optimize battery use for task scheduling APIs.

We also recommend leveraging the new JobScheduler#getPendingJobReasonsHistory API introduced in Android 16 to understand why a job has not executed.

Testing

To test your app's behavior, you can enable override of certain job quota optimizations as long as the app is running on an Android 16 device.

To disable enforcement of "top state will adhere to job runtime quota", run the following adb command:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

To disable enforcement of "jobs that are executing while concurrently with a foreground service will adhere to the job runtime quota", run the following adb command:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

To test certain app standby bucket behavior, you can set the app standby bucket of your app using the following adb command:

adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted

To understand the app standby bucket your app is in, you can get the app standby bucket of your app using the following adb command:

adb shell am get-standby-bucket APP_PACKAGE_NAME

เหตุผลในการหยุดงานที่ว่างเปล่าซึ่งถูกละทิ้ง

如果与作业关联的 JobParameters 对象已被垃圾回收,但尚未调用 JobService#jobFinished(JobParameters, boolean) 来指示作业已完成,则会发生作业被废弃的情况。这表示作业可能会在应用不知情的情况下运行和重新调度。

依赖于 JobScheduler 的应用不会维护对 JobParameters 对象的强引用,并且超时现在将获得新的作业停止原因 STOP_REASON_TIMEOUT_ABANDONED,而不是 STOP_REASON_TIMEOUT

如果新的作业被废弃停止原因频繁出现,系统会采取缓解措施来降低作业频率。

应用应使用新的停止原因来检测和减少被废弃的作业。

如果您使用的是 WorkManager、AsyncTask 或 DownloadManager,则不会受到影响,因为这些 API 会代表您的应用管理作业生命周期。

เลิกใช้งาน JobInfo#setImportantWhileForeground อย่างสมบูรณ์

The JobInfo.Builder#setImportantWhileForeground(boolean) method indicates the importance of a job while the scheduling app is in the foreground or when temporarily exempted from background restrictions.

This method has been deprecated since Android 12 (API level 31). Starting in Android 16, it no longer functions effectively and calling this method will be ignored.

This removal of functionality also applies to JobInfo#isImportantWhileForeground(). Starting in Android 16, if the method is called, the method returns false.

ขอบเขตลำดับความสำคัญของการออกอากาศที่สั่งซื้อแล้วไม่ได้เป็นแบบทั่วโลกอีกต่อไป

แอป Android ได้รับอนุญาตให้กำหนดลำดับความสำคัญในเครื่องรับการออกอากาศเพื่อควบคุมลำดับที่เครื่องรับจะรับและประมวลผลการออกอากาศ สําหรับตัวรับที่ประกาศในไฟล์ Manifest แอปสามารถใช้แอตทริบิวต์ android:priority เพื่อกําหนดลําดับความสําคัญ และสำหรับตัวรับที่ลงทะเบียนตามบริบท แอปสามารถใช้ IntentFilter#setPriority() API เพื่อกําหนดลําดับความสําคัญ เมื่อส่งการออกอากาศ ระบบจะส่งการออกอากาศไปยังผู้รับตามลําดับความสําคัญจากสูงไปต่ำ

ใน Android 16 ระบบจะไม่รับประกันลำดับการนำส่งแบบออกอากาศที่ใช้แอตทริบิวต์ android:priority หรือ IntentFilter#setPriority() ในกระบวนการต่างๆ ระบบจะพิจารณาลำดับความสำคัญของการออกอากาศภายในกระบวนการสมัครเดียวกันเท่านั้น ไม่ใช่ในทุกกระบวนการ

นอกจากนี้ ระบบจะจำกัดลําดับความสําคัญของรายการออกอากาศให้อยู่ในช่วง (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY - 1) โดยอัตโนมัติ เฉพาะคอมโพเนนต์ของระบบเท่านั้นที่จะได้รับอนุญาตให้ตั้งค่า SYSTEM_LOW_PRIORITY, SYSTEM_HIGH_PRIORITY เป็นลำดับความสำคัญของการออกอากาศ

แอปของคุณอาจได้รับผลกระทบหากมีลักษณะการทำงานอย่างใดอย่างหนึ่งต่อไปนี้

  1. แอปพลิเคชันของคุณประกาศกระบวนการหลายรายการที่มี Intent การออกอากาศเดียวกัน และคาดหวังที่จะได้รับการส่ง Intent เหล่านั้นตามลำดับที่แน่นอนโดยอิงตามลําดับความสําคัญ
  2. กระบวนการสมัครของคุณจะโต้ตอบกับกระบวนการอื่นๆ และมีสิ่งที่คาดหวังเกี่ยวกับการรับ Intent การออกอากาศตามลําดับที่กําหนด

หากกระบวนการต่างๆ จำเป็นต้องประสานงานกัน ทีมควรสื่อสารโดยใช้ช่องทางประสานงานอื่นๆ

การเปลี่ยนแปลงภายในของ ART

Android 16 包含 Android 运行时 (ART) 的最新更新,这些更新可提升 Android 运行时 (ART) 的性能,并支持更多 Java 功能。通过 Google Play 系统更新,搭载 Android 12(API 级别 31)及更高版本的 10 亿多部设备也将受益于这些改进。

发布这些变更后,依赖于 ART 内部结构的库和应用代码在搭载 Android 16 的设备以及通过 Google Play 系统更新来更新 ART 模块的较低 Android 版本上可能无法正常运行。

依赖于内部结构(例如非 SDK 接口)始终会导致兼容性问题,但避免依赖于利用内部 ART 结构的代码(或包含代码的库)尤为重要,因为 ART 更改与设备所运行的平台版本无关,并且会通过 Google Play 系统更新推送到超过 10 亿部设备。

所有开发者都应在 Android 16 上对其应用进行全面测试,以检查其应用是否受到影响。此外,请查看已知问题,了解您的应用是否依赖于我们发现的任何依赖于内部 ART 结构的库。如果您的应用代码或库依赖项受到影响,请尽可能寻找公共 API 替代方案,并在问题跟踪器中创建功能请求,为新用例请求公共 API。

โหมดความเข้ากันได้กับขนาดหน้า 16 KB

Android 15 引入了对 16 KB 内存页面的支持,以优化平台性能。Android 16 添加了兼容模式,让一些针对 4 KB 内存页面构建的应用可以在配置为 16 KB 内存页面的设备上运行。

当您的应用在搭载 Android 16 或更高版本的设备上运行时,如果 Android 检测到您的应用具有 4 KB 对齐的内存页面,则会自动使用兼容模式并向用户显示通知对话框。在 AndroidManifest.xml 中设置 android:pageSizeCompat 属性以启用向后兼容模式,将会阻止应用启动时显示对话框。如需使用 android:pageSizeCompat 属性,请使用 Android 16 SDK 编译您的应用。

为了实现最佳性能、可靠性和稳定性,应用仍应以 16 KB 对齐。如需了解详情,请参阅我们近期发布的博文,了解如何更新应用以支持 16 KB 的内存页面。

兼容模式对话框:当系统检测到 4 KB 对齐的应用在 16 KB 对齐的情况下可以更高效地运行时,系统会显示此对话框。

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

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

การเลิกใช้งานการประกาศการช่วยเหลือพิเศษที่รบกวนผู้ใช้

Android 16 deprecates accessibility announcements, characterized by the use of announceForAccessibility or the dispatch of TYPE_ANNOUNCEMENT accessibility events. These can create inconsistent user experiences for users of TalkBack and Android's screen reader, and alternatives better serve a broader range of user needs across a variety of Android's assistive technologies.

Examples of alternatives:

The reference documentation for the deprecated announceForAccessibility API includes more details about suggested alternatives.

รองรับการไปยังส่วนต่างๆ แบบ 3 ปุ่ม

Android 16 为已正确迁移到预测性返回的应用的三按钮导航栏引入了预测性返回支持。长按返回按钮会启动预测性返回动画,让您预览返回滑动手势会打开的界面。

此行为适用于系统中支持预测性返回动画的所有区域,包括系统动画(返回主屏幕、跨任务和跨 activity)。

“三按钮”导航模式下的预测性返回动画。

รองรับการไปยังส่วนต่างๆ แบบ 3 ปุ่ม

Beginning with Android 16 QPR 2, Android automatically applies themes to app icons to create a cohesive home screen experience. This occurs if an app does not provide its own themed app icon. Apps can control the design of their themed app icon by including a monochrome layer within their adaptive icon and previewing what their app icon will look like in Android Studio.

รูปแบบของอุปกรณ์

Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้สำหรับแอปเมื่อเจ้าของอุปกรณ์เสมือน ฉายภาพไปยังจอแสดงผล

การลบล้างเจ้าของอุปกรณ์เสมือนจริง

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

เจ้าของอุปกรณ์เสมือนในโทรศัพท์สร้างอุปกรณ์เสมือนที่ฉายแอปไปยังจอแสดงผลระยะไกล

การลบล้างต่อแอป

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

การเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบที่พบบ่อย

ลักษณะการทำงานของ Android 16 อาจส่งผลต่อ UI ของแอปในรูปแบบหน้าจอขนาดใหญ่ เช่น จอแสดงผลของรถยนต์หรือ Chromebook โดยเฉพาะเลย์เอาต์ที่ออกแบบมาสำหรับจอแสดงผลขนาดเล็กในแนวนอน ดูวิธีทําให้แอปปรับเปลี่ยนตามรูปแบบของอุปกรณ์ทั้งหมดได้ที่เกี่ยวกับเลย์เอาต์ที่ปรับเปลี่ยนได้

ข้อมูลอ้างอิง

การสตรีมแอปที่ใช้ร่วมกัน

ความปลอดภัย

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

ปรับปรุงการรักษาความปลอดภัยเพื่อป้องกันการโจมตีโดยการเปลี่ยนเส้นทาง Intent

Android 16 提供了针对一般 Intent 重定向攻击的默认安全性,并且只需进行最低限度的兼容性更改和开发者更改。

我们正在推出默认安全强化解决方案,以应对重定向漏洞。Intent在大多数情况下,使用 intent 的应用通常不会遇到任何兼容性问题;我们在整个开发过程中收集了指标,以监控哪些应用可能会出现中断。

当攻击者可以部分或完全控制用于在存在漏洞的应用上下文中启动新组件的 intent 内容时,Android 中就会出现 intent 重定向问题,而受害应用会在(“顶级”)Intent 的 extras 字段中启动不可信的子级 intent。这可能会导致攻击者应用在受害者应用的上下文中启动私有组件、触发特权操作或获得对敏感数据的 URI 访问权限,从而可能导致数据盗窃和任意代码执行。

选择停用 intent 重定向处理

Android 16 引入了一项新 API,允许应用选择停用启动安全保护功能。在默认安全行为会干扰正当应用用例的特定情况下,这可能是必要的。

对于针对 Android 16(API 级别 36)SDK 或更高版本进行编译的应用

您可以直接对 Intent 对象使用 removeLaunchSecurityProtection() 方法。

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
对于针对 Android 15(API 级别 35)或更低版本进行编译的应用

虽然不建议这样做,但您可以使用反射来访问 removeLaunchSecurityProtection() 方法。

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent", Intent::class.java)
try {
    val removeLaunchSecurityProtection = Intent::class.java.getDeclaredMethod("removeLaunchSecurityProtection")
    removeLaunchSecurityProtection.invoke(iSublevel)
} catch (e: Exception) {
    // Handle the exception, e.g., log it
} // Opt-out from the security hardening using reflection
iSublevel?.let { startActivity(it) }

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

Android 16 introduces a new behavior during companion device pairing flow to protect the user's location privacy from malicious apps. All companion apps running on Android 16 are no longer directly notified of discovery timeout using RESULT_DISCOVERY_TIMEOUT. Instead, the user is notified of timeout events with a visual dialog. When the user dismisses the dialog, the app is alerted of the association failure with RESULT_USER_REJECTED.

The search duration has also been extended from the original 20 seconds, and the device discovery can be stopped by the user at any point during the search. If at least one device was discovered within the first 20 seconds of starting the search, the CDM stops searching for additional devices.

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

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

การจัดการการสูญเสียพันธะที่ดีขึ้น

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

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