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

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

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 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 introduced support for 16 KB memory pages to optimize performance of the platform. Android 16 adds a compatibility mode, allowing some apps built for 4 KB memory pages to run on a device configured for 16 KB memory pages.

When your app is running on a device with Android 16 or higher, if Android detects that your app has 4 KB aligned memory pages, it automatically uses compatibility mode and display a notification dialog to the user. Setting the android:pageSizeCompat property in the AndroidManifest.xml to enable the backwards compatibility mode will prevent the display of the dialog when your app launches. To use the android:pageSizeCompat property, compile your app using the Android 16 SDK.

For best performance, reliability, and stability, your app should still be 16 KB aligned. Check out our recent blog post on updating your apps to support 16 KB memory pages for more details.

The compatibility mode dialog that displays when the system detects that a 4 KB-aligned app could run more optimally if 16 KB aligned.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

A virtual device owner is a trusted or privileged app that creates and manages a virtual device. Virtual device owners run apps on a virtual device and then project the apps to the display of a remote device, such as a personal computer, virtual reality device, or car infotainment system. The virtual device owner is on a local device, such as a mobile phone.

Virtual device owner on phone creates virtual device that projects app to remote display.

Per-app overrides

On devices running Android 16 (API level 36), virtual device owners can override app settings on select virtual devices that the virtual device owners manage. For example, to improve app layout, a virtual device owner can ignore orientation, aspect ratio, and resizability restrictions when projecting apps onto an external display.

Common breaking changes

The Android 16 behavior might impact your app's UI on large screen form factors such as car displays or Chromebooks, especially layouts that were designed for small displays in portrait orientation. To learn how to make your app adaptive for all device form factors, see About adaptive layouts.

References

Companion app streaming

ความปลอดภัย

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

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

Android 16 provides default security against general Intent redirection attacks, with minimum compatibility and developer changes required.

We are introducing by-default security hardening solutions to Intent redirection exploits. In most cases, apps that use intents normally won't experience any compatibility issues; we've gathered metrics throughout our development process to monitor which apps might experience breakages.

Intent redirection in Android occurs when an attacker can partly or fully control the contents of an intent used to launch a new component in the context of a vulnerable app, while the victim app launches an untrusted sub-level intent in an extras field of an ("top-level") Intent. This can lead to the attacker app launching private components in the context of the victim app, triggering privileged actions, or gaining URI access to sensitive data, potentially leading to data theft and arbitrary code execution.

Opt out of Intent redirection handling

Android 16 introduces a new API that allows apps to opt out of launch security protections. This might be necessary in specific cases where the default security behavior interferes with legitimate app use cases.

For applications compiling against Android 16 (API level 36) SDK or higher

You can directly use the removeLaunchSecurityProtection() method on the Intent object.

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
For applications compiling against Android 15 (API level 35) or lower

While not recommended, you can use reflection to access the removeLaunchSecurityProtection() method.

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

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

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

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

Starting in Android 16, the Bluetooth stack has been updated to improve security and user experience when a remote bond loss is detected. Previously, the system would automatically remove the bond and initiate a new pairing process, which could lead to unintentional re-pairing. We have seen in many instances apps not taking care of the bond loss event in a consistent way.

To unify the experience, Android 16 improved the bond loss handling to the system. If a previously bonded Bluetooth device could not be authenticated upon reconnection, the system will disconnect the link, retain local bond information, and display a system dialog informing users of the bond loss and directing them to re-pair.