Android 8.0 行為變更

除了新功能外,Android 8.0 (API 級別 26) 包括各種系統和 API 行為變更。這份文件 重點列出您必須瞭解並納入考量的幾項重要異動 。

無論 自家產品鎖定的 Android 系統不過,有些變更只會影響指定應用程式 Android 8.0。為了盡可能清楚起見 頁面分為兩個部分:所有應用程式的變更應用程式指定目標變更 Android 8.0

針對所有應用程式的變更

這些行為變更會套用至所有應用程式 在 Android 8.0 (API 級別 26) 平台上執行 您指定的 API 級別所有開發人員都應審查 配合這些異動及修改應用程式,以妥善支援這些變動。 「Google Play 遊戲」和「Google Play 遊戲」 (在適用情況下提供)

背景執行限制

Android 8.0 (API 級別 26) 為 延長電池續航力。當您的應用程式進入 快取 狀態,不含任何有效 元件 系統會釋放應用程式保留的所有 Wake Lock。

此外,為提升裝置效能,系統限制 未在前景執行的應用程式行為。具體違規事項如下:

  • 在背景執行的應用程式現在的自由度受到限制 也能存取背景服務
  • 應用程式無法使用資訊清單來註冊大部分隱含的廣播訊息 (即未明確針對應用程式指定的廣播)。

根據預設,這些限制只會套用到指定 O 的應用程式。不過 使用者可以在「設定」畫面中,為任何應用程式啟用這些限制。 即使應用程式未指定 O。

Android 8.0 (API 級別 26) 也針對特定方法進行了下列變更:

  • startService() 方法現在會擲回 IllegalStateException (如果是應用程式) 指定 Android 8.0 為目標 在不允許建立背景服務的情況下使用。
  • 新的 Context.startForegroundService() 方法會啟動 前景服務。系統允許應用程式 呼叫 Context.startForegroundService(),即使在應用程式 在背景執行不過,應用程式必須在五內呼叫該服務的 startForeground() 方法 秒鐘。

若需更多資訊,請參閲 背景執行限制

Android 背景位置資訊限制

為了節省電池、使用者體驗和系統健康度, 在裝置上使用時,背景應用程式接收位置更新的頻率會比較低 搭載 Android 8.0 的 VM。這項行為變更會影響所有應用程式 接收位置更新通知,包括 Google Play 服務

這些變更會影響下列 API:

  • 整合式位置預測提供工具 (FLP)
  • 地理圍欄
  • GNSS 測量資料
  • 位置管理員
  • Wi-Fi 管理員

為確保應用程式能正常運作,請完成下列步驟:

  • 檢查應用程式的邏輯,並確認您使用的是最新位置 相互整合
  • 測試應用程式是否呈現出您預期每次使用時的行為 確認是否屬於此情況
  • 建議使用 融合式 位置提供者 (FLP) 或地理圍欄,以便處理仰賴於 使用者目前的位置

如要進一步瞭解這些異動,請參閱 背景位置資訊 限制

應用程式捷徑

Android 8.0 (API 級別 26) 包含下列應用程式捷徑變更:

  • com.android.launcher.action.INSTALL_SHORTCUT的廣播否 對應用程式產生任何影響, 廣播。請改為使用 requestPinShortcut() ShortcutManager類別中的方法。
  • ACTION_CREATE_SHORTCUT 意圖現在可建立您透過 ShortcutManager 類別。這個意圖也能建立 無法與舊版啟動器互動的舊版啟動器捷徑 ShortcutManager。先前,這項意圖 只能建立舊版啟動器捷徑。
  • 使用以下工具建立的快速指令: requestPinShortcut() 和捷徑 ACTION_CREATE_SHORTCUT 意圖現已全面推出應用程式捷徑。因此,應用程式現在可以更新 使用 ShortcutManager 中的方法。
  • 舊版快速鍵會保留舊版快速鍵的功能 Android 裝置,但您必須在應用程式中手動將捷徑轉換為應用程式捷徑。

