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

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

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

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

Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ซึ่งแก้ไขหรือขยายความสามารถหลักต่างๆ ของระบบ 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 apps are allowed to define priorities on broadcast receivers to control the order in which the receivers receive and process the broadcast. For manifest-declared receivers, apps can use the android:priority attribute to define the priority and for context-registered receivers, apps can use the IntentFilter#setPriority() API to define the priority. When a broadcast is sent, the system delivers it to receivers in order of their priority, from highest to lowest.

In Android 16, broadcast delivery order using the android:priority attribute or IntentFilter#setPriority() across different processes will not be guaranteed. Broadcast priorities will only be respected within the same application process rather than across all processes.

Also, broadcast priorities will be automatically confined to the range (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY - 1). Only system components will be allowed to set SYSTEM_LOW_PRIORITY, SYSTEM_HIGH_PRIORITY as broadcast priority.

Your app might be impacted if it does either of the following:

  1. Your application has declared multiple processes with the same broadcast intent, and has expectations around receiving those intents in a certain order based on the priority.
  2. Your application process interacts with other processes and has expectations around receiving a broadcast intent in a certain order.

If the processes need to coordinate with each other, they should communicate using other coordination channels.

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

Android 16 มีการอัปเดตล่าสุดสำหรับรันไทม์ Android (ART) ซึ่งจะปรับปรุงประสิทธิภาพของรันไทม์ Android (ART) และรองรับฟีเจอร์ Java เพิ่มเติม การอัปเดตระบบ Google Play ยังช่วยให้อุปกรณ์กว่า 1 พันล้านเครื่องที่ใช้ Android 12 (API ระดับ 31) ขึ้นไปได้รับประโยชน์จากการปรับปรุงเหล่านี้ด้วย

เมื่อมีการเผยแพร่การเปลี่ยนแปลงเหล่านี้ ไลบรารีและโค้ดแอปที่อาศัยโครงสร้างภายในของ ART อาจทํางานไม่ถูกต้องในอุปกรณ์ที่ใช้ Android 16 รวมถึง Android เวอร์ชันเก่าที่อัปเดตข้อบังคับของ ART ผ่านการอัปเดตระบบของ Google Play

การใช้โครงสร้างภายใน (เช่น อินเทอร์เฟซที่ไม่ใช่ SDK) อาจทำให้เกิดปัญหาความเข้ากันได้เสมอ แต่สิ่งสําคัญอย่างยิ่งคือหลีกเลี่ยงการใช้โค้ด (หรือไลบรารีที่มีโค้ด) ที่ใช้โครงสร้างภายในของ ART เนื่องจากการเปลี่ยนแปลง ART ไม่ได้เชื่อมโยงกับเวอร์ชันแพลตฟอร์มที่อุปกรณ์ใช้อยู่ และการเปลี่ยนแปลงดังกล่าวจะเผยแพร่ไปยังอุปกรณ์กว่า 1 พันล้านเครื่องผ่านการอัปเดตระบบของ Google Play

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

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

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

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

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

กล่องโต้ตอบโหมดเข้ากันได้ที่แสดงขึ้นเมื่อระบบตรวจพบว่าแอปที่ปรับขนาดเป็น 4 KB สามารถทำงานได้อย่างมีประสิทธิภาพมากขึ้นหากปรับขนาดเป็น 16 KB

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

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

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

Android 16 废弃了无障碍功能通告,其特征是使用 announceForAccessibility 或调度 TYPE_ANNOUNCEMENT 无障碍功能事件。这可能会给 TalkBack 和 Android 屏幕阅读器用户带来不一致的用户体验,而替代方案可以更好地满足各种 Android 辅助技术的用户需求。

替代方案示例:

已废弃的 announceForAccessibility API 的参考文档中包含有关建议替代方案的更多详细信息。

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

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

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

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

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

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(“顶级”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 在配套设备配对流程期间引入了一种新行为,以防恶意应用侵犯用户的位置信息隐私。在 Android 16 上运行的所有配套应用都不再直接通过 RESULT_DISCOVERY_TIMEOUT 收到发现超时通知。而是通过可视对话框通知用户超时事件。当用户关闭对话框时,系统会通过 RESULT_USER_REJECTED 提醒应用关联失败。

搜索时长也从原来的 20 秒延长到了 30 秒,并且用户可以在搜索期间的任何时间停止设备发现。如果在开始搜索的前 20 秒内发现了至少 1 部设备,CDM 会停止搜索其他设备。

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

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

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

从 Android 16 开始,蓝牙堆栈已更新,以便在检测到远程配对丢失时提高安全性和用户体验。以前,系统会自动解除配对并启动新的配对流程,这可能会导致意外重新配对。在许多情况下,我们发现应用未以一致的方式处理债券损失事件。

为了统一体验,Android 16 改进了系统的绑定丢失处理。如果之前配对的蓝牙设备在重新连接时无法进行身份验证,系统会断开关联,保留本地配对信息,并显示系统对话框,告知用户配对已断开并指示他们重新配对。