แพลตฟอร์ม Android 13 มีการเปลี่ยนแปลงลักษณะการทำงานที่อาจส่งผลต่อแอปของคุณ การเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้จะมีผลกับ แอปทั้งหมด เมื่อทำงานบน Android 13 ไม่ว่า targetSdkVersion จะเป็นเวอร์ชันใดก็ตาม คุณควรทดสอบแอปแล้วแก้ไขตามความจำเป็นเพื่อให้รองรับการเปลี่ยนแปลงเหล่านี้ได้อย่างเหมาะสม
ประสิทธิภาพและแบตเตอรี่
ตัวจัดการงาน
ตั้งแต่ Android 13 (ระดับ API 33) เป็นต้นไป ผู้ใช้สามารถทำเวิร์กโฟลว์จากลิ้นชักการแจ้งเตือนเพื่อหยุดแอปที่มีบริการที่ทำงานอยู่เบื้องหน้าได้ ดังที่แสดงในรูปที่ 1 ความสามารถนี้เรียกว่า ตัวจัดการงาน แอปต้องจัดการการหยุดที่เริ่มต้นโดยผู้ใช้ได้
ปรับปรุงการจัดการงานดึงข้อมูลล่วงหน้าโดยใช้ JobScheduler
JobScheduler ช่วยให้แอปสามารถทำเครื่องหมายงานที่เฉพาะเจาะจงเป็นงาน "ดึงข้อมูลล่วงหน้า"
(โดยใช้ JobInfo.Builder.setPrefetch()) ซึ่งหมายความว่างานควรทำงาน
ใกล้เคียงกับเวลาที่เปิดแอปครั้งถัดไปและก่อนที่จะเปิดแอปครั้งถัดไป เพื่อปรับปรุงประสบการณ์ของผู้ใช้
ในอดีต JobScheduler ใช้สัญญาณเพื่ออนุญาตให้งานดึงข้อมูลล่วงหน้าใช้ข้อมูลฟรีหรือข้อมูลส่วนเกินได้ตามโอกาสเท่านั้น
ใน Android 13 (ระดับ API 33) ขึ้นไป ระบบจะพยายามกำหนดเวลาที่แอปจะเปิดขึ้นครั้งถัดไป และใช้การประมาณการดังกล่าวเพื่อเรียกใช้งานดึงข้อมูลล่วงหน้า แอปควรพยายามใช้การดึงข้อมูลงานล่วงหน้าสำหรับงานที่ต้องการให้เสร็จก่อนที่จะเปิดแอปครั้งถัดไป
การใช้ทรัพยากรแบตเตอรี่
Android 13 (ระดับ API 33) มีวิธีต่อไปนี้เพื่อให้ระบบจัดการอายุการใช้งานแบตเตอรี่ของอุปกรณ์ได้ดียิ่งขึ้น
- กฎที่อัปเดตเกี่ยวกับกรณีที่ระบบจะนำแอปของคุณไปไว้ใน "ถูกจำกัด" App Bucket สแตนด์บาย
- ขีดจำกัดใหม่เกี่ยวกับงานที่แอปทำได้เมื่อผู้ใช้นำแอปของคุณไปไว้ในสถานะ "ถูกจำกัด"สำหรับ การใช้งานแบตเตอรี่อยู่เบื้องหลัง
เมื่อทดสอบแอปด้วยการเปลี่ยนแปลงเหล่านี้ โปรดตรวจสอบสิ่งต่อไปนี้
ทดสอบว่าแอปตอบสนองอย่างไรเมื่อระบบนำแอปไปไว้ใน "ถูกจำกัด" App Bucket สแตนด์บายแอป ใช้คำสั่ง Android Debug Bridge (ADB) ต่อไปนี้เพื่อกำหนดแอปของคุณลงใน Bucket นี้
adb shell am set-standby-bucket PACKAGE_NAME restricted
ทดสอบว่าแอปตอบสนองต่อข้อจำกัดต่อไปนี้อย่างไร ซึ่งโดยทั่วไปจะมีผล กับแอปที่อยู่ในสถานะ "ถูกจำกัด" สำหรับการใช้งานแบตเตอรี่อยู่เบื้องหลัง
- ไม่สามารถเปิดบริการที่ทำงานอยู่เบื้องหน้า
- ระบบจะนำบริการที่ทำงานอยู่เบื้องหน้าออกจากเบื้องหน้า
- ระบบจะไม่ทริกเกอร์การปลุก
- ระบบจะไม่เรียกใช้งาน
ใช้คำสั่ง ADB ต่อไปนี้เพื่อนำแอปไปไว้ในสถานะ "ถูกจำกัด" นี้
adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND ignore
โควต้า Firebase Cloud Message (FCM) ที่มีลำดับความสำคัญสูง
Android 13 (ระดับ API 33) อัปเดต โควต้า Firebase Cloud Messaging (FCM) เพื่อปรับปรุงความน่าเชื่อถือของการแสดง FCM ที่มีลำดับความสำคัญสูงสำหรับแอปที่แสดงการแจ้งเตือนเพื่อตอบสนองต่อ FCM ที่มีลำดับความสำคัญสูง สิ่งที่เปลี่ยนแปลงใน Android 13 (ระดับ API 33) มีดังนี้
- Bucket สแตนด์บายแอป จะไม่กำหนดจำนวน FCM ที่มีลำดับความสำคัญสูงที่แอปใช้ได้อีกต่อไป
- ตอนนี้ระบบจะลดระดับข้อความที่มีลำดับความสำคัญสูงหากตรวจพบว่าแอปส่งข้อความที่มีลำดับความสำคัญสูงอย่างสม่ำเสมอแต่ไม่ทำให้เกิดการแจ้งเตือน
เช่นเดียวกับ Android เวอร์ชันก่อนหน้า ระบบจะลดระดับ FCM ที่มีลำดับความสำคัญสูงซึ่งเกินโควต้าเป็นลำดับความสำคัญปกติ เมื่อเริ่ม บริการที่ทำงานอยู่เบื้องหน้า (FGS) เพื่อตอบสนองต่อ FCM เราขอแนะนำให้ตรวจสอบผลลัพธ์ของ RemoteMessage.getPriority() และยืนยันว่าเป็น PRIORITY_HIGH และ/หรือจัดการข้อยกเว้น ForegroundServiceStartNotAllowedException ที่อาจเกิดขึ้น
หากแอปพลิเคชันของคุณไม่ได้แสดงการแจ้งเตือนเพื่อตอบสนองต่อ FCM ที่มีลำดับความสำคัญสูงเสมอไป เราขอแนะนำให้คุณเปลี่ยนลำดับความสำคัญของ FCM เหล่านี้เป็นปกติ เพื่อไม่ให้ระบบลดระดับข้อความที่ทำให้เกิดการแจ้งเตือน
ความเป็นส่วนตัว
สิทธิ์รันไทม์สำหรับการแจ้งเตือน
Android 13 (API ระดับ 33) ขอแนะนำสิทธิ์การแจ้งเตือนของรันไทม์
:
POST_NOTIFICATIONS
การเปลี่ยนแปลงนี้ช่วยให้ผู้ใช้มุ่งเน้นไปที่การแจ้งเตือนที่มีความสำคัญมากที่สุดสำหรับตนเอง
เราขอแนะนำอย่างยิ่งให้คุณกำหนดเป้าหมายเป็น Android 13 ขึ้นไปโดยเร็วที่สุดเพื่อรับประโยชน์จากการควบคุมและความยืดหยุ่นเพิ่มเติมของฟีเจอร์นี้
ดูข้อมูลเพิ่มเติมเกี่ยวกับ แนวทางปฏิบัติแนะนำสำหรับสิทธิ์ของแอป
ซ่อนเนื้อหาที่ละเอียดอ่อนจากคลิปบอร์ด
หากแอปของคุณอนุญาตให้ผู้ใช้คัดลอกเนื้อหาที่ละเอียดอ่อน เช่น รหัสผ่านหรือข้อมูลบัตรเครดิต ไปยังคลิปบอร์ด คุณต้องเพิ่มแฟล็กไปยัง ClipDescription ของ ClipData ก่อนเรียก ClipboardManager#setPrimaryClip() การเพิ่มแฟล็กนี้จะป้องกันไม่ให้เนื้อหาที่ละเอียดอ่อนปรากฏในการแสดงตัวอย่างเนื้อหา
หากต้องการติดแฟล็กเนื้อหาที่ละเอียดอ่อน ให้เพิ่มบูลีนพิเศษลงใน ClipDescription แอปทั้งหมดควรทำเช่นนี้ ไม่ว่า API ระดับเป้าหมายจะเป็นเวอร์ชันใดก็ตาม
// When your app is compiled with the API level 33 SDK or higher
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
}
}
// If your app is compiled with a lower SDK
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean("android.content.extra.IS_SENSITIVE", true)
}
}
ดูข้อมูลเพิ่มเติมเกี่ยวกับ UI คลิปบอร์ดแบบใหม่ได้ที่หน้าฟีเจอร์ คัดลอกและวาง
ความปลอดภัย
ย้ายข้อมูลออกจากรหัสผู้ใช้ที่แชร์
หากแอปของคุณใช้แอตทริบิวต์ที่เลิกใช้งานแล้ว
android:sharedUserId
และไม่ได้ขึ้นอยู่กับฟังก์ชันการทำงานของแอตทริบิวต์อีกต่อไป คุณสามารถตั้งค่าแอตทริบิวต์
android:sharedUserMaxSdkVersion
เป็น 32 ได้ ดังที่แสดงในข้อมูลโค้ดต่อไปนี้
<manifest ...> <!-- To maintain backward compatibility, continue to use "android:sharedUserId" if you already added it to your manifest. --> android:sharedUserId="SHARED_PACKAGE_NAME" android:sharedUserMaxSdkVersion="32" ... </manifest>
แอตทริบิวต์นี้จะบอกให้ระบบทราบว่าแอปของคุณไม่ได้ใช้รหัสผู้ใช้ที่แชร์อีกต่อไป หากแอปประกาศ android:sharedUserMaxSdkVersion และติดตั้งใหม่ในอุปกรณ์ที่ใช้ Android 13 ขึ้นไป แอปของคุณจะทำงานราวกับว่าคุณไม่เคยกำหนด android:sharedUserId แอปที่อัปเดตแล้วจะยังคงใช้รหัสผู้ใช้ที่แชร์ที่มีอยู่
รหัสผู้ใช้ที่แชร์ทำให้เกิดลักษณะการทำงานที่ไม่แน่นอนภายในตัวจัดการแพ็กเกจ แอปของคุณควรใช้กลไกการสื่อสารที่เหมาะสม เช่น บริการและผู้ให้บริการเนื้อหา เพื่ออำนวยความสะดวกในการทำงานร่วมกันระหว่างคอมโพเนนต์ที่แชร์
ประสบการณ์ของผู้ใช้
การแจ้งเตือนสำหรับบริการที่ทำงานอยู่เบื้องหน้าที่ปิดได้
ในอุปกรณ์ที่ใช้ Android 13 ขึ้นไป ผู้ใช้จะปิด การแจ้งเตือนที่เชื่อมโยงกับบริการที่ทำงานอยู่เบื้องหน้า ได้โดย ค่าเริ่มต้น
ฟังก์ชันหลัก
นำการติดตั้งใช้งานบริการคำพูดแบบเดิมออกแล้ว
Android 13 นำการติดตั้งใช้งาน SpeechService ซึ่งรวมถึง
Voice IME, RecognitionService
และ API ที่อิงตาม Intent—ออกจาก
แอป Google
ใน Android 12 มีการเปลี่ยนแปลงดังนี้
- ฟังก์ชันการทำงานของ
SpeechServiceได้รับการย้ายไปยังแอป Speech Services by Google ซึ่งกลายเป็นผู้ให้บริการSpeechServiceเริ่มต้น - ฟังก์ชันการทำงานของ
RecognitionServiceได้รับการย้ายไปยังแอป Android System Intelligence เพื่อรองรับการจดจำคำพูดในอุปกรณ์
แอป Google ใช้ Trampoline เพื่อเปลี่ยนเส้นทางการรับส่งข้อมูลไปยังแอป Speech Services by Google เพื่อช่วยรักษาความเข้ากันได้ของแอปใน Android 12 แต่ใน Android 13 ระบบได้นำ Trampoline นี้ออกแล้ว
แอปควรใช้ผู้ให้บริการเริ่มต้นของอุปกรณ์สำหรับ SpeechService แทนที่จะฮาร์ดโค้ดแอปที่เฉพาะเจาะจง