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'
}

枯燥乏味

Android 即將從 OpenSSL 中移除 BoringSSL 程式庫。如果您在應用程式中使用 Android NDK,請勿連結至不屬於 NDK API 的加密編譯程式庫,例如 libcrypto.solibssl.so。這些程式庫不是公用 API,可能會隨時變更或停止運作,恕不另行通知。 此外,您可能會暴露在安全漏洞風險中。請改為修改原生程式碼,透過 JNI 呼叫 Java 密碼編譯 API,或以靜態方式連結至您選擇的密碼編譯程式庫。

硬體 ID 存取權

為了讓使用者進一步保護資料,從這個版本開始,針對使用 Wi-Fi 和 Bluetooth API 的應用程式,Android 會從裝置中移除本機硬體 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

文字選取

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

當使用者在應用程式中選取文字時,您現在可以在懸浮工具列中顯示文字選取動作,例如「Cut」、「Copy」和「Paste」。使用者互動實作方式與關聯動作列類似,如 為個別檢視畫面啟用關聯動作模式一節所述。

如要實作浮動工具列以進行文字選取,請在現有的應用程式中進行下列變更:

  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 物件。
  • 先前,如果應用程式搭配 disableAllOthers=true 設定使用 enableNetwork(),強制裝置連線到特定 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 設定,包括非 Wi-Fi 設定。
  • 透過 Google 帳戶新增功能下載裝置政策控制器:如果 Google 帳戶需要透過裝置政策控制器 (DPC) 應用程式管理,但新增至受管理環境外的 Google 帳戶,此時新增帳戶流程會提示使用者安裝適當的 WPC。這個行為也適用於透過「設定」>「帳戶」以及初始裝置設定精靈新增的帳戶。
  • 特定 DevicePolicyManager API 行為變更:
  • 其他 API 變更
    • 數據用量:android.app.usage.NetworkUsageStats 類別已重新命名為 NetworkStats
  • 通用設定變更