Android 15 平台包含可能對應用程式造成影響的行為變更。無論 targetSdkVersion 為何,當應用程式在 Android 15 上執行時,下列行為變更將會套用至所有應用程式。您應測試應用程式,並視需要修改,以便在適當情況下支援新版本功能。
另請務必查看僅對指定 Android 15 為目標版本的應用程式造成影響的行為變更。
核心功能
Android 15 修改或擴充了 Android 系統的各種核心功能。
套件停止狀態的變更
套件 FLAG_STOPPED 狀態的意圖 (使用者可以透過長按應用程式圖示並選取「強制停止」來啟用 AOSP 版本) 一向是讓應用程式維持在這個狀態,直到使用者透過直接啟動應用程式或間接與應用程式互動 (透過分享畫面或小工具,將應用程式選做動態桌布等) 明確將應用程式移除為止。在 Android 15 中,我們已更新系統行為,以符合這項預期行為。應用程式應僅透過直接或間接的使用者操作,從停止狀態移除。
為了支援預期的行為,除了現有的限制之外,當應用程式在執行 Android 15 的裝置上進入已停止狀態時,系統也會取消所有待處理意圖。當使用者的動作將應用程式從已停止狀態移除時,系統會將 ACTION_BOOT_COMPLETED 廣播傳送至應用程式,讓應用程式有機會重新註冊任何待處理的意圖。
您可以呼叫新的 ApplicationStartInfo.wasForceStopped() 方法,確認應用程式是否已進入停止狀態。
支援 16 KB 分頁大小
過去 Android 僅支援 4 KB 的記憶體分頁大小,這已針對 Android 裝置通常擁有的平均總記憶體量,最佳化系統記憶體效能。從 Android 15 開始,AOSP 支援設定為使用 16 KB 頁面大小的裝置 (16 KB 裝置)。如果應用程式使用任何 NDK 程式庫 (直接或透過 SDK 間接使用),您必須重建應用程式,才能在這些 16 KB 裝置上運作。
隨著裝置製造商持續打造實體記憶體 (RAM) 容量更大的裝置,許多裝置將採用 16 KB (最終會更大) 的分頁大小,以最佳化裝置效能。為 16 KB 頁面大小的裝置新增支援功能,可讓應用程式在這些裝置上執行,並享有相關的效能提升優勢。如果沒有重新編譯,應用程式就無法在日後的 Android 版本中,於 16 KB 裝置上運作。
為協助您為應用程式新增支援功能,我們提供了相關指南,說明如何檢查應用程式是否受到影響、如何重建應用程式 (如適用),以及如何使用模擬器 (包括 Android Emulator 的 Android 15 系統映像檔),在 16 KB 環境中測試應用程式。
優點和效能提升
以 16 KB 頁面大小設定的裝置平均會耗用較多記憶體,但系統和應用程式也能獲得各種效能改善:
- 系統面臨記憶體壓力時,應用程式啟動時間越短:平均低 3.16%,部分受測的應用程式還大幅改善 (最多提升 30%)
- 應用程式啟動期間的耗電量降幅:平均減少 4.56%
- 相機啟動速度更快:熱啟動速度平均快了 4.48%,冷啟動速度平均快了 6.60%
- 縮短系統啟動時間:縮短 8% (平均約 950 毫秒)
這些改善項目是根據初步測試結果而來,實際裝置上的結果可能會有所不同。我們會在持續測試的過程中,針對應用程式可能獲得的效益提供額外分析。
確認應用程式是否受到影響
如果應用程式使用任何原生程式碼,請重新建構應用程式,支援 16 KB 裝置。如果您不確定應用程式是否使用原生程式碼,可以使用 APK 分析工具找出是否有任何原生程式碼,然後檢查找到的任何共用程式庫的 ELF 區段是否對齊。Android Studio 也提供相關功能,可協助您自動偵測對齊問題。
如果應用程式只使用以 Java 程式設計語言或 Kotlin 編寫的程式碼 (包括所有程式庫或 SDK),則應用程式已可支援 16 KB 裝置。不過,我們建議您在 16 KB 環境中測試應用程式,確認應用程式行為沒有發生非預期的迴歸。
部分應用程式必須進行變更,才能支援私人空間
私密空间是 Android 15 中推出的一项新功能,可让用户在设备上创建一个单独的空间,在额外的身份验证层保护下,防止敏感应用遭到窥探。由于私密空间中的应用具有受限的公开范围,因此某些类型的应用需要执行额外的步骤,才能查看和与用户私密空间中的应用互动。
所有应用
由于私密空间中的应用会保存在单独的用户资料中(类似于工作资料),因此应用不应假定其任何未位于主资料中的已安装副本都位于工作资料中。如果您的应用包含与工作资料应用相关的逻辑,并且做出了上述假设,则需要调整此逻辑。
医疗应用
当用户锁定私密空间时,私密空间中的所有应用都会停止运行,并且这些应用无法执行前台或后台活动,包括显示通知。此行为可能会严重影响安装在私密空间中的医疗应用的使用和功能。
私密空间设置体验会向用户发出警告,告知私密空间不适合需要执行关键前台或后台活动的应用,例如显示医疗应用发送的通知。不过,应用无法确定自己是否在私密空间中使用,因此无法在这种情况下向用户显示警告。
因此,如果您开发的是医疗应用,请检查此功能可能会对您的应用产生哪些影响,并采取适当的措施(例如告知用户不要在私密空间中安装您的应用),以免中断关键的应用功能。
启动器应用
如果您开发的是启动器应用,则必须执行以下操作,才能看到私密空间中的应用:
- 您的应用必须被指定为设备的默认启动器应用,即具有
ROLE_HOME角色。 - 您的应用必须在应用的清单文件中声明
ACCESS_HIDDEN_PROFILES普通权限。
声明 ACCESS_HIDDEN_PROFILES 权限的启动器应用必须处理以下私密空间用例:
- 您的应用必须为安装在私密空间中的应用提供单独的启动器容器。使用
getLauncherUserInfo()方法确定要处理的用户个人资料类型。 - 用户必须能够隐藏和显示私密空间容器。
- 用户必须能够锁定和解锁私密空间容器。使用
requestQuietModeEnabled()方法锁定(通过传递true)或解锁(通过传递false)私密空间。 在锁定状态下,私密空间容器中的任何应用都应不可见,也无法通过搜索等机制被发现。您的应用应为
ACTION_PROFILE_AVAILABLE和ACTION_PROFILE_UNAVAILABLE广播注册接收器,并在私密空间容器的锁定或解锁状态发生变化时更新应用中的界面。这两种状态的广播都包含EXTRA_USER,您的应用可以使用该常量来引用不公开个人资料的用户。您还可以使用
isQuietModeEnabled()方法检查私密空间个人资料是否已锁定。
应用商店应用
私密空间包含一个“安装应用”按钮,用于启动隐式 intent 以将应用安装到用户的私密空间。为了让应用能够接收此隐式 intent,请在应用的清单文件中声明一个 <intent-filter>,并将 <category> 设为 CATEGORY_APP_MARKET。
移除以 PNG 為基礎的表情符號字型
我们移除了基于 PNG 的旧版表情符号字体文件 (NotoColorEmojiLegacy.ttf),只保留了基于矢量的文件。从 Android 13(API 级别 33)开始,系统表情符号渲染程序使用的表情符号字体文件已从基于 PNG 的文件更改为基于矢量的文件。出于兼容性原因,系统在 Android 13 和 14 中保留了旧版字体文件,以便具有自己的字体渲染程序的应用在能够升级之前继续使用旧版字体文件。
如需检查您的应用是否受到影响,请在应用的代码中搜索对 NotoColorEmojiLegacy.ttf 文件的引用。
您可以通过多种方式自适应应用:
- 使用平台 API 进行文本渲染。您可以将文本渲染到基于位图的
Canvas,并在必要时使用该Canvas获取原始图片。 - 为您的应用添加 COLRv1 字体支持。FreeType 开源库在 2.13.0 版及更高版本中支持 COLRv1。
- 作为最后的手段,您可以将旧版表情符号字体文件 (
NotoColorEmoji.ttf) 捆绑到 APK 中,但在这种情况下,您的应用将缺少最新的表情符号更新。如需了解详情,请参阅 Noto Emoji GitHub 项目页面。
目標 SDK 最低版本從 23 提高至 24
Android 15 採用
Android 14 所做的變更,並將這項做法
在 Android 15 中,
24 以下版本的 targetSdkVersion 無法安裝。
要求應用程式符合現代 API 級別,有助於提供更完善的安全防護和
隱私權。
為了規避 Android 較新版本的安全性和隱私權保護措施,惡意軟體通常會鎖定較低的 API 級別。例如:
部分惡意軟體應用程式會使用 22 的 targetSdkVersion,以免受到
Android 6.0 Marshmallow (API) 在 2015 年推出的執行階段權限模型
第 23 級)。這項 Android 15 變更會讓惡意軟體更難躲過更嚴謹的安全性和隱私權措施。嘗試安裝以較低 API 為目標的應用程式
level 會導致安裝失敗,並顯示以下訊息:
出現在 Logcat 中:
INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 24, but found 7
在升級至 Android 15 的裝置上,targetSdkVersion 較低的所有應用程式
仍未解除安裝。
如要測試以舊版 API 級別為目標的應用程式,請使用下列 ADB 指令:
adb install --bypass-low-target-sdk-block FILENAME.apk
安全性和隱私權
Android 15 引入了强大的措施来防范动态密码 (OTP) 欺诈并保护用户的敏感内容,重点是增强通知监听器服务和屏幕共享保护措施。主要增强功能包括从可供不可信应用访问的通知中隐去 OTP、在屏幕共享期间隐藏通知,以及在发布 OTP 时保护应用 activity。这些变更旨在保护用户的敏感内容,使其免受未经授权的操作者的侵害。
开发者需要注意以下事项,以确保其应用与 Android 15 中的变更兼容:
动态密码隐去
Android 会阻止实现 NotificationListenerService 的不受信任应用读取已检测到 OTP 的通知中的未隐去的内容。配套设备管理器关联等受信任应用不受这些限制。
屏幕共享保护
- 在屏幕共享会话期间,系统会隐藏通知内容,以保护用户的隐私。如果应用实现了
setPublicVersion(),Android 会显示通知的公开版本,该版本在不安全情境中用作替换通知。否则,系统会隐去通知内容,不提供任何其他背景信息。 - 系统会向远程观看者隐藏密码输入等敏感内容,以防止泄露用户的敏感信息。
- 如果在屏幕共享期间检测到动态密码,系统会隐藏在该时间段内发布通知的应用的活动。应用内容在启动时会向远程查看器隐藏。
- 除了 Android 自动识别敏感字段之外,开发者还可以使用
setContentSensitivity手动将应用的部分标记为敏感,在屏幕共享期间,这些敏感字段会对远程观看者隐藏。 - 开发者可以选择切换开发者选项下的停用屏幕共享防护选项,以便出于演示或测试目的豁免屏幕共享防护。默认的系统屏幕录制工具不受这些更改的影响,因为录制内容会保留在设备上。
相機和媒體
Android 15 對所有應用程式的相機和媒體行為進行下列變更。
如果達到資源限制,直接和卸載音訊播放作業會使先前開啟的直接或卸載音軌失效
在 Android 15 之前,如果某个应用在另一个应用播放音频且达到资源限制时请求直接或分流音频播放,该应用将无法打开新的 AudioTrack。
从 Android 15 开始,当应用请求直接播放或分流播放且达到资源限制时,系统会使任何当前打开的 AudioTrack 对象失效,以防止执行新轨道请求。
(直接音轨和分流音轨通常会打开,以播放压缩音频格式。播放直接音频的常见用例包括通过 HDMI 将编码的音频流式传输到电视。分流轨道通常用于在具有硬件 DSP 加速的移动设备上播放压缩音频。)
使用者體驗和系統 UI
Android 15 包含一些變更,旨在打造更一致、直覺的使用者體驗。
為已選擇加入的應用程式啟用預測返回動畫
從 Android 15 開始,預測返回動畫的開發人員選項已遭移除。對於已全面或在活動層級啟用預測返回手勢功能的應用程式,現在會顯示返回首頁、跨工作和跨活動等系統動畫。如果您的應用程式受到影響,請採取下列行動:
- 請確認應用程式已正確遷移,可使用預測返回手勢。
- 確保片段轉場效果可與預測返回導覽功能搭配運作。
- 請移除動畫和架構轉場效果,改用動畫器和 androidx 轉場效果。
- 從
FragmentManager不瞭解的返回堆疊中移除。請改用由FragmentManager或 Navigation 元件管理的返回堆疊。
使用者強制停止應用程式時,小工具會停用
如果使用者在搭載 Android 15 的裝置上強制停止應用程式,系統會暫時停用所有應用程式小工具。小工具會顯示為灰色,使用者無法與其互動。這是因為從 Android 15 開始,系統會在應用程式強制停止時取消所有應用程式的待處理意圖。
系統會在使用者下次啟動應用程式時,重新啟用這些小工具。
詳情請參閱「套件停止狀態的變更」。
媒體投影狀態列晶片會提醒使用者分享螢幕畫面、投放及錄製畫面
螢幕投影漏洞會洩漏使用者的私人資料,例如財務資訊,因為使用者不會察覺自己的裝置螢幕正在分享。
如果應用程式在搭載 Android 15 QPR1 以上版本的裝置上執行,狀態列的方塊會以大而醒目的方式,提醒使用者任何進行中的螢幕投影作業。使用者可以輕觸方塊,停止分享、投放或錄製螢幕畫面。此外,裝置螢幕鎖定時,螢幕投放功能也會自動停止。
確認應用程式是否受到影響
根據預設,應用程式會包含狀態列方塊,並在螢幕鎖定畫面啟用時自動暫停投放螢幕畫面。
如要進一步瞭解如何針對這些用途測試應用程式,請參閱「狀態列方塊和自動停止」。
背景網路存取權限制
在 Android 15 中,如果应用在有效的进程生命周期之外启动网络请求,则会收到异常。通常是 UnknownHostException 或其他与套接字相关的 IOException。在有效生命周期之外发生的网络请求通常是因为应用在不再活跃后,不知不觉地继续发出网络请求。
为缓解此异常,请使用生命周期感知型组件,确保您的网络请求具有生命周期感知功能,并在离开有效的进程生命周期时取消。如果您非常重视即使用户离开应用也要发出网络请求,请考虑使用 WorkManager 调度网络请求,或使用前台服务继续执行对用户可见的任务。
淘汰項目
每次發布新版本時,特定 Android API 可能會過時,或需要重構,才能提供更優質的開發人員體驗或支援新的平台功能。在這種情況下,我們會正式淘汰舊版 API,並引導開發人員改用其他 API。
淘汰表示我們已終止對 API 的官方支援,但開發人員仍可繼續使用。如要進一步瞭解 Android 這個版本的重要淘汰項目,請參閱淘汰項目頁面。