除了新功能外,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.so
和 libssl.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_LOCATION
或 ACCESS_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_MUTE
或 ADJUST_UNMUTE
。
文字選取
當使用者在應用程式中選取文字時,您現在可以在浮動工具列中顯示文字選取動作,例如剪下、複製和貼上。使用者互動實作方式則與關聯動作列的類似,如「 為個別檢視畫面啟用關聯動作模式」一文所述。
如要實作浮動工具列來選取文字,請在現有應用程式中進行下列變更:
- 在您的
View
或Activity
物件中,將ActionMode
呼叫從startActionMode(Callback)
變更為startActionMode(Callback, ActionMode.TYPE_FLOATING)
。 - 採用現有的
ActionMode.Callback
實作,並改為擴充ActionMode.Callback2
。 - 覆寫
onGetContentRect()
方法,在檢視畫面中提供內容Rect
物件 (例如文字選取矩形) 的座標。 - 如果矩形定位不再有效,且這是唯一要失效的元素,請呼叫
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_BOOKMARKS
和 WRITE_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()
方法,且您想要覆寫存取權檢查,請將輸入參數設為 true
來呼叫 setAccessible()
方法。如果您的應用程式使用 v7 appcompat 程式庫或 v7 recyclerview 程式庫,您必須更新應用程式,以便使用這些程式庫的最新版本。否則,請務必更新從 XML 參照的任何自訂類別,以便存取其類別建構函式。
這個版本更新動態連接器的行為。動態連結器現在可瞭解程式庫的 soname
與其路徑之間的差異 (公開錯誤 6670),且現在已實作 soname
搜尋功能。先前可正常運作的應用程式,如果有錯誤的 DT_NEEDED
項目 (通常是建構機器檔案系統上的絕對路徑),在載入時可能會失敗。
dlopen(3) RTLD_LOCAL
標記現已正確導入。請注意,由於 RTLD_LOCAL
為預設值,因此未明確使用 RTLD_LOCAL
的 dlopen(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 行為的變更:- 呼叫
setCameraDisabled()
方法只會影響呼叫使用者的攝影機;從受管理的設定檔呼叫setCameraDisabled()
不會影響在主要使用者上執行的攝影機應用程式。 - 此外,
setKeyguardDisabledFeatures()
方法現在也適用於設定檔擁有者和裝置擁有者。 - 設定檔擁有者可以設定下列鎖定鍵限制:
KEYGUARD_DISABLE_TRUST_AGENTS
和KEYGUARD_DISABLE_FINGERPRINT
:這會影響設定檔上層使用者的鍵盤鎖設定。KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS
,這只會影響受管理設定檔中應用程式產生的通知。
DevicePolicyManager.createAndInitializeUser()
和DevicePolicyManager.createUser()
方法已淘汰。- 現在,指定使用者在前景執行的應用程式時,
setScreenCaptureDisabled()
方法也會封鎖輔助結構。 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
現已預設為 SHA-256。系統仍針對回溯相容性支援 SHA-1,但日後將會移除。EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM
現在只接受 SHA-256。- Android 6.0 (API 級別 23) 中的裝置初始化 API 現已移除。
- 已移除
EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS
,因此 NFC 串場廣告佈建作業無法透過程式解鎖已恢復原廠設定的受保護裝置。 - 您現在可以使用
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
額外項目,在受管理裝置的 NFC 佈建期間,將資料傳送至裝置擁有者應用程式。 - Android for Work API 已針對 M 執行階段權限最佳化,包括工作資料夾、輔助層等。新的
DevicePolicyManager
權限 API 不會影響 M 版前應用程式。 - 當使用者離開透過
ACTION_PROVISION_MANAGED_PROFILE
或ACTION_PROVISION_MANAGED_DEVICE
意圖啟動的設定流程的同步部分時,系統現在會傳回RESULT_CANCELED
結果代碼。
- 呼叫
- 其他 API 的變更:
- 數據用量:
android.app.usage.NetworkUsageStats
類別已重新命名為NetworkStats
。
- 數據用量:
- 通用設定變更:
- 以下設定無法再透過
setGlobalSettings()
設定:BLUETOOTH_ON
DEVELOPMENT_SETTINGS_ENABLED
MODE_RINGER
NETWORK_PREFERENCE
WIFI_ON
- 這些全域設定現在可透過
setGlobalSettings()
設定:
- 以下設定無法再透過