แพลตฟอร์ม Android 13 มีการเปลี่ยนแปลงลักษณะการทำงานที่อาจส่งผลต่อแอปของคุณ การเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้จะมีผลกับแอปทั้งหมดเมื่อทำงานใน Android 13 โดยไม่คำนึงถึง targetSdkVersion คุณควรทดสอบแอปแล้วแก้ไขตามความจำเป็นเพื่อรองรับการเปลี่ยนแปลงเหล่านี้อย่างเหมาะสม (หากมี)
อย่าลืมตรวจสอบรายการการเปลี่ยนแปลงลักษณะการทำงานที่มีผลกับแอปที่กำหนดเป้าหมายเป็น Android 13 เท่านั้นด้วย
ประสิทธิภาพและแบตเตอรี่
ตัวจัดการงาน
ตั้งแต่ Android 13 (ระดับ API 33) เป็นต้นไป ผู้ใช้สามารถทำเวิร์กโฟลว์จากหน้าต่างแจ้งเตือนเพื่อหยุดแอปที่มีบริการที่ทำงานอยู่เบื้องหน้าอย่างต่อเนื่อง ดังที่แสดงในรูปที่ 1 ความสามารถในการจ่ายนี้เรียกว่าตัวจัดการงาน แอปต้องสามารถจัดการการหยุดที่ผู้ใช้เริ่มขึ้นนี้ได้
ปรับปรุงการจัดการงานดึงข้อมูลล่วงหน้าโดยใช้ JobScheduler
JobScheduler ช่วยให้แอปทำเครื่องหมายงานบางอย่างเป็นงาน "ดึงข้อมูลล่วงหน้า" ได้ (โดยใช้ JobInfo.Builder.setPrefetch()) ซึ่งหมายความว่างานดังกล่าวควรทำงานใกล้กับและก่อนการเปิดแอปครั้งถัดไปเพื่อปรับปรุงประสบการณ์ของผู้ใช้
ที่ผ่านมา JobScheduler ใช้สัญญาณเพื่ออนุญาตให้งานการดึงข้อมูลล่วงหน้าใช้ข้อมูลที่ไม่มีค่าใช้จ่ายหรือข้อมูลส่วนเกินตามโอกาสเท่านั้น
ใน Android 13 (ระดับ API 33) ขึ้นไป ระบบจะพยายามระบุเวลาถัดไปที่แอปจะเปิดขึ้น และใช้การประมาณนั้นเพื่อเรียกใช้งานการดึงข้อมูลล่วงหน้า แอปควรพยายามใช้งานการดึงข้อมูลล่วงหน้าสำหรับงานที่ต้องการให้เสร็จก่อนการเปิดแอปครั้งถัดไป
การใช้ทรัพยากรแบตเตอรี่
Android 13 (ระดับ API 33) มีวิธีต่อไปนี้เพื่อให้ระบบจัดการอายุการใช้งานแบตเตอรี่ของอุปกรณ์ได้ดียิ่งขึ้น
- อัปเดตกฎเกี่ยวกับกรณีที่ระบบจะนำแอปของคุณไปไว้ใน Bucket สแตนด์บายแอปที่"ถูกจำกัด"
- ขีดจำกัดใหม่เกี่ยวกับงานที่แอปทำได้เมื่อผู้ใช้นำแอปของคุณไปไว้ในสถานะ"ถูกจำกัด" สำหรับการใช้งานแบตเตอรี่อยู่เบื้องหลัง
ขณะทดสอบแอปกับการเปลี่ยนแปลงเหล่านี้ โปรดตรวจสอบสิ่งต่อไปนี้
ทดสอบว่าแอปของคุณตอบสนองอย่างไรเมื่อระบบนำแอปไปไว้ใน Bucket สแตนด์บายแอปที่"ถูกจำกัด" ใช้คำสั่ง Android Debug Bridge (ADB) ต่อไปนี้เพื่อกำหนดแอปของคุณให้กับที่เก็บข้อมูลนี้
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)
- ที่เก็บข้อมูลสแตนด์บายแอปจะไม่กำหนดจำนวน FCM ลำดับความสำคัญสูงที่แอปใช้ได้อีกต่อไป
- ตอนนี้ระบบจะดาวน์เกรดข้อความที่มีลำดับความสำคัญสูงหากตรวจพบแอปที่ส่งข้อความที่มีลำดับความสำคัญสูงอย่างสม่ำเสมอแต่ไม่ส่งผลให้เกิดการแจ้งเตือน
เช่นเดียวกับ Android เวอร์ชันก่อนหน้า FCM ที่มีลำดับความสำคัญสูงซึ่งเกินโควต้าจะถูกดาวน์เกรดเป็นลำดับความสำคัญปกติ เมื่อเริ่มบริการที่ทำงานอยู่เบื้องหน้า (FGS) เพื่อตอบสนองต่อ FCM เราขอแนะนำให้ตรวจสอบผลลัพธ์ของ RemoteMessage.getPriority() และยืนยันว่าเป็น PRIORITY_HIGH และ/หรือจัดการข้อยกเว้น ForegroundServiceStartNotAllowedException ที่อาจเกิดขึ้น
หากแอปพลิเคชันของคุณไม่ได้โพสต์การแจ้งเตือนเพื่อตอบสนองต่อ FCM ที่มีลำดับความสำคัญสูงเสมอไป เราขอแนะนำให้คุณเปลี่ยนลำดับความสำคัญของ FCM เหล่านี้เป็นปกติ เพื่อไม่ให้ข้อความที่ส่งผลให้เกิดการแจ้งเตือนถูกดาวน์เกรด
ความเป็นส่วนตัว
สิทธิ์รันไทม์สำหรับการแจ้งเตือน
Android 13 (API ระดับ 33) เปิดตัวสิทธิ์การแจ้งเตือนรันไทม์:
POST_NOTIFICATIONS
การเปลี่ยนแปลงนี้ช่วยให้ผู้ใช้มุ่งเน้นไปที่การแจ้งเตือนที่สำคัญที่สุดสำหรับตนเอง
เราขอแนะนำอย่างยิ่งให้คุณกำหนดเป้าหมายเป็น Android 13 ขึ้นไปโดยเร็วที่สุดเพื่อให้ได้รับประโยชน์จากการควบคุมและความยืดหยุ่นเพิ่มเติมของฟีเจอร์นี้
ดูข้อมูลเพิ่มเติมเกี่ยวกับแนวทางปฏิบัติแนะนำสำหรับสิทธิ์ของแอป
ซ่อนเนื้อหาที่ละเอียดอ่อนจากคลิปบอร์ด
หากแอปอนุญาตให้ผู้ใช้คัดลอกเนื้อหาที่ละเอียดอ่อน เช่น รหัสผ่านหรือข้อมูลบัตรเครดิตไปยังคลิปบอร์ด คุณต้องเพิ่ม Flag ลงใน 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 แอปที่อัปเดตแล้วจะยังคงใช้รหัสผู้ใช้ที่แชร์ที่มีอยู่
รหัสผู้ใช้ที่แชร์ทำให้เกิดลักษณะการทำงานที่ไม่แน่นอนภายในเครื่องมือจัดการแพ็กเกจ แอปของคุณควรใช้กลไกการสื่อสารที่เหมาะสมแทน เช่น บริการและ Content Provider เพื่ออำนวยความสะดวกในการทำงานร่วมกันระหว่างคอมโพเนนต์ที่ใช้ร่วมกัน
ประสบการณ์ของผู้ใช้
การแจ้งเตือนบริการที่ทำงานอยู่เบื้องหน้าที่ปิดได้
ในอุปกรณ์ที่ใช้ Android 13 ขึ้นไป ผู้ใช้สามารถปิดการแจ้งเตือนที่เชื่อมโยงกับบริการที่ทำงานอยู่เบื้องหน้าได้โดยค่าเริ่มต้น
ฟังก์ชันหลัก
นำสำเนาเดิมของการติดตั้งใช้งานบริการเสียงพูดออกแล้ว
Android 13 จะนำการติดตั้งใช้งาน SpeechService ออกจากแอป Google ซึ่งรวมถึง Voice IME, RecognitionService และ API ที่อิงตาม Intent
ใน Android 12 มีการเปลี่ยนแปลงต่อไปนี้เกิดขึ้น
- ฟังก์ชันการทำงานของ
SpeechServiceได้ย้ายข้อมูลไปยังแอป Speech Services by Google ซึ่งกลายเป็นผู้ให้บริการSpeechServiceเริ่มต้น - เราได้ย้ายฟังก์ชันการทำงานของ
RecognitionServiceไปยังแอป Android System Intelligence เพื่อรองรับการจดจำคำพูดในอุปกรณ์
เพื่อช่วยรักษาความเข้ากันได้ของแอปใน Android 12 แอป Google จะใช้แทรมโพลีนเพื่อเปลี่ยนเส้นทางการเข้าชมไปยังแอป Speech Services by Google โดยใน Android 13 ระบบจะนำแทรมโพลีนนี้ออก
แอปควรใช้ผู้ให้บริการเริ่มต้นของอุปกรณ์สำหรับ SpeechService แทนที่จะฮาร์ดโค้ดแอปที่เฉพาะเจาะจง