Android 6.0 變更

除了新功能外,Android 6.0 (API 級別 23) 也提供多種新功能 系統變更和 API 行為變更這份文件重點說明 其中一些重要異動,您必須理解並考量到應用程式中。

如果您先前已發布 Android 應用程式,請注意這些變更 對您的應用程式的影響。

執行階段權限

這個版本推出新的權限模型,使用者現在可直接管理 授予應用程式權限這個模型可讓使用者 同時簡化應用程式開發人員的安裝與自動更新程序。 使用者可以個別授予或撤銷已安裝應用程式的權限。

如果應用程式指定 Android 6.0 (API 級別 23) 以上版本,請務必檢查應用程式並要求 授予使用者權限如要判斷應用程式是否已取得權限,請呼叫 新checkSelfPermission() 方法。如需要求權限,請呼叫 requestPermissions() 方法。即使您的應用程式未指定 Android 6.0 (API 級別 23),您仍應在以下位置測試應用程式: 新的權限模型

如要進一步瞭解如何在應用程式中支援新的權限模型,請參閱 使用系統權限。如需評估應用程式影響的相關提示, 請參閱權限使用注意事項

打盹和應用程式待命

這個版本針對閒置裝置和應用程式推出新的省電最佳化功能。這些 功能會影響所有應用程式,因此請務必在這些新模式中測試應用程式。

  • 打盹:如果使用者拔除裝置電源時將裝置螢幕關閉, 裝置會進入打盹模式,嘗試持續採用系統 都處於睡眠狀態在此模式下,裝置會在短時間內定期恢復正常作業 系統可執行應用程式同步,並讓系統可以執行所有待處理作業。
  • 應用程式待命:應用程式待命功能可讓系統判斷應用程式是否處於閒置狀態 在使用者不積極使用的情況下。如果使用者未 輕觸應用程式一段時間。如果裝置未接上電源,系統會停用網路 存取及暫停其閒置應用程式的同步處理和工作。

如要進一步瞭解這些省電相關異動,請參閱 針對打盹和應用程式待命進行最佳化

Apache HTTP 用戶端移除

Android 6.0 版本移除對 Apache HTTP 用戶端的支援。如果您的應用程式正在使用這個用戶端,且 指定 Android 2.3 (API 級別 9) 以上版本,請使用 HttpURLConnection 類別 。這個 API 透過透明壓縮減少網路用量,因此效率更高 也能將耗電量降到最低如要繼續使用 Apache HTTP API, 必須先在 build.gradle 檔案中宣告下列編譯時間依附元件:

android {
    useLibrary 'org.apache.http.legacy'
}

BoringSSL

Android 即將從 OpenSSL 遷移至 BoringSSL 資源庫。在應用程式中使用 Android NDK 時,請勿連結至加密編譯程式庫 ,例如 libcrypto.solibssl.so。這些 程式庫不是公用 API,因此可能會在不另行版本和裝置的情況下變更或毀損。 此外,您也可能會因此暴露在安全漏洞的風險中。只要修改 原生程式碼,透過 JNI 呼叫 Java 密碼學 API,或透過靜態方式連結至 您選擇的密碼編譯程式庫。

硬體 ID 存取權

為提供使用者更強大的資料保護機制,從這個版本開始 移除以程式輔助方式存取裝置本機硬體 ID 使用 Wi-Fi 和藍牙 API 的應用程式。 WifiInfo.getMacAddress()BluetoothAdapter.getAddress() 種方式 現在會傳回 02:00:00:00:00:00 的常數值。

如要透過藍牙和 Wi-Fi 掃描功能存取附近外部裝置的硬體 ID, 應用程式現在必須含有 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION 權限:

注意:如果搭載 Android 6.0 (API 級別 23) 的裝置啟動 背景 Wi-Fi 或藍牙掃描,外部裝置都能看到 源自隨機化的 MAC 位址

通知

這個版本移除 Notification.setLatestEventInfo() 方法。使用 改用 Notification.Builder 類別建構通知。如要更新 重複通知,並重複使用 Notification.Builder 例項。在 取得 build() 種方法 已更新 Notification 個執行個體。

adb shell dumpsys notification 指令不會再輸出通知文字。 請改用 adb shell dumpsys notification --noredact 指令輸出文字 通知物件中。

AudioManager 變更

透過 AudioManager 直接設定音量或將特定串流靜音 已不再支援 類別。setStreamSolo() 方法已淘汰,您應呼叫 requestAudioFocus() 方法。同樣地, setStreamMute() 方法為 已淘汰;請改為呼叫 adjustStreamVolume() 方法,並傳遞方向值 ADJUST_MUTEADJUST_UNMUTE

