แพลตฟอร์ม 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
เหตุผลที่หยุดงานว่างเปล่าที่หยุดทำงาน
An abandoned job occurs when the JobParameters
object associated with the job
has been garbage collected, but JobService#jobFinished(JobParameters,
boolean)
has not been called to signal job completion. This indicates that
the job may be running and being rescheduled without the app's awareness.
Apps that rely on JobScheduler, don't maintain a strong reference to the
JobParameters
object, and timeout will now be granted the new job stop reason
STOP_REASON_TIMEOUT_ABANDONED
, instead of STOP_REASON_TIMEOUT
.
If there are frequent occurrences of the new abandoned stop reason, the system will take mitigation steps to reduce job frequency.
Apps should use the new stop reason to detect and reduce abandoned jobs.
If you're using WorkManager, AsyncTask, or DownloadManager, you aren't impacted because these APIs manage the job lifecycle on your app's behalf.
เลิกใช้งาน 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
เป็นลำดับความสำคัญของการออกอากาศ
แอปของคุณอาจได้รับผลกระทบหากมีลักษณะการทำงานอย่างใดอย่างหนึ่งต่อไปนี้
- แอปพลิเคชันของคุณประกาศกระบวนการหลายรายการที่มี Intent การออกอากาศเดียวกัน และคาดหวังที่จะได้รับการส่ง Intent เหล่านั้นตามลำดับที่แน่นอนโดยอิงตามลําดับความสําคัญ
- กระบวนการสมัครของคุณจะโต้ตอบกับกระบวนการอื่นๆ และมีสิ่งที่คาดหวังเกี่ยวกับการรับ Intent การออกอากาศตามลําดับที่กําหนด
หากกระบวนการต่างๆ จำเป็นต้องประสานงานกัน ทีมควรสื่อสารโดยใช้ช่องทางประสานงานอื่นๆ
การเปลี่ยนแปลงภายในของ ART
Android 16 includes the latest updates to the Android Runtime (ART) that improve the Android Runtime's (ART's) performance and provide support for additional Java features. Through Google Play System updates, these improvements are also available to over a billion devices running Android 12 (API level 31) and higher.
As these changes are released, libraries and app code that rely on internal structures of ART might not work correctly on devices running Android 16, along with earlier Android versions that update the ART module through Google Play system updates.
Relying on internal structures (such as non-SDK interfaces) can always lead to compatibility problems, but it's particularly important to avoid relying on code (or libraries containing code) that leverages internal ART structures, since ART changes aren't tied to the platform version the device is running on and they go out to over a billion devices through Google Play system updates.
All developers should check whether their app is impacted by testing their apps thoroughly on Android 16. In addition, check the known issues to see if your app depends on any libraries that we've identified that rely on internal ART structures. If you do have app code or library dependencies that are affected, seek public API alternatives whenever possible and request public APIs for new use cases by creating a feature request in our issue tracker.
โหมดความเข้ากันได้กับขนาดหน้า 16 KB
Android 15 รองรับหน้าหน่วยความจำขนาด 16 KB เพื่อเพิ่มประสิทธิภาพแพลตฟอร์ม Android 16 เพิ่มโหมดความเข้ากันได้ ซึ่งช่วยให้แอปบางแอปที่สร้างขึ้นสำหรับหน้าหน่วยความจำขนาด 4 KB ทำงานในอุปกรณ์ที่กำหนดค่าไว้สำหรับหน้าหน่วยความจำขนาด 16 KB ได้
หาก Android ตรวจพบว่าแอปของคุณมีหน้าหน่วยความจำที่ปรับแนวขนาด 4 KB ระบบจะใช้โหมดความเข้ากันได้โดยอัตโนมัติและแสดงกล่องโต้ตอบการแจ้งเตือนต่อผู้ใช้ การตั้งค่าพร็อพเพอร์ตี้ android:pageSizeCompat
ใน AndroidManifest.xml
เพื่อเปิดใช้โหมดความเข้ากันได้แบบย้อนหลังจะป้องกันไม่ให้กล่องโต้ตอบแสดงเมื่อแอปเปิดขึ้น แอปของคุณควรยังคงมีขนาด 16 KB เพื่อให้ได้ประสิทธิภาพ ความน่าเชื่อถือ และความเสถียรที่ดีที่สุด ดูรายละเอียดเพิ่มเติมได้ในบล็อกโพสต์ล่าสุดเกี่ยวกับการอัปเดตแอปให้รองรับหน้าหน่วยความจำ 16 KB

ประสบการณ์ของผู้ใช้และ UI ของระบบ
Android 16 มีการเปลี่ยนแปลงต่อไปนี้ซึ่งมีจุดประสงค์เพื่อสร้างประสบการณ์การใช้งานที่สม่ำเสมอและใช้งานง่ายยิ่งขึ้น
การเลิกใช้งานการประกาศการช่วยเหลือพิเศษที่รบกวน
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:
- For significant UI changes like window changes, use
Activity.setTitle(CharSequence)
andsetAccessibilityPaneTitle(java.lang.CharSequence)
. In Compose, useModifier.semantics { paneTitle = "paneTitle" }
- To inform the user of changes to critical UI, use
setAccessibilityLiveRegion(int)
. In Compose, useModifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}
. These should be used sparingly as they may generate announcements every time a View is updated. - To notify users about errors, send an
AccessibilityEvent
of typeAccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR
and setAccessibilityNodeInfo#setError(CharSequence)
, or useTextView#setError(CharSequence)
.
The reference documentation for the deprecated
announceForAccessibility
API includes more details about
suggested alternatives.
การรองรับการไปยังส่วนต่างๆ แบบ 3 ปุ่ม
Android 16 brings predictive back support to the 3-button navigation for apps that have properly migrated to predictive back. Long-pressing the back button initiates a predictive back animation, giving you a preview of where the back swipe takes you.
This behavior applies across all areas of the system that support predictive back animations, including the system animations (back-to-home, cross-task, and cross-activity).
รูปแบบของอุปกรณ์
Android 16 มีการเปลี่ยนแปลงต่อไปนี้สำหรับแอปเมื่อเจ้าของอุปกรณ์เสมือนโปรเจ็กต์ไปยังจอแสดงผล
การลบล้างของเจ้าของอุปกรณ์เสมือนจริง
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.

Per-app overrides
On devices running Android 16, 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
ความปลอดภัย
Android 16 มีการเปลี่ยนแปลงที่ส่งเสริมความปลอดภัยของระบบเพื่อช่วยปกป้องแอปและผู้ใช้จากแอปที่เป็นอันตราย
ปรับปรุงความปลอดภัยเพื่อป้องกันการโจมตีด้วยการเปลี่ยนเส้นทาง 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 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 มีการเปลี่ยนแปลงต่อไปนี้ในกองซ้อนบลูทูธเพื่อปรับปรุงการเชื่อมต่อกับอุปกรณ์ต่อพ่วง
การจัดการการสูญเสียพันธบัตรที่ดีขึ้น
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.