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

แพลตฟอร์ม Android 14 มีการเปลี่ยนแปลงลักษณะการทำงานที่อาจส่งผลต่อแอปของคุณ การเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้มีผลกับแอปทั้งหมดเมื่อทำงานบน Android 14 ไม่ว่าจะtargetSdkVersion คุณควรทดสอบแอปแล้วแก้ไขตามความจำเป็นเพื่อรองรับฟีเจอร์เหล่านี้อย่างเหมาะสม หากมี

นอกจากนี้ อย่าลืมตรวจสอบรายการการเปลี่ยนแปลงลักษณะการทำงานที่มีผลต่อแอปที่กำหนดเป้าหมายเป็น Android 14 เท่านั้น

ฟังก์ชันหลัก

ระบบจะปฏิเสธการตั้งเวลาปลุกในเวลาที่แน่นอนโดยค่าเริ่มต้น

精确的闹钟适用于用户指定的通知,或是在确切时间需要执行的操作。从 Android 14 开始,系统不再向以 Android 13 及更高版本为目标平台的大多数新安装应用预先授予 SCHEDULE_EXACT_ALARM 权限,该权限默认处于拒绝状态。

详细了解安排精确闹钟的权限变化

การออกอากาศที่ลงทะเบียนตามบริบทจะอยู่ในคิวขณะแคชแอป

ใน Android 14 ระบบจะดำเนินการต่อไปนี้ได้ วางการออกอากาศที่ลงทะเบียนตามบริบทไว้ในคิวขณะที่แอป อยู่ในสถานะแคช ส่วนนี้คล้ายกับการจัดคิว ลักษณะการทำงานที่ Android 12 (API ระดับ 31) นำมาใช้กับ Binder ที่ไม่พร้อมกัน ธุรกรรม การออกอากาศที่ประกาศในไฟล์ Manifest ไม่ได้อยู่ในคิวและจะนำแอปออก จากสถานะแคชสำหรับส่งการออกอากาศ

เมื่อแอปออกจากสถานะที่แคชไว้ เช่น การกลับไปยังเบื้องหน้า ระบบจะส่งการออกอากาศที่อยู่ในคิว การออกอากาศบางรายการแต่ละครั้ง อาจรวมกันเป็นการออกอากาศเดียว ขึ้นอยู่กับปัจจัยอื่นๆ เช่น ระบบ ประสิทธิภาพการทำงาน แอปอาจถูกนำออกจากสถานะแคชและแอปทั้งหมดที่อยู่ในคิวก่อนหน้านี้ ส่งการบรอดแคสต์ข้อความแล้ว

แอปจะยุติได้เฉพาะกระบวนการเบื้องหลังของตนเอง

ตั้งแต่ Android 14 เมื่อแอปเรียกใช้ killBackgroundProcesses() API จะยุติเฉพาะกระบวนการเบื้องหลังของแอปของคุณเองเท่านั้น

หากคุณส่งชื่อแพ็กเกจของแอปอื่น เมธอดนี้จะไม่มีผลกับกระบวนการเบื้องหลังของแอปนั้น และข้อความต่อไปนี้จะปรากฏใน Logcat

Invalid packageName: com.example.anotherapp

แอปของคุณไม่ควรใช้ killBackgroundProcesses() API หรือพยายามที่จะส่งผลต่อวงจรกระบวนการของแอปอื่นๆ แม้ว่าจะใช้ในระบบปฏิบัติการเวอร์ชันเก่าก็ตาม Android ออกแบบมาให้เก็บแอปที่แคชไว้ไว้ในเบื้องหลังและปิดแอปเหล่านั้นโดยอัตโนมัติเมื่อระบบต้องการหน่วยความจำ หากแอปของคุณปิดแอปอื่นๆ โดยไม่จำเป็น อาจทำให้ประสิทธิภาพของระบบลดลงและทำให้แบตเตอรี่หมดเร็วขึ้นเนื่องจากต้องรีสตาร์ทแอปเหล่านั้นอย่างเต็มรูปแบบในภายหลัง ซึ่งต้องใช้ทรัพยากรมากกว่าการกลับมาทำงานของแอปที่แคชไว้อยู่แล้ว

ระบบตั้งค่า MTU เป็น 517 สำหรับไคลเอ็นต์ GATT แรกที่ขอ MTU