選取文字

螢幕畫面顯示浮動工具列內的新文字選取功能

使用者在應用程式中選取文字時,您可以顯示文字選取動作,例如 剪下複製貼上: 「浮動工具列」。使用者互動導入方式類似 以便與使用者互動 為個別檢視畫面啟用關聯動作模式

如要實作浮動工具列來選取文字,請在現有 應用程式:

  1. ViewActivity 物件中,變更 ActionMode 通來電,來電者為 startActionMode(Callback)startActionMode(Callback, ActionMode.TYPE_FLOATING)
  2. 以現有的 ActionMode.Callback 實作為基礎,加以擴充 ActionMode.Callback2
  3. 覆寫 onGetContentRect() 提供內容 Rect 物件座標的方法 (例如文字選取矩形)。
  4. 如果矩形的位置不再有效,且這是唯一要撤銷的元素, 呼叫 invalidateContentRect() 方法。

如果您使用 Android 支援資料庫 22.2 版本;請注意,浮動工具列沒有 回溯相容,appcompat 則會透過下列方式掌控 ActionMode 物件 預設值。這可防止顯示浮動工具列。啟用方式 ActionMode支援服務: AppCompatActivity,撥號 getDelegate(),然後呼叫 回傳的 setHandleNativeActionModesEnabled() AppCompatDelegate 物件並設定輸入內容 參數的值至 false。這個呼叫會將 ActionMode 物件的控制項傳回至 這個原則在搭載 Android 6.0 (API 級別 23) 的裝置上,架構支援 ActionBar 或浮動工具列模式 Android 5.1 (API 級別 22) 以下版本,只有 ActionBar 模式 支援。

瀏覽器書籤變更

此版本移除對全域書籤的支援。 「android.provider.Browser.getAllBookmarks()」和「android.provider.Browser.saveBookmark()」 方法。同樣地,READ_HISTORY_BOOKMARKSWRITE_HISTORY_BOOKMARKS 就會移除這些權限如果應用程式指定的是 Android 6.0 (API 級別 23) 以上版本,則禁止存取 或使用書籤權限設定。您的應用程式應該在 以及內部的書籤資料

Android KeyStore 異動

在這個版本中, Android KeyStore 供應器已不再支援 動態搜尋廣告。系統仍支援 ECDSA。

安全螢幕鎖定時,不需使用靜態資料加密的金鑰不會再遭到刪除 遭停用或重設 (例如遭使用者或裝置管理員停用)。需要 並在活動期間刪除靜態資料加密機制。

Wi-Fi 和網路變更

這個版本推出了下列 Wi-Fi 和網路 API 的行為變更。

  • 您的應用程式現在只能變更 WifiConfiguration 物件的狀態 如果您建立了這些物件您不得修改或刪除 使用者或其他應用程式建立的 WifiConfiguration 物件。
  • 過去,如果應用程式使用 enableNetwork(),其中包含 disableAllOthers=true 設定,裝置已與其他網路中斷連線,例如 行動數據。在此版本中,裝置不再與其他網路中斷連線。如果 應用程式的 targetSdkVersion“20” 以下,已固定為所選應用程式 Wi-Fi 網路。如果應用程式的targetSdkVersion“21” 以上版本,請使用 多網路 API (例如 openConnection(), bindSocket(),以及 bindProcessToNetwork() 方法),確保其網路流量是透過所選網路傳送。

相機服務變更

這個版本變更了相機服務中用於存取共用資源的模型 從先前的「先到先得」存取模式,再改為使用高優先順序存取模式 服務行為的變更包括:

  • 相機子系統資源 (包括開啟和設定相機裝置) 的存取權 依據客戶申請流程的「優先順序」頒發。申請時 使用者可見或前景活動的優先順序通常較高,因此相機資源的優先順序較高 而且在開發和使用時更可靠
  • 優先順序較低的應用程式可能會「收除」當前優先順序較低的應用程式的使用中相機用戶端 應用程式嘗試使用相機。在已淘汰的 Camera API 中 會產生以下結果 onError() 為 。在 Camera2 API 中,這會產生 onDisconnected() 向已撤銷的用戶端發出呼叫
  • 在具有適當相機硬體的裝置上,單獨的應用程式程序即可 單獨開啟並同時使用不同的相機裝置。不過,如果有多個程序 ,如果能同時存取,效能或功能會大幅降低 任何開啟的相機裝置,現在相機服務會偵測並拒絕。這項異動 即使沒有其他應用程式直接使用應用程式,優先順序較低的客戶仍可能會「遭到撤銷」 就是嘗試存取同一部攝影機裝置
  • 如果變更目前的使用者,舊使用者帳戶擁有的應用程式會啟用相機用戶端 將被移除只有目前裝置使用者擁有的使用者個人資料才能存取攝影機。 實際上,這表示「訪客」帳戶 使用者切換至其他帳戶時,相機子系統的相關程序。

