แพลตฟอร์ม 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
เหตุผลที่หยุดงานที่ว่างเปล่าซึ่งถูกละทิ้ง
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 อย่างสมบูรณ์
วิธีการ 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:
- 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.
- 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 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 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.
ประสบการณ์ของผู้ใช้และ UI ของระบบ
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ซึ่งมีจุดประสงค์ เพื่อสร้างประสบการณ์ของผู้ใช้ที่สอดคล้องกันและใช้งานง่ายยิ่งขึ้น
การเลิกใช้งานการประกาศการช่วยเหลือพิเศษที่รบกวนผู้ใช้
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
AccessibilityEventof typeAccessibilityEvent#CONTENT_CHANGE_TYPE_ERRORand setAccessibilityNodeInfo#setError(CharSequence), or useTextView#setError(CharSequence).
The reference documentation for the deprecated
announceForAccessibility API includes more details about
suggested alternatives.
รองรับการนำทางแบบ 3 ปุ่ม
Android 16 รองรับการกดย้อนกลับแบบคาดการณ์ในการนําทางด้วยปุ่ม 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.
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
ความปลอดภัย
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงที่ส่งเสริมความปลอดภัยของระบบเพื่อ ช่วยปกป้องแอปและผู้ใช้จากแอปที่เป็นอันตราย
ปรับปรุงความปลอดภัยเพื่อป้องกันการโจมตีโดยการเปลี่ยนเส้นทาง Intent
Android 16 มีการรักษาความปลอดภัยเริ่มต้นเพื่อป้องกันการโจมตีโดยIntentการเปลี่ยนเส้นทาง
ทั่วไป โดยต้องมีการเปลี่ยนแปลงความเข้ากันได้และนักพัฒนาแอปขั้นต่ำ
เราจะเปิดตัวโซลูชันการปิดช่องโหว่เพื่อความปลอดภัยโดยค่าเริ่มต้นสำหรับIntent
การใช้ประโยชน์จากการเปลี่ยนเส้นทาง ในกรณีส่วนใหญ่ แอปที่ใช้ Intent จะไม่พบปัญหาความเข้ากันได้ใดๆ เราได้รวบรวมเมตริกตลอดกระบวนการพัฒนาเพื่อตรวจสอบว่าแอปใดอาจพบปัญหา
การเปลี่ยนเส้นทาง Intent ใน Android จะเกิดขึ้นเมื่อผู้โจมตีสามารถควบคุมเนื้อหาของ Intent ที่ใช้เปิดตัวคอมโพเนนต์ใหม่ในบริบทของแอปที่มีช่องโหว่ได้บางส่วนหรือทั้งหมด ในขณะที่แอปเหยื่อเปิดตัว Intent ระดับย่อยที่ไม่น่าเชื่อถือ ในฟิลด์ส่วนเพิ่มเติมของ Intent ("ระดับบนสุด") ซึ่งอาจทำให้แอปของผู้โจมตี เปิดใช้คอมโพเนนต์ส่วนตัวในบริบทของแอปเหยื่อ ทริกเกอร์การดำเนินการที่มีสิทธิ์ หรือรับสิทธิ์เข้าถึง URI ไปยังข้อมูลที่ละเอียดอ่อน ซึ่งอาจนำไปสู่การขโมยข้อมูลและการดำเนินการโค้ดโดยพลการ
เลือกไม่ใช้การจัดการการเปลี่ยนเส้นทางตามความตั้งใจ
Android 16 เปิดตัว API ใหม่ที่อนุญาตให้แอปเลือกไม่ใช้การรักษาความปลอดภัยในการเปิดตัว ซึ่งอาจจำเป็นในบางกรณีที่ลักษณะการทำงานด้านความปลอดภัยเริ่มต้น รบกวน Use Case ที่ถูกต้องของแอป
สำหรับแอปพลิเคชันที่คอมไพล์กับ SDK ของ Android 16 (API ระดับ 36) ขึ้นไป
คุณสามารถใช้วิธี 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) }
แอปที่ใช้ร่วมกันจะไม่ได้รับการแจ้งเตือนเกี่ยวกับการหมดเวลาการค้นพบอีกต่อไป
Android 16 เปิดตัวลักษณะการทำงานใหม่ในขั้นตอนการจับคู่อุปกรณ์เสริมเพื่อปกป้องความเป็นส่วนตัวของตำแหน่งของผู้ใช้จากแอปที่เป็นอันตราย แอปที่ใช้ร่วมกันทั้งหมดที่ทำงานบน Android 16 จะไม่ได้รับการแจ้งเตือนโดยตรงอีกต่อไปเมื่อหมดเวลาในการค้นหาโดยใช้ RESULT_DISCOVERY_TIMEOUT แต่ผู้ใช้จะได้รับการแจ้งเตือนเกี่ยวกับเหตุการณ์หมดเวลาด้วยกล่องโต้ตอบแบบภาพแทน เมื่อผู้ใช้ปิดกล่องโต้ตอบ แอปจะได้รับการแจ้งเตือนเกี่ยวกับการเชื่อมโยงกับ RESULT_USER_REJECTED ไม่สำเร็จ
นอกจากนี้ ระยะเวลาการค้นหายังเพิ่มขึ้นจากเดิม 20 วินาที และผู้ใช้สามารถหยุดการค้นหาอุปกรณ์ได้ทุกเมื่อในระหว่างการค้นหา หากพบอุปกรณ์อย่างน้อย 1 เครื่องภายใน 20 วินาทีแรกของการเริ่มค้นหา CDM จะหยุดค้นหาอุปกรณ์เพิ่มเติม
การเชื่อมต่อ
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ในสแต็กบลูทูธ เพื่อปรับปรุงการเชื่อมต่อกับอุปกรณ์ต่อพ่วง
การจัดการการขาดทุนจากพันธบัตรที่ดีขึ้น
ตั้งแต่ Android 16 เป็นต้นไป สแต็กบลูทูธได้รับการอัปเดตเพื่อปรับปรุงความปลอดภัยและประสบการณ์ของผู้ใช้เมื่อตรวจพบการสูญเสียการเชื่อมโยงระยะไกล ก่อนหน้านี้ ระบบจะนำการจับคู่ออกโดยอัตโนมัติและเริ่มกระบวนการจับคู่ใหม่ ซึ่งอาจนำไปสู่การจับคู่อีกครั้งโดยไม่ตั้งใจ เราพบว่ามีหลายครั้งที่แอปไม่ได้จัดการเหตุการณ์การสูญเสียพันธบัตรอย่างสม่ำเสมอ
Android 16 ได้ปรับปรุงการจัดการการสูญเสียการเชื่อมโยงกับระบบเพื่อรวมประสบการณ์การใช้งาน หากไม่สามารถตรวจสอบสิทธิ์อุปกรณ์บลูทูธที่จับคู่ไว้ก่อนหน้านี้เมื่อเชื่อมต่ออีกครั้ง ระบบจะยกเลิกการเชื่อมต่อ เก็บข้อมูลการจับคู่ในเครื่อง และแสดงกล่องโต้ตอบของระบบเพื่อแจ้งให้ผู้ใช้ทราบถึงการสูญเสียการจับคู่และนำผู้ใช้ไปยังการจับคู่อีกครั้ง