如要進一步瞭解應用程式捷徑的變更,請參閱 固定捷徑 小工具功能指南。

語言代碼和國際化

Android 7.0 (API 級別 24) 導入了能夠取得 指定預設類別語言代碼,但部分 API 繼續使用 一般 Locale.getDefault() 方法中不含引數,但應該改用預設的 DISPLAY 類別語言代碼。在 Android 8.0 (API 級別 26) 中, 下列方法現在使用 Locale.getDefault(Category.DISPLAY) 而不是 Locale.getDefault()

還有 Locale.getDisplayScript(Locale) 人 改回 Locale.getDefault() 已為「Locale」指定 displayScript 值 引數無法使用。

其他與語言代碼和國際化相關的變更如下: 如下:

  • 呼叫 Currency.getDisplayName(null) 會擲回 NullPointerException 和記錄行為進行比對
  • 時區名稱剖析功能已變更。先前 Android 裝置在啟動時使用取樣的系統時鐘值 時間快取剖析日期所用的時區名稱 次。因此如果系統有不良影響 時鐘在開機時或其他很少見的情況下出現錯誤。

    在一般情況下,剖析邏輯會使用 ICU 和 剖析時區名稱時目前的系統時鐘值。這個 變更可提供更詳盡的結果,但這個結果可能與先前不同 如果您的應用程式使用以下類別時的 Android 版本: SimpleDateFormat

  • Android 8.0 (API 級別 26) 會將 ICU 版本更新至 58 版。

快訊視窗

如果應用程式使用 SYSTEM_ALERT_WINDOW 權限,並使用下列其中一種視窗類型,嘗試顯示 快訊視窗上方:

...然後這些視窗一律顯示在使用 TYPE_APPLICATION_OVERLAY的窗戶 類型。如果應用程式指定 Android 8.0 (API 級別 26),該應用程式會使用 TYPE_APPLICATION_OVERLAY 顯示快訊視窗的視窗類型

如需詳細資訊,請參閱常見視窗類型 快訊視窗部分應用程式行為變更 針對 Android 8.0

輸入與瀏覽

隨著 ChromeOS 和其他大型板型規格的問世, 例如平板電腦等,我們發現鍵盤瀏覽方式在 Android 應用程式。在 Android 8.0 (API 級別 26) 中,我們使用 做為瀏覽輸入裝置,從而更可靠 以箭頭和分頁為基礎的導覽的可預測模型。

我們特別針對元素焦點進行了下列變更 行為:

  • 如果您尚未為 View 物件 (前景或背景皆可) 可繪項目),架構現在會為 View。此焦點醒目顯示是漣漪可繪項目 根據活動主題顯示內容

    如果您不希望 View 物件使用這個預設值 並在獲得焦點時醒目顯示 android:defaultFocusHighlightEnabled 屬性設為 版面配置 XML 檔案中包含 false,其中包含 View,或傳入 falsesetDefaultFocusHighlightEnabled()

  • 如要測試鍵盤輸入對 UI 元素焦點的影響,您可以啟用 繪圖 >顯示版面配置邊界開發人員選項。在 Android 中 8.0,此選項會顯示「X」圖示上方 重點。

此外,Android 8.0 中的所有工具列元素都會自動 鍵盤導覽叢集, 方便使用者切換各個工具列 。

如要進一步瞭解如何改善以下項目的鍵盤瀏覽支援功能: 請前往應用程式的支援 鍵盤導覽指南。

網路表單自動填入

現在 Android 的自動填入功能 架構內建自動填入功能支援, WebView 物件相關的下列方法已變更 針對安裝在 Android 8.0 (API 級別 26) 裝置上安裝的應用程式:

WebSettings
WebViewDatabase
  • 撥號中 clearFormData() 人婉拒 不會產生任何影響
  • hasFormData() 種方式 現在會傳回 false。這個方法先前會傳回 如果表單包含資料,則為 true