執行階段

ART 執行階段現已正確導入 newInstance() 方法。這個 變更修正了 Dalvik 先前版本未正確檢查存取規則的問題。 如果應用程式使用 newInstance() 方法和您 當您想覆寫存取檢查時 含有輸入內容的 setAccessible() 方法 參數已設為 true。如果應用程式使用 v7 appcompat 程式庫recyclerview 程式庫版本、 您必須更新應用程式,才能使用這些程式庫的最新版本。若非如此,請務必 XML 參照的任何自訂類別都會更新,以便存取其類別建構函式。

這個版本更新動態連接器的行為。動態連結器現在能瞭解 程式庫的 soname 及其路徑之間的差異 ()。 公開錯誤 6670),且依 soname 搜尋現已 先前可正常運作的應用程式,包含無效的 DT_NEEDED 項目 (通常建構機器檔案系統上的絕對路徑) 可能會在載入時失敗。

dlopen(3) RTLD_LOCAL 標記現已正確導入。請注意, RTLD_LOCAL 為預設值,因此呼叫 dlopen(3) 時並未明確使用 RTLD_LOCAL 會受到影響 (除非應用程式明確使用 RTLD_GLOBAL)。取代為 RTLD_LOCAL,日後呼叫以下項目時,程式庫將無法使用符號 dlopen(3) (而非 DT_NEEDED 項目參照)。

在舊版 Android 上,如果您的應用程式要求系統載入共用程式庫, 系統顯示警告訊息,但仍允許載入程式庫。 從這個版本開始,如果應用程式的目標 SDK 版本為 23,系統會拒絕這個程式庫 或更高版本。為協助您偵測程式庫是否載入失敗,應用程式應記錄 「dlopen(3)」失敗,並加入 dlerror(3) 的問題說明文字 呼叫。如要進一步瞭解如何處理文字重新定位,請參閱 指南

APK 驗證

該平台現在會對 APK 執行更嚴格的驗證。如果檔案符合以下條件,系統就會將 APK 視為損毀 在資訊清單中宣告,但不會顯示在 APK 中。如果 APK 出現下列任一情況,就必須重新簽署 就會移除內容

USB 連接

根據預設,透過 USB 連接埠進行的裝置連線現在會設為僅限充電模式。使用方式 透過 USB 連線進行裝置及其內容,使用者必須明確授予這類權限 互動情形如果您的應用程式支援使用者透過 USB 連接埠與裝置互動,請 因此互動必須明確啟用

Android for Work 相關異動

這個版本包含下列 Android for Work 行為變更:

  • 個人用途中的工作聯絡人。Google Dialer 使用者查看過往通話時,通話記錄現在會顯示工作聯絡人。 設定 setCrossProfileCallerIdDisabled()true 會隱藏 Google Dialer 通話記錄中的工作資料夾聯絡人。您可以 會與個人聯絡人一併透過藍牙顯示 你將「setBluetoothContactSharingDisabled()」設為「false」。它的預設值為 true
  • 移除 Wi-Fi 設定:設定檔擁有者新增的 Wi-Fi 設定 (例如,透過 addNetwork() 方法)。
  • Wi-Fi 設定鎖定: 無法修改或刪除有效的裝置擁有者: WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN 不是零。 使用者仍可建立及修改自己的 Wi-Fi 設定。使用中的裝置 擁有者有權編輯或移除任何 Wi-Fi 設定,包括 而非由他們建立的內容
  • 透過新增 Google 帳戶下載裝置政策控制器:如果 Google 系統會將必須透過裝置政策控制器 (DPC) 應用程式管理的帳戶新增到裝置上 在受管理的環境以外,新增帳戶流程現在會提示使用者 WPC。這個行為也適用於透過 設定 >帳戶和初始裝置設定精靈中。
  • 特定 DevicePolicyManager API 行為的變更:
  • 其他 API 的變更
    • 數據用量:android.app.usage.NetworkUsageStats 類別已重新命名 NetworkStats
  • 通用設定異動