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

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

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

注意: 除了本頁所列的變更項目外,Android 10 還推出了許多以隱私權為基礎的變更和限制,包括:

  • 限定範圍儲存空間
  • 存取 USB 裝置序號
  • 可啟用、停用及設定 Wi-Fi
  • 連線 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 類別存取共用記憶體。此外,應用程式無法直接對現有的 ashmem 檔案描述元建立 IOCTL,而必須使用 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 Runtime (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 吋虛擬裝置,可用於測試較大螢幕的程式碼。

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