从 Android 14 开始,Android 蓝牙堆栈会更严格地遵循蓝牙核心规范 5.2 版,当第一个 GATT 客户端使用 BluetoothGatt#requestMtu(int) API 请求 MTU 时,会请求将 BLE ATT MTU 设置为 517 个字节,并忽略针对该 ACL 连接的所有后续 MTU 请求。

如需解决此变更并提高应用的稳健性,请考虑以下选项:

  • 您的外围设备应使用可由外围设备适应的合理值来响应 Android 设备的 MTU 请求。最终商定的值将为 Android 请求的值和远程提供的值(例如 min(517, remoteMtu))中的最小值
    • 实现此修复可能需要更新外围设备的固件
  • 或者,根据外围设备的已知受支持值与接收到的 MTU 变化之间的最小值限制 GATT 特征写入
    • 温馨提示:您应该在支持的标头大小的基础上减少 5 个字节
    • 例如:arrayMaxLength = min(SUPPORTED_MTU, GATT_MAX_ATTR_LEN(517)) - 5

เหตุผลใหม่ที่แอปอาจถูกจัดให้อยู่ในที่เก็บข้อมูลสแตนด์บายที่ถูกจำกัด

Android 14 引入了将应用放入“受限待机”分桶的新原因。由于 onStartJobonStopJobonBind 方法超时,应用的作业会多次触发 ANR 错误。(如需了解对 onStartJobonStopJob 的更改,请参阅 JobScheduler 增强回调和网络行为。)

如需跟踪应用是否已进入“受限待机”分桶,我们建议您在作业执行时使用 API UsageStatsManager.getAppStandbyBucket() 进行日志记录,或者在应用启动时使用 UsageStatsManager.queryEventsForSelf() 进行日志记录。

mlock จํากัดไว้ที่ 64 KB

在 Android 14(API 级别 34)及更高版本中,平台将可使用 mlock() 锁定的最大内存减少为每个进程 64 KB。在以前的版本中,每个进程的大小上限为 64 MB。此限制可促进跨应用和系统更好地管理内存。为了提高各设备之间的一致性,Android 14 针对兼容设备上的新 mlock() 限制添加了新的 CTS 测试

ระบบบังคับใช้การใช้ทรัพยากรของแอปที่แคชไว้

从设计上讲,当应用的进程移至后台且没有任何其他应用进程组件在运行时,应用进程将处于缓存状态。此类应用进程可能会因系统内存压力而终止。在此状态下,Activity 实例在调用并返回 onStop() 方法后执行的任何工作均不可靠,强烈建议不要这样做。

Android 14 对此设计引入了一致性和强制执行要求。在应用进程进入缓存状态后不久,系统会禁止后台工作,直到进程组件重新进入生命周期的活跃状态。

使用框架支持的典型生命周期 API(例如服务JobSchedulerJetpack WorkManager)的应用应该不受这些变化的影响。

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

การเปลี่ยนแปลงประสบการณ์ของผู้ใช้เกี่ยวกับการแจ้งเตือนที่ปิดไม่ได้

หากแอปแสดงการแจ้งเตือนที่ไม่สามารถปิดได้ในเบื้องหน้าต่อผู้ใช้ Android 14 ได้เปลี่ยนแปลงลักษณะการทํางานเพื่อให้ผู้ใช้ปิดการแจ้งเตือนดังกล่าวได้

การเปลี่ยนแปลงนี้มีผลกับแอปที่ป้องกันไม่ให้ผู้ใช้ปิดการแจ้งเตือนที่แสดงอยู่เบื้องหน้าโดยการตั้งค่า Notification.FLAG_ONGOING_EVENT ผ่าน Notification.Builder#setOngoing(true) หรือ NotificationCompat.Builder#setOngoing(true) ลักษณะการทำงานของ FLAG_ONGOING_EVENT ได้ทำการเปลี่ยนแปลงเพื่อแสดงการแจ้งเตือนดังกล่าวจริงๆ โดยผู้ใช้ปิดได้

คุณจะยังคงปิดการแจ้งเตือนประเภทนี้ไม่ได้ในกรณีต่อไปนี้ เงื่อนไข:

  • เมื่อโทรศัพท์ล็อกอยู่
  • หากผู้ใช้เลือกการดำเนินการแจ้งเตือนล้างทั้งหมด (ซึ่งช่วย การปิดโดยไม่ตั้งใจ)