無障礙設定

Android 8.0 (API 級別 26) 針對無障礙功能進行了下列變更:

  • 無障礙架構現已將所有輕觸兩下手勢轉換為 ACTION_CLICK 動作。這項變更可讓 TalkBack 的運作方式更接近其他 無障礙服務。

    如果應用程式的 View 物件使用自訂觸控功能 處理,請先確認這些動作是否仍可與 TalkBack 搭配運作。您可能會 只需要註冊 View 物件的使用方式如果 TalkBack 仍然無法辨認出對這些手勢操作的手勢 View 物件,覆寫 performAccessibilityAction()

  • 無障礙服務現在可以 應用程式的 ClickableSpan 個執行個體 TextView 物件。

如要進一步瞭解如何打造更符合無障礙需求的應用程式,請參閱 無障礙功能

網路和 HTTP(S) 連線

Android 8.0 (API 級別 26) 包含下列應用程式行為變更: 網路和 HTTP(S) 連線:

  • 沒有內文的 OPTIONS 要求包含「Content-Length: 0」 標題。先前沒有任何 Content-Length 標頭。
  • HttpURLConnection 會透過附加程式碼,將包含空白路徑的網址正規化 請在主機或授權名稱後方加上斜線,並加上斜線例如 將 http://example.com 轉換為 http://example.com/
  • 透過 ProxySelector.setDefault() 設定的自訂 Proxy 選取器 只會指定要求網址的位址 (配置、主機和通訊埠)。 因此, Proxy 選項可能僅根據這些值。網址 傳遞至自訂 Proxy 選取器不包含所要求的網址 路徑、查詢參數或片段
  • URI 不得包含空白標籤。

    平台先前支援在以下做法中接受空白標籤: 主機名稱,屬於非法使用 URI。這個解決方法適用於 與舊版 libcore 相容使用 API 的開發人員 會看到 ADB 訊息:「URI example.com 在 主機名稱這個格式錯誤,日後的 Android 將不接受這個格式 發布新版本。」 Android 8.0 移除了這個解決方法;系統會傳回 空值代表格式錯誤的 URI。

  • Android 8.0 導入 HttpsURLConnection 不會執行不安全的 TLS/SSL 通訊協定版本備用作業。
  • 通道 HTTP(S) 連線的處理變更如下:
    • 透過連線建立 HTTPS 連線通道時,系統會 傳送時正確地將連接埠號碼 (:443) 放到主機行 將這項資訊傳送至中繼伺服器之前的通訊埠 數字只出現於 CONNECT 行。
    • 系統不會再傳送使用者代理程式和 Proxy 授權 標頭,從通道要求傳送至 Proxy 伺服器。

      系統不再於 設定防火牆規則時,將 Http(s)URLConnection 傳送至 Proxy 更新通道系統會改為產生 Proxy 授權標頭 當 Proxy 向 Proxy 發送清單時 HTTP 407 以回應初始要求。

      同樣地,系統不會再複製使用者代理程式標頭 將通道收到要求,傳給設定 更新通道而程式庫則會為其產生 請求。

  • send(java.net.DatagramPacket) 如果先前執行的 connect(),此方法會擲回 SocketException 方法失敗。
    • 如果存在 發生內部錯誤。在 Android 8.0 以下版本中,新的 recv() 即使 send() 呼叫成功,呼叫也會擲回 SocketException。 為保持一致性,這兩個呼叫現在都會擲回 SocketException。
  • InetAddress.isReachable() 會先嘗試 ICMP,再改回 TCP 回應 因此效能相當卓越
    • 部分封鎖通訊埠 7 (TCP Echo) 的主機,例如 google.com, 現在只要接受 ICMP Echo 通訊協定,即可與您聯絡。
    • 對確實無法連線的主機來說,這項變更 時間會花費在呼叫傳回之前的時間。

