行為變更:以 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 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 對應檔的格式,這會影響直接剖析對應檔的應用程式。如果應用程式依賴 dalvik 對應格式,應用程式開發人員應在搭載 Android 10 以上版本的裝置上測試 /proc/<pid>/maps 格式,並據此剖析。

指定 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 執行階段 (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 吋虛擬裝置,可用於測試程式碼在較大螢幕上的效果。

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