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

แพลตฟอร์ม 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 การตั้งเวลางาน

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

การทดสอบ

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

หากต้องการทดสอบลักษณะการทำงานของ App Standby Bucket บางอย่าง คุณสามารถตั้งค่า App Standby Bucket ของแอปได้โดยใช้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 จะไม่เก็บการอ้างอิงแบบ Strong กับออบเจ็กต์ 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 应用可以为广播接收器定义优先级,以控制接收器接收和处理广播的顺序。对于清单声明的接收器,应用可以使用 android:priority 属性来定义优先级;对于上下文注册的接收器,应用可以使用 IntentFilter#setPriority() API 来定义优先级。发送广播时,系统会按接收器的优先级(从高到低)将其传送给接收器。

在 Android 16 中,无法保证使用 android:priority 属性或 IntentFilter#setPriority() 在不同进程中传送广播的顺序。广播优先级仅在同一应用进程内有效,而不会跨所有进程有效。

此外,广播优先级将自动限制在 (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY - 1) 的范围内。只有系统组件才能将 SYSTEM_LOW_PRIORITYSYSTEM_HIGH_PRIORITY 设置为广播优先级。

如果您的应用执行以下任一操作,可能会受到影响:

  1. 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
  2. 您的应用进程与其他进程交互,并期望以特定顺序接收广播 intent。

如果进程需要相互协调,则应使用其他协调渠道进行通信。

การเปลี่ยนแปลงภายในของ 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 对齐的内存页面,则会自动使用兼容模式并向用户显示通知对话框。在 AndroidManifest.xml 中设置 android:pageSizeCompat 属性以启用向后兼容模式,将会阻止应用启动时显示对话框。如需使用 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 为已正确迁移到预测性返回的应用的三按钮导航栏引入了预测性返回支持。长按返回按钮会启动预测性返回动画,让您预览返回滑动手势会打开的界面。

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

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

ไอคอนแอปตามธีมอัตโนมัติ

ตั้งแต่ Android 16 QPR 2 เป็นต้นไป Android จะใช้ธีมกับไอคอนแอปโดยอัตโนมัติเพื่อสร้างประสบการณ์หน้าจอหลักที่สอดคล้องกัน กรณีนี้จะเกิดขึ้นหากแอปไม่ได้ระบุไอคอนแอปตามธีมของแอปเอง แอปสามารถควบคุมการออกแบบไอคอนแอปที่เข้าชุดกันได้โดยใส่เลเยอร์ขาวดำไว้ในไอคอนแบบปรับอัตโนมัติ และดูตัวอย่างลักษณะไอคอนแอปใน 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 在配套设备配对流程期间引入了一种新行为,以防恶意应用侵犯用户的位置信息隐私。在 Android 16 上运行的所有配套应用都不再直接通过 RESULT_DISCOVERY_TIMEOUT 收到发现超时通知。而是通过可视对话框通知用户超时事件。当用户关闭对话框时,系统会通过 RESULT_USER_REJECTED 提醒应用关联失败。

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

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

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

การจัดการการขาดทุนจากพันธบัตรที่ดีขึ้น

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

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