藍牙

Android 8.0 (API 級別 26) 針對 也就是 ScanRecord.getBytes() 方法會擷取:

  • getBytes() 方法不會做任何假設 收到的位元組數因此,應用程式不應仰賴任何 傳回的位元組數最小值或最大值。相反地 每個結果陣列的長度。
  • 藍牙 5 相容裝置可能會傳回超過 先前的上限,約為 60 個位元組
  • 如果遠端裝置未提供掃描回應,請小於 60 個位元組 就可能一併傳回

順暢的連線

Android 8.0 (API 級別 26) 改善了 Wi-Fi 設定,方便你選擇設定。 提供最佳使用者體驗的 Wi-Fi 網路。具體變更包括:

  • 提升穩定性和穩定性。
  • 更直覺易讀的 UI。
  • 單一整合式 Wi-Fi 偏好設定選單。
  • 在相容裝置上,在已儲存的高品質網路時自動啟用 Wi-Fi 就在附近。

安全性

Android 8.0 提供下列安全性相關 變更:

  • 平台已不再支援 SSLv3。
  • 與錯誤的伺服器建立 HTTPS 連線 實作 TLS 通訊協定版本交涉 「HttpsURLConnection」已選擇不嘗試解決方法 無法改回使用舊版傳輸層安全標準 (TLS) 通訊協定版本,然後重試。
  • Android 8.0 (API 級別 26) 會套用安全運算 (SECCOMP) 篩選出所有應用程式。系統允許的系統呼叫清單僅限於 暴露在生物圈中雖然還有一些其他的系統呼叫 如果具備回溯相容性,則建議不要使用。
  • 應用程式的 WebView 物件現在會在多程序中執行 模式。網頁內容的處理方式是獨立程序,與 包含應用程式強化安全性的程序
  • 您無法再假設該 APK 位於名稱結尾的目錄中 是 -1 或 -2。應用程式應使用 sourceDir 即可取得 目錄,不必直接依賴目錄格式。
  • 瞭解與使用原生相關的安全性強化措施 請參閱原生資料庫

此外,Android 8.0 (API 級別 26) 推出了下列與安裝相關的變更 來源不明的不明應用程式:

如需有關安裝不明應用程式的詳細資訊,請參閱 不明的應用程式 安裝權限指南

如需有關提升應用程式安全性的其他指南,請參閱 Android 開發人員的安全性

隱私權

Android 8.0 (API 級別 26) 提供下列隱私權相關 只要調整廣告策略

  • 平台現在以不同的方式處理 ID。
    • 適用於在 OTA 更新前安裝的應用程式 Android 8.0 (API 級別 26) (API 級別 26), ANDROID_ID維持不變 。為了保留 解除安裝後,開發人員可使用 鍵/值備份
    • 如果是安裝在搭載 Android 8.0 的裝置上的應用程式, ANDROID_ID 已限定範圍 每個使用者應用程式簽署金鑰如果 ANDROID_ID 是獨一無二的 。 因此,如果應用程式有不同的簽署金鑰在相同裝置上執行 不再看到相同的 Android ID (即使是同一使用者)。
    • ANDROID_ID 的值 只要 簽署金鑰相同 (且在 OTA 轉給 OTA 之前,未安裝應用程式 Android 8.0 版)。
    • ANDROID_ID 的值 也不會改變。
    • 如果出貨裝置包含 Google Play 服務和廣告 ID, 您必須使用 廣告 ID。透過應用程式營利的簡單標準系統。 廣告 ID 是可由使用者重設的專屬 ID,用於放送廣告。有提供 使用 Google Play 服務

      其他裝置製造商應繼續操作 來提供 ANDROID_ID

  • 查詢 net.hostname 系統屬性會產生空值 結果。

記錄未偵測到的例外狀況

