【翻譯】Android Q 行爲變更:以 Android Q 爲目標平臺的應用

Android Q 平臺做了一些行爲變更,這些變更可能會影響您的應用。以下行爲變更僅影響以 Android Q 或更高版本爲目標平臺的應用。如果您的應用將 targetSdkVersion 設爲“android-Q”或更高版本,則應修改您的應用以適當地支持這些行爲(如果適用)。

此外,請務必查看對在 Android Q 上運行的所有應用都有影響的行爲變更列表。

注意:除了此頁面所列的變更以外,Android Q 還引入了大量變更和限制以增強用戶隱私保護。有關詳情,請參閱Google隱私權頁面。

非 SDK 接口的受限情況出現變化

爲了幫助確保應用穩定性和兼容性,Android 平臺開始限制您的應用可在 Android 9(API 級別 28)中使用哪些非 SDK 接口。Android Q 包含更新後的受限非 SDK 接口列表(基於與 Android 開發者之間的協作以及最新的內部測試)。我們的目標是在限制使用非 SDK 接口之前確保有可用的公開替代方案。

如果您不打算以 Android Q 爲目標平臺,那麼其中一些變更可能不會立即對您產生影響。雖然您目前可以使用灰名單中的一些非 SDK 接口(取決於您應用的目標 API 級別),但如果您使用任何非 SDK 方法或字段,則應用無法運行的風險終歸較高。

如果您不確定自己的應用是否使用了非 SDK 接口,則可以測試該應用進行確認。如果您的應用依賴於非 SDK 接口,則應該開始計劃遷移到 SDK 替代方案。不過,我們知道某些應用具有使用非 SDK 接口的有效用例。如果您無法爲應用中的某項功能找到使用非 SDK 接口的替代方案,則應該請求新的公共 API。

有關詳情,請參閱非 SDK 接口在 Android Q 中的受限情況出現變化以及對非 SDK 接口的限制。

共享內存

Ashmem 更改了 /proc/<pid>/maps 中的 dalvik 映射的格式,這會影響那些直接解析映射文件的應用。如果應用依賴於 dalvik 映射格式,則應用開發者應該在設備上測試新的 /proc/<pid>/maps 格式並相應地進行解析。

以 Android Q 爲目標平臺的應用無法再直接使用 ashmem (/dev/ashmem),而必須通過 NDK 的 ASharedMemory 類訪問共享內存。此外,應用無法直接對現有 ashmem 文件描述符進行 IOCTL,而必須改爲使用 NDK 的 ASharedMemory 類或 Android Java API 創建共享內存區域。這項變更可以提高使用共享內存時的安全性和穩健性,從而提高 Android 的整體性能和安全性。

Android 運行時只接受系統生成的 OAT 文件

Android 運行時 (ART) 不再從應用進程調用 dex2oat。這項變更意味着 ART 將僅接受系統生成的 OAT 文件。

在 ART 中強制要求 AOT 正確性

過去,如果編譯時和運行時的類路徑環境不同,則 Android 運行時 (ART) 執行的預先 (AOT) 編譯可能會導致運行時崩潰。Android Q 現在始終要求這些環境上下文相同,因而導致出現了以下行爲變更:

  • 自定義類加載器(即應用編寫的類加載器,與 dalvik.system 軟件包中的類加載器不同)並非由 AOT 編譯。這是因爲 ART 無法在運行時瞭解自定義的類查找實現。
  • 輔助 dex 文件(即由主 APK 外的應用手動加載的 dex 文件)現在由 AOT 在後臺進行編譯,由於首次使用編譯可能代價過高,因此會導致在執行前出現意外的延遲。請注意,對於應用,建議您採用拆分方法,並棄用輔助 dex 文件。
  • Android 中的共享庫(Android 清單中的 <library> 和 <uses-library> 條目)現在具有新的類加載器層次結構。

針對全屏 Intent 的權限變更

以 Android Q 或更高版本爲目標平臺並使用涉及全屏 intent 的通知的應用必須在其應用的清單文件中請求 USE_FULL_SCREEN_INTENT 權限。這是普通權限,因此,系統會自動爲請求權限的應用授予此權限。

如果以 Android Q 或更高版本爲目標平臺的應用試圖創建使用全屏 Intent 的通知,而不請求 USE_FULL_SCREEN_INTENT 權限,則系統會忽略此全屏 Intent 並輸出以下日誌消息:Package [pkg]: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission

支持可摺疊設備

Android Q 包含支持可摺疊設備和大屏設備的變更。

當應用在 Android Q 中運行時,onResume() 和 onPause() 方法的工作原理是不同的。當多個應用同時在多窗口模式或多顯示屏模式下顯示時,可見堆棧中的所有可設置爲焦點的頂層 Activity 都處於“已恢復”狀態,但實際上焦點僅位於其中一個 Activity 上,即“在最頂層處於已恢復狀態”的 Activity。在 Android Q 之前的版本中運行時,一次只能恢復系統中的一個 Activity,而所有其他可見 Activity 都處於已暫停狀態。

請不要將“焦點位於”的 Activity 與“在最頂層處於已恢復狀態”的 Activity 混淆。系統會根據 Z-Order 來爲 Activity 分配優先級,以便爲用戶最後進行互動的 Activity 提供更高的優先級。Activity 可能在頂層處於已恢復狀態,但焦點卻並不位於其上(例如,如果通知欄展開)。

在 Android Q 中,您可以訂閱 onTopResumedActivityChanged() 回調,以便在 Activity 獲取或失去在最頂層處於恢復狀態的位置後收到通知。這相當於 Android Q 之前版本中的已恢復狀態;如果您的應用使用的專用或單一資源可能需要與其他應用共享,則這可以作爲相應提示使用。

resizeableActivity 清單屬性的行爲也發生了變化。如果應用設置了 resizeableActivity=false,但沒有設置固定的屏幕方向或寬高比,則顯示屏尺寸、屏幕方向或屏幕密度的變化會導致此應用調整大小以佔滿整個屏幕。如果應用設置了 resizeableActivity=false,也設置了固定的屏幕方向或寬高比,那麼在顯示屏發生變化後,此應用會顯示黑邊並調整大小以保持相應寬高比。如果 resizableActivity 設爲 true(或根本未設置),則此應用的行爲會保持原樣,並調整大小。

應用可以聲明 1:1 的寬高比,並且可以使用新屬性 android:minAspectRatio。

從版本 3.5 Canary 9 開始,Android Studio 將添加相應功能以支持可摺疊設備。模擬器工具將包含 7.3" 和 8" 的虛擬設備,以用於使用 Android Q 系統鏡像來測試您的代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章