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

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

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

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

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

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

ตั้งแต่ Android 16 เป็นต้นไป เราจะปรับโควต้ารันไทม์ของงานแบบปกติและแบบเร่งด่วนตามปัจจัยต่อไปนี้

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

การเปลี่ยนแปลงนี้จะส่งผลต่องานที่กําหนดเวลาไว้โดยใช้ WorkManager, JobScheduler และ DownloadManager หากต้องการแก้ไขข้อบกพร่องว่าเหตุใดงานจึงหยุดทำงาน เราขอแนะนำให้บันทึกสาเหตุที่งานหยุดทำงานโดยเรียกใช้ WorkInfo.getStopReason() (สำหรับงาน JobScheduler ให้เรียกใช้ JobParameters.getStopReason())

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

นอกจากนี้ เราขอแนะนําให้ใช้ประโยชน์จาก JobScheduler#getPendingJobReasonsHistory API ใหม่ที่เปิดตัวใน Android 16 เพื่อทําความเข้าใจสาเหตุที่การทํางานไม่ทํางาน

การทดสอบ

หากต้องการทดสอบลักษณะการทํางานของแอป คุณสามารถเปิดใช้การลบล้างการเพิ่มประสิทธิภาพโควต้างานบางอย่างได้ ตราบใดที่แอปทํางานบนอุปกรณ์ Android 16

หากต้องการปิดใช้การบังคับใช้ "สถานะบนสุดจะยึดตามโควต้ารันไทม์ของงาน" ให้เรียกใช้คำสั่ง adb ต่อไปนี้

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

หากต้องการปิดใช้การบังคับใช้ "งานที่ดำเนินการอยู่ขณะที่บริการที่ทำงานอยู่เบื้องหน้าจะยึดตามโควต้ารันไทม์ของงาน" ให้เรียกใช้คำสั่งadbต่อไปนี้

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

หากต้องการทดสอบลักษณะการทํางานของที่เก็บข้อมูลสแตนด์บายของแอปบางรายการ ให้ตั้งค่าที่เก็บข้อมูลสแตนด์บายของแอปโดยใช้คําสั่ง adb ต่อไปนี้

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

หากต้องการทำความเข้าใจที่เก็บข้อมูลสแตนด์บายของแอปที่คุณใช้อยู่ ให้ดูที่เก็บข้อมูลสแตนด์บายของแอปโดยใช้คำสั่ง adb ต่อไปนี้

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 อย่างสมบูรณ์

JobInfo.Builder#setImportantWhileForeground(boolean) 方法用于在调度应用位于前台或暂时豁免于后台限制时指示作业的优先级。

自 Android 12(API 级别 31)起,此方法已废弃。从 Android 16 开始,它不再有效,系统会忽略调用此方法。

此功能移除也适用于 JobInfo#isImportantWhileForeground()。从 Android 16 开始,如果调用该方法,该方法会返回 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 检测到您的应用具有 4 KB 对齐的内存页,则会自动使用兼容模式并向用户显示通知对话框。在 AndroidManifest.xml 中设置 android:pageSizeCompat 属性以启用向后兼容模式,将会阻止应用启动时显示对话框。为了获得最佳性能、可靠性和稳定性,您的应用仍应采用 16 KB 对齐。如需了解详情,请参阅我们近期发布的博文,了解如何更新应用以支持 16 KB 的内存页面。

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

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

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

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

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

ตัวอย่างทางเลือกมีดังนี้

เอกสารอ้างอิงสําหรับ announceForAccessibility API ที่เลิกใช้งานแล้วมีรายละเอียดเพิ่มเติมเกี่ยวกับทางเลือกที่แนะนํา

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

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

ลักษณะการทำงานนี้มีผลกับทุกส่วนของระบบที่รองรับภาพเคลื่อนไหวแบบคาดเดาของการย้อนกลับ รวมถึงภาพเคลื่อนไหวของระบบ (การย้อนกลับไปยังหน้าจอหลัก การข้ามงาน และการทำงานข้ามแอป)

การเคลื่อนไหวย้อนกลับแบบคาดเดาในโหมดการนำทางแบบ 3 ปุ่ม

ความปลอดภัย

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

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

Android 16 มีการรักษาความปลอดภัยเริ่มต้นเพื่อป้องกันIntentการโจมตีด้วยการเปลี่ยนเส้นทางทั่วไป โดยมีการรองรับการทำงานร่วมกันขั้นต่ำและการเปลี่ยนแปลงที่นักพัฒนาแอปต้องทำ

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

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

เลือกไม่ใช้การจัดการการเปลี่ยนเส้นทาง Intent

Android 16 เปิดตัว API ใหม่ที่ช่วยให้แอปเลือกไม่ใช้การป้องกันด้านความปลอดภัยเมื่อเปิดตัวได้ ซึ่งอาจจำเป็นในบางกรณีที่ลักษณะการทำงานด้านความปลอดภัยเริ่มต้นรบกวน Use Case ของแอปที่ถูกต้อง

สําหรับแอปพลิเคชันที่คอมไพล์กับ Android 16 SDK ขึ้นไป

คุณใช้เมธอด removeLaunchSecurityProtection() กับออบเจ็กต์ Intent ได้โดยตรง

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) }