如果應用程式安裝的 Thread.UncaughtExceptionHandler 會執行以下動作: 未呼叫預設的 Thread.UncaughtExceptionHandler 系統會 未偵測到的例外狀況時終止應用程式。開始日期 Android 8.0 (API 級別 26),系統會記錄這個事件中的例外狀況堆疊追蹤 情況;但系統並沒有該功能 則會記錄例外狀況堆疊追蹤

建議您使用自訂 Thread.UncaughtExceptionHandler 導入功能一律會呼叫 預設處理常式;至於遵循這項建議的應用程式,則不會受到 Android 8.0 的變更內容

findViewById() 簽名變更

findViewById() 方法的所有執行個體現在都會傳回 <T extends View> T,而不是 View。這項異動 會產生下列影響:

  • 這可能會導致現有程式碼現在含有無法識別的傳回類型 舉例來說,如果有 someMethod(View)someMethod(TextView),該呼叫會將呼叫的結果傳送至 findViewById()
  • 使用 Java 8 來源語言時,需要明確轉換為 View:如果傳回類型未受限 (例如 assertNotNull(findViewById(...)).someViewMethod())
  • 覆寫非最終的 findViewById() 方法 (適用於 例如:Activity.findViewById()) 需要退貨 已更新類型。

聯絡人供應商使用統計資料變更

在舊版 Android 中,聯絡人提供者元件 可讓開發人員取得每位聯絡人的使用資料。這項使用資料 會顯示每個電子郵件地址及其每個電話號碼的資訊 與特定聯絡人聯繫,包括聯絡聯絡人的次數 以及上次聯絡聯絡人的時間要求 READ_CONTACTS 權限可讀取此資料。

應用程式仍可在提出要求時讀取這類資料 READ_CONTACTS 權限。在 Android 8.0 (API 級別 26) 以上版本中,查詢用量資料會傳回 來參考概略值,而不是確切值。Android 系統會維護 確切值,因此這項變更不會影響 自動完成 API

這項行為變更會影響下列查詢參數:

集合處理

AbstractCollection.removeAll()AbstractCollection.retainAll() 現在一律擲回 NullPointerException。先前, 收集作業出現時,並未擲回 NullPointerException 並將空無一物。這項變更讓行為與說明文件一致。

Android Enterprise

Android 8.0 (API 級別 26) 會變更 部分用於企業應用程式 API 和功能的行為,包括裝置 政策控制器 (DPC)。這些異動包括:

  • 新的行為可協助應用程式在全代管裝置上支援工作資料夾。
  • 系統更新處理、應用程式驗證和驗證變更: 可增加裝置和系統完整性。
  • 改善使用者帳戶佈建、通知和 最近使用螢幕和永久連線 VPN。

查看 Android 8.0 (API 級別 26) 的所有企業異動,並瞭解可能如何 影響您的應用程式,請閱讀 企業版 Android

鎖定 Android 8.0 的應用程式

這些行為變更僅適用於指定的應用程式 Android 8.0 (API 級別 26) 以上版本。針對 Android 8.0 平台編譯的應用程式 或將 targetSdkVersion 設為 Android 8.0 以上版本,必須修改 確保應用程式能妥善支援這些行為 (如適用)。

快訊視窗

使用 SYSTEM_ALERT_WINDOW的應用程式 權限無法再使用以下視窗類型顯示快訊視窗 位於其他應用程式和系統視窗上方:

因此,應用程式必須使用名為 TYPE_APPLICATION_OVERLAY

使用 TYPE_APPLICATION_OVERLAY的窗戶 輸入內容以顯示應用程式的快訊視窗,請確保以下特性 新的視窗類型,請留意以下幾點:

  • 應用程式的快訊視窗一律會顯示在重要系統視窗下方,例如 做為狀態列和輸入法編輯器
  • 系統可能會移動使用 TYPE_APPLICATION_OVERLAY 視窗類型,提升螢幕畫面的呈現效果。
  • 使用者只要開啟通知欄,即可存取設定來封鎖 避免應用程式顯示快訊視窗 TYPE_APPLICATION_OVERLAY 視窗類型。

