行為變更:指定 API 29 以上級別的應用程式

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

此外,請務必查看影響所有在 Android 10 中執行的應用程式的行為變更清單。

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

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

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

非 SDK 介面限制更新

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

如果您並不是指定 Android 10 (API 級別 29),則此處所述的某些變更可能不會立即對您造成影響。不過,雖然您目前可以使用某些非 SDK 介面 (視應用程式的目標 API 級別而定),但使用任何非 SDK 方法或欄位時,都會面臨應用程式中斷的高風險。

如果不確定應用程式是否使用非 SDK 介面,可測試應用程式以便確認。如果您的應用程式仰賴非 SDK 介面,則建議您開始規劃遷移至 SDK 替代方案。我們瞭解有些應用程式可使用非 SDK 介面運作。如果您除了為應用程式中的某個功能使用非 SDK 介面外,已別無他法,則應要求新的公用 API

詳情請參閱「Android 10 的非 SDK 介面限制更新」和「非 SDK 介面的相關限制」。

共用回憶集錦

Ashmem 已變更 /proc/<pid>/maps 中的 dalvik 地圖格式,並影響直接剖析地圖檔案的應用程式。應用程式開發人員應在搭載 Android 10 以上版本的裝置上測試 /proc/<pid>/maps 格式,並在應用程式依附於 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。這項變更表示 ART 只會接受系統產生的 OAT 檔案。

在 ART 中強制 AOT 正確性

過去,如果類別路徑環境在編譯時間和執行階段中不相同,Android 執行階段 (ART) 執行的預先 (AOT) 編譯作業可能會導致執行階段異常終止。Android 10 以上版本要求這些環境結構定義必須相同,因此行為有下列異動:

  • dalvik.system 套件的類別載入器不同,自訂類別載入器 (也就是應用程式編寫的類別載入器) 不會經過 AOT 編譯。這是因為 ART 無法在執行階段得知自訂類別查詢實作。
  • 次要 dex 檔案 (即非主要 APK 中的應用程式手動載入的 dex 檔案) 會在背景進行 AOT 編譯。這是因為首次使用編譯的費用可能太高,導致執行前產生不必要的延遲。請注意,對於應用程式,建議採用分割並移出次要 DEX 檔案。
  • Android 中的共用資料庫 (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 之前的版本中執行時,一次只能重新啟用系統中的一個活動,而所有其他可見活動都會暫停。

不要將「對焦」與「最常重新啟用」活動混為一談。系統會按照 Z 順序為活動指派優先順序,以較高優先順序對使用者上次互動的活動。活動可以由頂部恢復,但沒有焦點 (例如,在展開通知欄時)。

在 Android 10 (API 級別 29) 以上版本中,您可以訂閱 onTopResumedActivityChanged() 回呼,這樣就能在活動取得或遺失最頂端重新啟用的位置時收到通知。這相當於 Android 10 之前的重新啟用狀態,如果應用程式使用可能需要與其他應用程式共用的專屬或單例模式資源,這項資訊就相當實用。

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

應用程式可以使用 Android 10 中推出的 android:minAspectRatio 屬性指出應用程式支援的螢幕比例

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

詳情請參閱設計折疊式裝置的應用程式一文。