行為變更:以 API 29 以上版本為目標的應用程式

Android 10 包括更新後的系統行為變更,可能會影響您的應用程式。 本頁所列變更僅適用於指定的應用程式 API 29 以上版本。如果應用程式將 targetSdkVersion 設為「29」或 就必須修改應用程式,以便支援這些行為。 視情況而定。

另請務必查看影響所有應用程式的行為變更清單 在 Android 10 中運作

注意: 除了本頁列出的變更外,Android 10 並導入了大量基於隱私權的變更和限制,包括 包括:

  • 限定範圍儲存空間
  • USB 裝置序號存取權
  • 啟用、停用及設定 Wi-Fi
  • 連線 API 的位置存取權

這些變更會影響目標 API 級別 29 以上的應用程式。 加強使用者隱私如要進一步瞭解如何支援這些異動,請參閱 「隱私權變更」頁面。

非 SDK 介面限制更新

為確保應用程式的穩定性和相容性,平台已開始限制應用程式 哪些非 SDK 介面 應用程式可在 Android 9 (API 級別 28) 中使用。Android 10 包含更新後的清單 採用與 Android 開發人員合作的受限制非 SDK 介面 以及最新的內部測試我們的目標是在限制非 SDK 介面之前,確保公開替代方案的可用性。

您無法指定 Android 10 (API 級別 29),其中一些異動 可能無法立即對您造成影響不過,雖然您目前可以使用 非 SDK 介面 (視應用程式的目標 API 級別而定), 使用任何非 SDK 方法或欄位,都有很高的風險 應用程式。

如果不確定應用程式是否使用非 SDK 介面,您可以 測試應用程式 瞭解詳情。如果您的應用程式仰賴非 SDK 介面,則建議您開始規劃 改用 SDK 替代方案我們瞭解有些應用程式 使用非 SDK 介面的有效用途。如果您找不到替代選項 對應用程式中的某個功能使用非 SDK 介面時, 要求新的公用 API

詳情請參閱 Android 10 的非 SDK 介面限制更新內容 ,請參閱「非 SDK 介面的限制」。

共用回憶集錦

Ashmem 已變更 /proc/<pid>/maps 中的 Dalvik 對照表格式,影響直接剖析對照表檔案的應用程式。應用程式開發人員 在執行應用程式的裝置上測試 /proc/<pid>/maps 格式 Android 10 以上版本,並視情況剖析應用程式是否需要 Dalvik 地圖格式。

指定 Android 10 為目標的應用程式無法直接使用 ashmem (/dev/ashmem),請改為透過 NDK 的 ASharedMemory 類別。 此外,應用程式不得直接將 IOCTL 導向現有的 ashmem 檔案描述元 而必須改用 NDK 的 ASharedMemory 類別或 Android Java 用於建立共用記憶體區域的 API。這項變更可提高安全性 提升共用記憶體時的穩定性,改善效能和安全性 Android 的整體成效

已移除應用程式主目錄的執行權限

從可寫入應用程式主目錄中的檔案執行 違反 W^X。 應用程式只能載入嵌入應用程式 APK 檔案中的二進位程式碼。

指定 Android 10 的不信任應用程式無法叫用 execve() 直接寫入應用程式主目錄中的檔案

此外,如果應用程式指定 Android 10 為目標版本,則無法在記憶體中修改以 dlopen() 開啟的檔案內的執行程式碼,並預期這些變更會寫入磁碟,因為該程式庫無法透過可寫檔案描述元加以對應 PROT_EXEC。這包括所有 含有文字重新定位的共用物件 (.so) 檔案。

Android 執行階段只接受系統產生的 OAT 檔案

Android 執行階段 (ART) 不會再從應用程式叫用 dex2oat 上傳資料集之後,您可以運用 AutoML 自動完成部分資料準備工作這代表 ART 只接受符合下列條件的 OAT 檔案: 先產生一個副本

在 ART 中強制執行 AOT 正確性

過去,Android 執行預先 (AOT) 編譯 如果未啟用 classpath 環境,執行階段 (ART) 可能會導致執行階段異常終止 在編譯時間和執行階段中Android 10 以上版本一律要求這些環境內容相同,因此會導致以下行為變更:

  • 自訂類別載入器,也就是由應用程式編寫的類別載入器,與類別不同 來自 dalvik.system 套件的載入器 (尚未經過 AOT 編譯)。這是因為 ART 無法瞭解執行階段的自訂類別查詢實作。
  • 次要 dex 檔案 — 也就是由不在 主要 APK) 是在背景執行 AOT 編譯。這是因為初次使用 編譯所需的成本可能過高,導致不必要的延遲 請注意,如果是應用程式,應採用分割畫面及捨棄次要執行個體 建議使用 dex 檔案
  • Android 中的共用資料庫 (<library> 和 <uses-library>是採用不同的 與舊版平台中使用的類別載入器階層相比。

全螢幕意圖的權限變更

指定 Android 10 以上版本並搭配以下應用程式使用通知的應用程式 全螢幕 意圖必須 這個 USE_FULL_SCREEN_INTENT敬上 所授予的權限。這是正常現象 權限,因此系統 會自動授予提出要求的應用程式。

如果指定 Android 10 以上版本的應用程式嘗試 顯示全螢幕意圖的通知,無需請求必要的 權限後,系統會忽略全螢幕意圖,並輸出下列內容 記錄訊息:

Package your-package-name: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission

支援摺疊式裝置

Android 10 的變更可支援折疊式裝置和大螢幕裝置。

在 Android 10 上執行應用程式時, onResume()onPause() 方法有效 有差異。當多視窗模式同時顯示多個應用程式時,或 多螢幕模式,顯示堆疊中的所有可聚焦主要活動 處於恢復狀態,但只有其中一個,也就是「最已恢復」活動 其實已成為焦點在 Android 10 以下版本中執行時,系統一次只能恢復單一活動,所有其他可見活動都會暫停。

不要混淆「聚焦」例如「最可能恢復播放」活動。系統會指派 決定活動的優先順序 使用者上次互動的活動活動可以是 處於最佳狀態,但沒有聚焦於焦點 (例如當通知欄 已展開)。

在 Android 10 (API 級別 29) 以上版本中,您可以訂閱 onTopResumedActivityChanged() 回呼 在活動獲得或不再最上層恢復時接收通知 位置。這相當於 Android 10 之前的重新啟用狀態,這項功能非常實用 應用程式會用到可能需要的專屬或單例模式資源。 以便與其他應用程式分享

resizeableActivity敬上 資訊清單屬性也已變更。如果應用程式已設定 Android 10 (API 級別 29) 以上版本中的 resizeableActivity=false,可能會進入相容模式 當可用的螢幕大小變更,或應用程式從某個畫面移動到 另一個例子。

應用程式可以使用 android:minAspectRatio敬上 屬性 (針對 Android 10 推出) 來表示畫面 比例

從 3.5 版開始,Android Studio 的模擬器工具 包括 7.3 吋和 8 吋透過虛擬裝置在大螢幕上測試程式碼。

詳情請參閱「設計摺疊式裝置的應用程式」。