內容變更通知

Android 8.0 (API 級別 26) 會改變 ContentResolver.notifyChange()registerContentObserver(Uri, boolean, ContentObserver) 針對指定 Android 8.0 版本的應用程式行為。

這些 API 現在需要有效的 ContentProvider 是依照所有 Uris 的權威定義。定義具備相關權限的有效 ContentProvider 將會 協助防範惡意應用程式的內容變更,並防範 避免洩露潛在私密資料到惡意應用程式

查看重點

可點擊的 View 物件現在也可聚焦於 預設值。如要將 View 物件設為可供點選,但不要 設為可聚焦的區塊 在版面配置中將 android:focusable 屬性設為 false 包含 View 的 XML 檔案,或傳入 false 應用程式 UI 中的 setFocusable() 邏輯。

瀏覽器偵測中的使用者代理程式比對功能

Android 8.0 (API 級別 26) 以上版本包含 版本 ID 字串 OPR。某些模式比對 會導致瀏覽器偵測邏輯誤將非 Opera 瀏覽器歸類為 Opera。 這種模式比對的範例如下:

if(p.match(/OPR/)){k="Opera";c=p.match(/OPR\/(\d+.\d+)/);n=new Ext.Version(c[1])}

為避免此類誤報所造成的問題,請使用 OPR 用於 Opera 瀏覽器模式比對。

安全性

以下變更會影響 Android 8.0 (API 級別 26) 中的安全性:

  • 如果您應用程式的網路安全性設定 選用 不支援明文流量 WebView 物件無法透過 HTTP 存取網站。每項 WebView 物件必須改用 HTTPS。
  • 「允許不明來源」系統設定已移除。包含 「安裝不明應用程式」權限可用於管理不明的應用程式安裝 來自不明來源的流量如要進一步瞭解這項新權限,請參閱 不明的應用程式 安裝權限指南

如需有關提高應用程式安全性的其他指南,請參閱 Android 開發人員的安全性

帳戶存取權和能見度

在 Android 8.0 (API 級別 26) 中,應用程式無法再取得存取權 除非驗證器擁有這些帳戶 並授予使用者該存取權 GET_ACCOUNTS的權限 不再足夠應用程式應符合以下條件才能獲得帳戶存取權 使用「AccountManager.newChooseAccountIntent()」 或專屬驗證器 方法。獲得帳戶存取權後,應用程式可呼叫以下呼叫: AccountManager.getAccounts() 以便存取。

Android 8.0 淘汰 LOGIN_ACCOUNTS_CHANGED_ACTION。應用程式 請改用 addOnAccountsUpdatedListener() ,取得在執行階段期間帳戶的最新資訊。

如要瞭解新增的 API 和存取方法,以及 是否可搜尋,請參閱帳戶存取權 以及相關最佳做法

隱私權

以下變更會影響 Android 8.0 (API 級別 26) 中的隱私權。

  • 系統屬性 net.dns1net.dns2 net.dns3net.dns4已不再適用 的重大異動。
  • 為了取得 DNS 伺服器等網路資訊, ACCESS_NETWORK_STATE 權限可以註冊 NetworkRequestNetworkCallback 物件。 這些類別適用於 Android 5.0 (API 級別 21) 以上版本。
  • Build.SERIAL 已淘汰。 需知道硬體序號的應用程式 使用新的 Build.getSerial() 方法 需要 READ_PHONE_STATE 權限。
  • LauncherApps API 不再支援工作資料夾 以取得主要設定檔的相關資訊。使用者工作時 設定檔,LauncherApps API 會假設沒有應用程式 會安裝在同一個設定檔群組內的其他設定檔中。和先前一樣 嘗試存取不相關的設定檔會造成 SecurityException。

權限

