行為變更:指定 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 類別存取共用記憶體。此外,應用程式無法將 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 吋虛擬裝置,可讓您在大螢幕上測試程式碼。

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