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,請勿連結至非 NDK API 的加密編譯程式庫,例如 libcrypto.solibssl.so。這些程式庫並非公開 API,且可能會在各版本和裝置上變更或損壞,恕不另行通知。此外,您可能會暴露於安全漏洞。請改為修改原生程式碼,透過 JNI 呼叫 Java 密碼編譯 API,或以靜態方式連結至您選擇的密碼編譯程式庫。

存取硬體 ID

為提供更完善的資料保護機制,自本版本起,Android 會移除應用程式使用 Wi-Fi 和 Bluetooth API 時,對裝置本機硬體 ID 的程式碼存取權。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 物件。這樣可避免浮動工具列顯示。如要在 AppCompatActivity 中啟用 ActionMode 支援功能,請呼叫 getDelegate(),然後對傳回的 AppCompatDelegate 物件呼叫 setHandleNativeActionModesEnabled(),並將輸入參數設為 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 供應器不再支援 DSA。系統仍支援 ECDSA。

當安全螢幕鎖定功能遭到停用或重設 (例如由使用者或裝置管理員執行) 時,系統就不會再刪除不需要靜態加密的金鑰。在這些事件中,系統會刪除需要靜態加密的金鑰。

Wi-Fi 和網路變更

這個版本對 Wi-Fi 和網路 API 做出了以下行為變更。

  • 只有在您建立 WifiConfiguration 物件時,應用程式才能變更這些物件的狀態。您不得修改或刪除由使用者或其他應用程式建立的 WifiConfiguration 物件。
  • 先前,如果應用程式使用 enableNetwork() 搭配 disableAllOthers=true 設定,強制裝置連線至特定 Wi-Fi 網路,裝置就會與其他網路 (例如行動數據) 中斷連線。在此版本中,裝置不再與其他網路中斷連線。如果應用程式的 targetSdkVersion“20” 或更低,則會固定在所選 Wi-Fi 網路。如果應用程式的 targetSdkVersion“21” 以上,請使用多網路 API (例如 openConnection()bindSocket() 和新的 bindProcessToNetwork() 方法),確保其網路流量會在所選網路中傳送。

攝影機服務異動

在這個版本中,相機服務中存取共用資源的模式已從先前「先到先得」存取模式,改為優先處理高優先順序程序的存取模式。服務行為的變更包括:

  • 相機子系統資源的存取權 (包括開啟和設定相機裝置) 會根據用戶端應用程式程序的「優先順序」授予。一般來說,如果應用程式程序具有使用者可可見或前景活動,優先順序就較高,這可讓系統取得相機資源,並使用更可靠的方式。
  • 當優先順序較高的應用程式嘗試使用相機時,較低優先順序應用程式的有效相機用戶端可能會遭到「驅逐」。在已淘汰的 Camera API 中,這會導致系統為遭到逐出的用戶端呼叫 onError()。在 Camera2 API 中,這會導致系統為遭到逐出的用戶端呼叫 onDisconnected()
  • 在配備適當相機硬體的裝置上,個別的應用程式程序可以獨立開啟並同時使用個別的相機裝置。不過,現在相機服務會偵測並禁止同時存取多程序用途,導致任何開放相機裝置的效能或功能大幅降低。即使沒有其他應用程式直接嘗試存取相同的相機裝置,這項變更仍可能導致優先順序較低的用戶端遭到「逐出」。
  • 如果變更目前的使用者,系統會撤銷先前使用者帳戶擁有應用程式中的使用中相機用戶端。只有目前裝置使用者擁有的使用者設定檔,才能存取相機。實際上,這表示當使用者切換至其他帳戶時,「訪客」帳戶將無法保留使用相機子系統的執行中程序。

執行階段

ART 執行階段現在可正確實作 newInstance() 方法的存取規則。這項變更修正了 Dalvik 在先前版本中檢查存取權規則時發生的錯誤問題。如果您的應用程式使用 newInstance() 方法,且想覆寫存取權檢查,請呼叫 setAccessible() 方法,並將輸入參數設為 true。如果您的應用程式使用 v7 appcompat 程式庫v7 recyclerview 程式庫,您必須更新應用程式,以便使用這些程式庫的最新版本。否則,請務必更新從 XML 參照的任何自訂類別,以便存取其類別建構函式。

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

dlopen(3) RTLD_LOCAL 標記現已正確導入。請注意,RTLD_LOCAL 是預設值,因此未明確使用 RTLD_LOCALdlopen(3) 呼叫會受到影響 (除非應用程式明確使用 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 撥號應用程式通話記錄現在會顯示工作聯絡人。將 setCrossProfileCallerIdDisabled() 設為 true 後,Google 撥號應用程式通話記錄中的工作資料夾聯絡人就會隱藏。只有在將 setBluetoothContactSharingDisabled() 設為 false 時,才能透過藍牙將工作聯絡人與個人聯絡人一起顯示在裝置上。預設值為 true
  • 移除 Wi-Fi 設定:如果工作資料夾遭到刪除,系統會移除設定檔擁有者新增的 Wi-Fi 設定 (例如透過呼叫 addNetwork() 方法)。
  • Wi-Fi 設定鎖定:如果 WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN 不為零,使用者就無法再修改或刪除有效裝置擁有者建立的任何 Wi-Fi 設定。使用者仍可建立及修改自己的 Wi-Fi 設定。活動裝置 擁有者有權編輯或移除任何 Wi-Fi 設定,包括非自己建立的設定。
  • 透過新增 Google 帳戶下載裝置政策控制器:如果 Google 帳戶需要透過裝置政策控制器 (DPC) 應用程式進行管理的 Google 帳戶,而需透過裝置政策控制器 (DPC) 應用程式進行管理,則新增帳戶流程現在會提示使用者安裝適當的 WPC。此行為也適用於透過「設定」>「帳戶」,以及初始裝置設定精靈中新增的帳戶。
  • 特定 DevicePolicyManager API 行為的變更:
  • 其他 API 的異動
    • 資料用途:android.app.usage.NetworkUsageStats 類別已重新命名為 NetworkStats
  • 通用設定變更