在 Android 8.0 (API 級別 26) 以下版本中,如果應用程式要求權限 但由於系統也未授予權限 已授予應用程式其餘權限 權限群組,且已在資訊清單中註冊的。

對指定 Android 8.0 版本的應用程式來說,這是 已修正。系統只會為應用程式明確授予的權限 。不過,使用者授予應用程式權限後, 隨後,該權限群組中的權限要求 自動授予。

舉例來說,假設應用程式同時列出 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE 的資訊清單。 應用程式要求 READ_EXTERNAL_STORAGE 並 取得使用者授予的權限如果應用程式指定的 API 級別為 25 以下,系統也會執行 授予WRITE_EXTERNAL_STORAGE相同的 因為這兩個群組屬於相同的 STORAGE 權限群組,而且 在資訊清單中註冊的金鑰如果應用程式指定 Android 8.0 (API 級別 26),系統會授予 當時只有 READ_EXTERNAL_STORAGE; 但是,如果應用程式之後要求 WRITE_EXTERNAL_STORAGE,則系統會立即 授予該權限,且不提示使用者。

媒體

  • 架構可以 自動降低背景音量 來建構應用程式在這種情況下,當其他應用程式要求聚焦時 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK,應用程式 表示其音量會減少,但通常不會 onAudioFocusChange() 且不會 就會失去音訊焦點新的 API 可用於覆寫此行為 應用程式。
  • 使用者接聽來電時,進行中的媒體串流在直播期間會設為靜音 呼叫。
  • 所有與音訊相關的 API 都應使用 AudioAttributes 而不是以音訊串流類型描述音訊播放用途 繼續僅將音訊串流類型用於音量控制。仍可使用其他串流類型 (例如,將 streamType 引數傳遞至已淘汰的 AudioTrack 建構函式), 但系統會將此記錄為錯誤。
  • 使用 AudioTrack 時 (如果應用程式為 需要夠大的音訊緩衝區, 架構會嘗試使用深度緩衝區輸出內容 (如果有的話)。
  • 在 Android 8.0 (API 級別 26) 中,媒體按鈕事件的處理方式不同:
    1. 處理媒體按鈕 UI 活動未變更:前景活動在處理時仍優先排序 媒體按鈕事件
    2. 如果前景活動未處理媒體按鈕事件,系統會轉送事件 最近在本機播放音訊的應用程式中使用中狀態、旗標和播放狀態 系統不會將媒體工作階段的狀態列入考量,以判斷哪個應用程式會接收媒體 按鈕事件。
    3. 如果應用程式的媒體工作階段已釋出 系統會將媒體按鈕事件傳送到應用程式的 MediaButtonReceiver (如果有)。
    4. 在其他情況下,系統會捨棄媒體按鈕事件。

原生程式庫

在指定 Android 8.0 (API 級別 26) 的應用程式中,原生程式庫否 載入時間較長,如果載入量區段同時包含可寫入的 執行檔。如果出現上述異動,部分應用程式可能會因為 載入某些原生資料庫的載入區隔不正確這是 安全強化措施

如需詳細資訊,請參閱 可寫入與可執行區隔

連接器變更與應用程式指定的 API 級別相關聯。如果有 是連結器變更 目標 API 級別,應用程式無法載入程式庫。如要指定 低於發生連結器變更的 API 級別 (低於 API 級別) logcat 顯示警告

集合處理

在 Android 8.0 (API 級別 26) 中, Collections.sort() 已於 List.sort() 頂端。反向 在 Android 7.x (API 級別 24 和 25) 中為 true: List.sort() 的預設實作方式 名為 Collections.sort()

這項變更將允許Collections.sort() 協助您運用最佳化的List.sort() 但具有下列限制:

  • 導入 List.sort() 不得呼叫 Collections.sort() 因為這麼做會導致堆疊溢位 導致發生無限的遞迴現象如果您希望使用預設行為 List,應該避免覆寫 sort()

    如果父項類別不當實作 sort(), 通常可以覆寫 List.sort() 以及建立在 List.toArray(), Arrays.sort()ListIterator.set()。例如:

    @Override
    public void sort(Comparator<? super E> c) {
      Object[] elements = toArray();
      Arrays.sort(elements, c);
      ListIterator<E> iterator = (ListIterator<Object>) listIterator();
      for (Object element : elements) {
        iterator.next();
        iterator.set((E) element);
      }
    }
    

    在大多數情況下 List.sort() 以及 可委派給不同預設值的實作 視 API 級別而定。例如:

    @Override
    public void sort(Comparator<? super E> comparator) {
      if (Build.VERSION.SDK_INT <= 25) {
        Collections.sort(this);
      } else {
        super.sort(comparator);
      }
    }
    

    如果您因為偏好使用 sort(),而只採用後者 方法,建議為該方法設定專用名稱 例如 sortCompat(),而不是覆寫 sort()

  • Collections.sort()現在計為 進行結構上的修改 列出呼叫 sort() 的實作。例如在 Android 8.0 (API 級別 26) 之前的平台,疊代 對其呼叫 ArrayList,並呼叫 sort() 反覆嘗試 會導致系統擲回 ConcurrentModificationException (排序是否完成) 呼叫 List.sort()Collections.sort() 並未擲回例外狀況

    這項變更讓平台行為更加一致:無論如何 方法現在會產生 ConcurrentModificationException

類別載入行為

Android 8.0 (API 級別 26) 檢查,確保類別載入器不會 載入新類別時中斷執行階段的假設。這些檢查 執行是否從 Java 參照類別 (來自 forName())、 Dalvik 位元碼或 JNI平台不會攔截從 Java 傳送到 loadClass() 方法,且不會檢查 傳回的結果這項行為不會影響健康功能的運作 類別載入器。

平台會檢查類別載入器傳回的類別描述元 符合預期的描述元如果傳回的描述元不符, 平台會擲回 NoClassDefFoundError 錯誤,然後儲存在 就會看到說明差異的詳細訊息。

平台也會檢查所要求類別的描述元是否有效。這個 檢查會擷取間接載入類別的 JNI 呼叫,例如 GetFieldID()。 將無效的描述元傳送至這些類別。舉例來說,如果欄位含有簽名 找不到 java/lang/String,因為簽章無效; 應為 Ljava/lang/String;

這與對 FindClass() 的 JNI 呼叫不同 其中 java/lang/String 是有效的完整名稱。

Android 8.0 (API 級別 26) 不支援讓多個類別載入器嘗試定義類別 使用相同的 DexFile 物件嘗試這樣做會導致 Android 執行階段擲回 InternalError 錯誤訊息:「嘗試註冊 dex 檔案 <filename>」 。」

DexFile API 現已淘汰,強烈建議您使用 其中一個平台類別載入器,包括 PathClassLoaderBaseDexClassLoader

注意: 您可以建立多個參照 與檔案系統相同的 APK 或 JAR 檔案容器。通常這麼做 這會造成大量記憶體負擔:如果儲存容器中的 DEX 檔案 後,平台即可對其執行 mmap 作業,而非 以便直接擷取內容但如果平台必須從容器中擷取 DEX 檔案, 以這個方式參照 DEX 檔案可能會耗用大量記憶體。

在 Android 中,所有類別載入器都視為可平行處理。 當多個執行緒競相以相同類別載入相同類別時 載入器,第一個完成作業的執行緒將勝出,結果則用於 另一個執行緒。無論類別載入器是否發生此行為 傳回相同的類別、傳回不同的類別或擲回例外狀況。 平台會在不發出通知的情況下忽略這類例外狀況。

注意: 在平台版本中 低於 Android 8.0 (API 級別 26) 版本,破壞這些假設可能會導致定義相同的 您可能會因為類別錯亂 而多次堆積毀損 以及其他不理想的效果