1. 程式人生 > >Android 6.0 變更

Android 6.0 變更

rar crypto cad HA -h intent 拒絕 -i libc

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,或靜態鏈接到您選擇的加密庫。

硬件標識符訪問權

為給用戶提供更嚴格的數據保護,從此版本開始,對於使用 WLAN API 和 Bluetooth API 的應用,Android 移除了對設備本地硬件標識符的編程訪問權。WifiInfo.getMacAddress() 方法和 BluetoothAdapter.getAddress() 方法現在會返回常量值 02:00:00:00:00:00

現在,要通過藍牙和 WLAN 掃描訪問附近外部設備的硬件標識符,您的應用必須擁有 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION 權限。

  • WifiManager.getScanResults()
  • BluetoothDevice.ACTION_FOUND
  • BluetoothLeScanner.startScan()

:當運行 Android 6.0(API 級別 23)的設備發起後臺 WLAN 或藍牙掃描時,在外部設備看來,該操作的發起來源是一個隨機化 MAC 地址。

通知

此版本移除了 Notification.setLatestEventInfo() 方法。請改用 Notification.Builder 類來構建通知。要重復更新通知,請重復使用 Notification.Builder 實例。調用 build() 方法可獲取更新後的 Notification 實例。

adb shell dumpsys notification 命令不再打印輸出您的通知文本。請改用 adb shell dumpsys notification --noredact 命令打印輸出 notification 對象中的文本。

音頻管理器變更

不再支持通過 AudioManager 類直接設置音量或將特定音頻流靜音。setStreamSolo() 方法已棄用,您應該改為調用 requestAudioFocus() 方法。類似地,setStreamMute() 方法也已棄用,請改為調用 adjustStreamVolume() 方法並傳入方向值 ADJUST_MUTEADJUST_UNMUTE

文本選擇

技術分享圖片

現在,當用戶在您的應用中選擇文本時,您可以在一個浮動工具欄中顯示“剪切”“復制”“粘貼”等文本選擇操作。其在用戶交互實現上與為單個視圖啟用上下文操作模式中所述的上下文操作欄類似。

要實現可用於文本選擇的浮動工具欄,請在您的現有應用中做出以下更改:

  1. View 對象或 Activity 對象中,將 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_BOOKMARKS 權限和 WRITE_HISTORY_BOOKMARKS 權限也已移除。如果您的應用以 Android 6.0(API 級別 23)或更高版本為目標平臺,請勿從全局提供程序訪問書簽或使用書簽權限。您的應用應改為在內部存儲書簽數據。

Android 密鑰庫變更

從此版本開始,Android 密鑰庫提供程序不再支持 DSA。但仍支持 ECDSA。

停用或重置安全鎖定屏幕時(例如,由用戶或設備管理員執行此類操作時),系統將不再刪除需要閑時加密的密鑰,但在上述事件期間會刪除需要閑時加密的密鑰。

WLAN 和網絡連接變更

此版本對 WLAN API 和 Networking API 引入了以下行為變更。

  • 現在,您的應用只能更改由您創建的 WifiConfiguration 對象的狀態。系統不允許您修改或刪除由用戶或其他應用創建的 WifiConfiguration 對象。
  • 在之前的版本中,如果應用利用帶有 disableAllOthers=true 設置的 enableNetwork() 強制設備連接特定 WLAN 網絡,設備將會斷開與移動數據網絡等其他網絡的連接。在此版本中,設備不再斷開與上述其他網絡的連接。如果您的應用的 targetSdkVersion“20” 或更低,則會固定連接所選 WLAN 網絡。如果您的應用的 targetSdkVersion“21” 或更高,請使用多網絡 API(如 openConnection()bindSocket() 和新增的 bindProcessToNetwork() 方法)來確保通過所選網絡傳送網絡流量。

相機服務變更

在此版本中,相機服務中共享資源的訪問模式已從之前的“先到先得”訪問模式更改為高優先級進程優先的訪問模式。對服務行為的變更包括:

  • 根據客戶端應用進程的“優先級”授予對相機子系統資源的訪問權,包括打開和配置相機設備。帶有對用戶可見 Activity 或前臺 Activity 的應用進程一般會被授予較高的優先級,從而使相機資源的獲取和使用更加可靠;
  • 當高優先級的應用嘗試使用相機時,系統可能會“驅逐”正在使用相機客戶端的低優先級應用。在已棄用的 CameraAPI 中,這會導致系統為被驅逐的客戶端調用 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
  • WLAN 配置刪除:現在,當刪除某個托管配置文件時,將會移除由配置文件所有者添加的 WLAN 配置(例如,通過調用 addNetwork() 方法添加的配置)。
  • WLAN 配置鎖定:如果 WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN 不為零,則用戶無法再修改或刪除任何由活動設備所有者創建的 WLAN 配置。用戶仍可創建和修改其自己的 WLAN 配置。活動設備所有者擁有編輯或刪除任何 WLAN 配置(包括並非由其創建的配置)的權限。
  • 通過添加 Google 帳戶下載設備規範控制器:向托管環境以外的設備添加需要通過設備規範控制器 (DPC) 應用管理的 Google 帳戶時,帳戶添加流程現在會提示用戶安裝相應的 WPC。在設備初始設置向導中通過 Settings > Accounts添加帳戶時,也會出現此行為。
  • 對特定 DevicePolicyManager API 行為的變更:
    • 調用 setCameraDisabled() 方法只會影響調用該方法的用戶的相機;從托管配置文件調用它不會影響主用戶運行的相機應用。
    • 此外,setKeyguardDisabledFeatures() 方法現在除了可供設備所有者使用外,還可供配置文件所有者使用。
    • 配置文件所有者可設置以下鍵盤鎖限制:
      • KEYGUARD_DISABLE_TRUST_AGENTSKEYGUARD_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)中曾經存在的 Device initializer API 現已刪除
    • EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS 已刪除,因此 NFC 占位配置無法通過編程解鎖受恢復出廠設置保護的設備
    • 您現在可以使用 EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE extra 在對托管設備進行 NFC 配置期間向設備所有者應用傳遞數據。
    • Android for Work API 針對 M 運行時權限(包括 Work 配置文件、輔助層及其他內容)進行了優化。新增的 DevicePolicyManager 權限 API 不會影響 M 之前版本的應用。
    • 當用戶退出通過 ACTION_PROVISION_MANAGED_PROFILEACTION_PROVISION_MANAGED_DEVICE intent 發起的設置流程的同步部分時,系統現在會返回 RESULT_CANCELED 結果代碼。
  • 對其他 API 的變更
    • 流量消耗:android.app.usage.NetworkUsageStats 類已重命名為 NetworkStats
  • 對全局設置的變更
    • 這些設置不再通過 setGlobalSettings() 進行設置:
      • BLUETOOTH_ON
      • DEVELOPMENT_SETTINGS_ENABLED
      • MODE_RINGER
      • NETWORK_PREFERENCE
      • WIFI_ON
    • 這些全局設置現在可通過 setGlobalSettings() 進行設置:
      • WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN

Android 6.0 變更