นอกจากนี้ ลักษณะการทำงานแบบใหม่นี้จะไม่มีผลกับการแจ้งเตือนใน กรณีการใช้งานต่อไปนี้

  • การแจ้งเตือน CallStyle รายการ
  • เครื่องมือควบคุมนโยบายด้านอุปกรณ์ (DPC) และแพ็กเกจสนับสนุนสำหรับองค์กร
  • การแจ้งเตือนสื่อ
  • แพ็กเกจตัวเลือกการค้นหาเริ่มต้น

แสดงข้อมูลความปลอดภัยของข้อมูลได้ดีกว่า

为了加强用户隐私保护,Android 14 增加了系统显示您在 Play 管理中心表单中声明的信息的位置数量。目前,用户可以在 Google Play 中的应用详情的数据安全部分查看此信息。

我们建议您查看应用的位置数据分享政策,并花一点时间对应用的 Google Play“数据安全”部分进行任何适用的更新。

如需了解详情,请参阅有关如何在 Android 14 上以更显眼的方式显示数据安全信息的指南。

การช่วยเหลือพิเศษ

การปรับขนาดแบบอักษรที่ไม่ใช่แบบเชิงเส้นเป็น 200%

从 Android 14 开始,系统支持字体放大高达 200%,为弱视用户提供了符合网络内容无障碍指南 (WCAG) 的其他无障碍功能选项。

如果您已使用放大像素 (sp) 单位来定义文本大小,这项更改可能不会对您的应用产生太大影响。不过,您应在启用最大字号 (200%) 的情况下执行界面测试,确保应用能够在不影响易用性的情况下适应较大的字号。

ความปลอดภัย

ระดับ API เป้าหมายที่ติดตั้งได้ขั้นต่ำ

ตั้งแต่ Android 14 เป็นต้นไป แอปที่มี targetSdkVersion ต่ำกว่า 23 จะติดตั้งไม่ได้ การกำหนดให้แอปต้องใช้ระดับ API เป้าหมายขั้นต่ำเหล่านี้ ช่วยเพิ่มความปลอดภัยและความเป็นส่วนตัวให้ผู้ใช้

มัลแวร์มักกำหนดเป้าหมายเป็น API ระดับเก่าเพื่อหลีกเลี่ยงความปลอดภัยและความเป็นส่วนตัว ที่เกิดขึ้นใน Android เวอร์ชันใหม่ ตัวอย่างเช่น แอปมัลแวร์บางแอปใช้ targetSdkVersion เป็น 22 เพื่อหลีกเลี่ยง Android 6.0 Marshmallow (API) เปิดตัวโมเดลสิทธิ์รันไทม์ในปี 2015 ระดับ 23) การเปลี่ยนแปลงนี้ใน Android 14 ทำให้มัลแวร์หลบเลี่ยงการปรับปรุงด้านความปลอดภัยและความเป็นส่วนตัวได้ยากขึ้น การพยายามติดตั้งแอปที่กำหนดเป้าหมายเป็น API ระดับต่ำกว่าจะทำให้การติดตั้งไม่สำเร็จ โดยมีข้อความต่อไปนี้ปรากฏใน Logcat

INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 7

ในอุปกรณ์ที่อัปเกรดเป็น Android 14 แอปที่มี targetSdkVersion ต่ำกว่า มากกว่า 23 รายการจะยังคงติดตั้งต่อไป

หากต้องการทดสอบแอปที่กำหนดเป้าหมายเป็น API ระดับเก่า ให้ใช้คำสั่ง ADB ต่อไปนี้

adb install --bypass-low-target-sdk-block FILENAME.apk

ชื่อแพ็กเกจของเจ้าของสื่ออาจถูกปกปิด

媒体库支持查询 OWNER_PACKAGE_NAME 列,该列表示存储特定媒体文件的应用。从 Android 14 开始,除非满足以下条件之一,否则系统会隐去此值:

  • 存储媒体文件的应用有一个软件包名称始终对其他应用可见。
  • 查询媒体库的应用会请求 QUERY_ALL_PACKAGES 权限。

详细了解 Android 如何出于隐私保护目的而过滤软件包可见性