天天看點

Android5.0、6.0、7.0的新特性 Android 6.0 Android 6.0 Android 7.0

通過goole官網摘要

Android 6.0

Android Runtime (ART)

在 Android 5.0 中,ART 運作時取代 Dalvik 成為平台預設設定。Android 4.4 中已引入處于實驗階段的 ART 運作時。

有關 ART 的新功能概述,請參閱 ART 簡介。部分主要的新功能包括:

  • 預先 (AOT) 編譯
  • 改進的垃圾回收 (GC)
  • 改進的調試支援

大多數 Android 應用無需任何更改就可以在 ART 下工作。不過,部分适合 Dalvik 的技術并不适用于 ART。如需了解有關最重要問題的資訊,請參閱在 Android Runtime (ART) 上驗證應用行為。如存在以下情況,應特别注意:

  • 您的應用使用 Java 原生接口 (JNI) 運作 C/C++ 代碼。
  • 您使用生成非标準代碼的開發工具(例如,一些代碼混淆工具)。
  • 您使用與壓縮垃圾回收不相容的技術

通知

請確定您的通知考慮了上述 Android 5.0 變更。要詳細了解如何為 Android 5.0 及更高版本設計通知,請參閱通知設計指南。

Material Design 樣式

在白色(或非常淺)的背景上使用深色文本繪制通知,以便與新的 Material Design 小部件比對。請確定您的所有通知都與新的配色方案協調一緻。如果您的通知看上去不協調,請進行修正:

  • 使用 

    setColor()

     在您的圖示圖像後面的圓形中設定重點色彩。
  • 更新或移除使用色彩的資源。系統在操作圖示和主要通知圖示中忽略所有非阿爾法通道。您應假設這些圖示僅支援阿爾法通道。系統用白色繪制通知圖示,用深灰色繪制操作圖示。

聲音和振動

如果您目前使用 

Ringtone

MediaPlayer

 或 

Vibrator

 類向通知中添加聲音和振動,則移除此代碼,以便系統可以在“優先”模式中正确顯示通知。取而代之的是,使用 

Notification.Builder

 方法添加聲音和振動。

将裝置設為 

RINGER_MODE_SILENT

 可使裝置進入新的優先模式。如果您将裝置設為 

RINGER_MODE_NORMAL

 或 

RINGER_MODE_VIBRATE

,則裝置将退出優先模式。

以前,Android 使用 

STREAM_MUSIC

 作為主流式傳輸來控制平闆電腦裝置上的音量。在 Android 5.0 中,手機和平闆電腦裝置的主音量流式傳輸現已合并,由 

STREAM_RING

 或 

STREAM_NOTIFICATION

 進行控制。

鎖定螢幕可見性

預設情況下,在 Android 5.0 中,通知現在顯示在使用者的鎖定螢幕上。使用者可以選擇保護敏感資訊不被公開,在此情況下,系統會自動删減通知顯示的文本。要自定義此删減的通知,請使用 

setPublicVersion()

如果通知不包含個人資訊,或者您想允許媒體播放控件顯示在通知上,則調用 

setVisibility()

 方法并将通知的可見性級别設為 

VISIBILITY_PUBLIC

媒體播放

如果您要實作顯示媒體播放狀态或傳輸控件的通知,請考慮使用新的 

Notification.MediaStyle

 模闆,而不是自定義 

RemoteViews.RemoteView

 對象。無論您選擇使用哪個方法,請務必将通知的可見性設為 

VISIBILITY_PUBLIC

,以便可通過鎖定螢幕通路您的控件。請注意,從 Android 5.0 開始,系統不再将 

RemoteControlClient

 對象顯示在鎖定螢幕上。如需了解詳細資訊,請參閱如果您的應用使用 RemoteControlClient。

浮動通知

現在,當裝置處于活動狀态時(即,裝置未鎖定且其螢幕已打開),通知可以顯示在小型浮動視窗中(也稱為“浮動通知”)。這些通知看上去類似于精簡版的通知,隻是浮動通知還顯示操作按鈕。使用者可以在不離開目前應用的情況下處理或清除浮動通知。

可能觸發浮動通知的條件示例包括:

  • 使用者的 Activity 處于全屏模式中(應用使用 

    fullScreenIntent

  • 通知具有較高的優先級并使用鈴聲或振動

如果您的應用在以上任何情形下實作通知,請確定系統正确顯示浮動通知。

媒體控件和 RemoteControlClient

RemoteControlClient

 類現已棄用。請盡快切換到新的 

MediaSession

 API。

Android 5.0 中的鎖定螢幕不會為 

MediaSession

 或 

RemoteControlClient

 顯示傳輸控件。不過,您的應用可以通過一個通知從鎖定螢幕提供媒體播放控件。這讓您的應用可以對媒體按鈕的顯示進行更多控制,同時為使用鎖定裝置和未鎖定裝置的使用者提供一緻的體驗。

為實作此目的,Android 5.0 引入了一個新的 

Notification.MediaStyle

 模闆。

Notification.MediaStyle

 将您使用 

Notification.Builder.addAction()

 添加的通知操作轉換為精簡按鈕,嵌入到應用的媒體播放通知中。将您的會話令牌傳遞到 

setSession()

 方法以告知系統該通知控制進行中的媒體會話。

請務必将通知的可見性設為 

VISIBILITY_PUBLIC

,以将通知标記為安全,進而顯示在任何鎖定螢幕上(以安全方式或其他方式)。如需了解詳細資訊,請參閱鎖定螢幕通知。

要讓應用在 Android TV 或 Wear 平台上運作時顯示媒體播放控件,則實作 

MediaSession

 類。如果您的應用需要在 Android 裝置上接收媒體按鈕事件,您還應實作 

MediaSession

getRecentTasks()

Android 5.0 中引入新的“并發文檔和 Activity 任務”功能後(請參閱下文最近使用的應用螢幕中的并發文檔和 Activity),為提升使用者隐私的安全性,現已棄用 

ActivityManager.getRecentTasks()

 方法。對于向後相容性,此方法仍會傳回它的一小部分資料,包括調用應用自己的任務和可能的一些其他非敏感任務(如首頁)。如果您的應用使用此方法檢索它自己的任務,則改用 

getAppTasks()

 檢索該資訊。

Android NDK 中的 64 位支援

Android 5.0 引入了對 64 位系統的支援。64 位增強功能可增加位址空間和提升性能,同時仍完全支援現有的 32 位應用。64 位支援也可改進用于加密的 OpenSSL 的性能。此外,該版本還引入了新的原生媒體 NDK API,以及原生 OpenGL ES (GLES) 3.1 支援。

要使用 Android 5.0 中提供的 64 位支援,請從 Android NDK 頁面下載下傳和安裝 NDK Revision 10c。有關對 NDK 進行的重要變更和問題修複的更多資訊,請參閱 Revision 10c 版本說明。

綁定到服務

Context.bindService()

 方法現在需要顯式 

Intent

,如果提供隐式 intent,将引發異常。為確定應用的安全性,請使用顯式 intent 啟動或綁定 

Service

,且不要為服務聲明 intent 過濾器。

WebView

Android 5.0 更改了應用的預設行為。

  • 如果您的應用是面向 API 級别 21 或更進階别:
    • 預設情況下,系統會阻止混合内容和第三方 Cookie。要允許混合内容和第三方 Cookie,請分别使用 

      setMixedContentMode()

       和 

      setAcceptThirdPartyCookies()

       方法。
    • 系統現在可以智能地選擇要繪制的 HTML 文檔部分。這個新的預設行為有助于減少記憶體占用和提升性能。如果您要一次渲染整個文檔,可通過調用 

      enableSlowWholeDocumentDraw()

       停用此優化。
  • 如果您的應用是面向低于 21 的 API 級别:系統允許混合内容和第三方 Cookie,并始終一次渲染整個文檔。

自定義權限唯一性要求

根據權限概述中所述,Android 應用可以定義以專有方式管理元件通路權限的自定義權限,無需使用平台預定義的系統權限。應用在其清單檔案中聲明的 

<permission>

 元素中定義自定義權限。

少數情況下定義自定義權限是合規且安全的方法。不過,建立自定義權限有時并無必要,甚至可能會給應用帶來潛在風險,具體取決于配置設定給權限的保護級别。

Android 5.0 其中一項行為變更確定隻有一個應用可以定義給定自定義權限,除非使用與定義權限的其他應用相同的密鑰進行簽名。

使用重複的自定義權限的應用

任何應用都可以定義它需要的任何自定義權限,是以,可能會出現多個應用定義相同的自定義權限的情況。例如,如果兩個應用提供相似的功能,它們可能會為其自定義權限派生出相同的邏輯名稱。應用可能還納入了本身包含相同自定義權限定義的通用公共庫或代碼示例。

在 Android 4.4 和更早的版本中,使用者可以在給定裝置上安裝多個此類應用,不過系統會配置設定由第一個安裝的應用指定的保護級别。

從 Android 5.0 開始,對于使用不同密鑰簽名的應用,系統會強制執行新的自定義權限唯一性限制。現在,裝置上隻有一個應用可以定義給定的自定義權限(按其名稱确定),除非定義此權限的其他應用使用相同密鑰簽名。如果使用者嘗試安裝的應用具有重複自定義權限且簽名密鑰不同于定義此權限的駐留應用,則系統将阻止安裝。

您的應用需要注意的事項

在 Android 5.0 和更新的版本中,應用可以和以前一樣繼續定義自己的自定義權限,并通過 

<uses-permission>

 機制請求其他應用的自定義權限。不過,對于 Android 5.0 中引入的新要求,您應仔細評估可能給您的應用帶來的影響。

下面是一些需要考慮的因素:

  • 您的應用是否在其清單檔案中聲明任何 

    <permission>

     元素?如果是,那麼這些權限是否确實是您的應用或服務正常運作不可或缺的?或者,能否使用系統預設權限代替它們?
  • 如果您的應用中具有 

    <permission>

     元素,您是否知道它們來自哪裡?
  • 您實際上是否打算讓其他應用通過 

    <uses-permission>

     請求您的自定義權限?
  • 您是否在您包含 

    <permission>

     元素的應用中使用樣闆檔案或示例代碼?那些權限元素确實是不可或缺的嗎?
  • 您的自定義權限使用的名稱是簡單名稱還是基于其他應用可能共享的通用術語?

新安裝和更新

如上所述,在運作 Android 4.4 或更早版本的裝置上新安裝和更新您的應用不會受影響,且行為沒有任何變化。在運作 Android 5.0 或更新版本的裝置上進行新安裝和更新時,如果應用定義一個已由現有駐留應用定義的自定義權限,則系統會阻止安裝您的應用。

使用 Android 5.0 系統更新的現有安裝

如果您的應用使用自定義更新且已廣泛分發和安裝,那麼,當使用者收到将裝置更新到 Android 5.0 的更新時,您的應用可能會受影響。在安裝系統更新後,系統重新驗證已安裝的應用,包括檢查它們的自定義權限。如果您的應用定義一個已由另一個通過驗證的應用定義的自定義權限,且您的應用沒有使用與該應用相同的密鑰簽名,則系統不會重新安裝您的應用。

建議

在運作 Android 5.0 或更新版本的裝置上,我們建議您立即檢查您的應用,進行任何所需的調整,并盡快向您的使用者釋出更新版本。

  • 如果您在應用中使用自定義權限,則考慮它們的來源以及您是否确實需要它們。從您的應用中移除所有 

    <permission>

     元素,除非您确定它們是應用正常運作所必需的元素。
  • 盡可能考慮使用系統預設權限替代您的自定義權限。
  • 如果您的應用需要自定義權限,則重命名您的自定義權限,使其成為您的應用獨有的權限,例如,将它們追加到應用的完整軟體包名稱。
  • 如果您有一組使用不同密鑰簽名的應用,且這些應用通過自定義權限通路共享元件,則確定此自定義權限在共享元件中僅定義一次。使用共享元件的應用不應自己定義自定義權限,而應通過 

    <uses-permission>

     機制請求通路權限。
  • 如果您有一組使用相同密鑰簽名的應用,則每個應用都可以根據需要定義相同的 自定義權限, 系統允許以正常方式安裝這些應用。

TLS/SSL 預設配置變更

Android 5.0 針對 HTTPS 和其他 TLS/SSL 通信引入了對應用使用的預設 TLS/SSL 配置的變更:

  • TLSv1.2 和 TLSv1.1 協定現已啟用,
  • AES-GCM (AEAD) 加密套件現已啟用,
  • MD5、3DES、導出和靜态密鑰 ECDH 加密套件現已停用,
  • 首選使用 Forward Secrecy 加密套件(ECDHE 和 DHE)。

在下面列出的少數情況下,這些變更可能會導緻 HTTPS 或 TLS/SSL 連接配接斷開。

請注意,來自 Google Play 服務的安全性 ProviderInstaller 自 Android 2.3 開始就已在 Android 平台版本上提供這些變更。

伺服器不支援任何已啟用的加密套件

例如,伺服器可能僅支援 3DES 或 MD5 加密套件。首選的修複方法是改進伺服器的配置,以啟用更強更現代的加密套件和協定。理想情況下,應啟用 TLSv1.2 和 AES-GCM 以及 Forward Secrecy 加密套件(ECDHE、DHE),且最好使用後者。

也可以修改應用以使用自定義 SSLSocketFactory 與伺服器通信。出廠時應精心設計以建立 SSLSocket 執行個體,除預設加密套件外,此執行個體還應啟用伺服器所需的部分加密套件。

應用對用于連接配接伺服器的加密套件做出錯誤的假設

例如,某些應用包含中斷的自定義 X509TrustManager,因為它預計 authType 參數将成為 RSA,但出現了 ECDHE_RSA 或 DHE_RSA。

伺服器不支援 TLSv1.1、TLSv1.2 或新的 TLS 擴充

例如,與伺服器握手的 TLS/SSL 被錯誤地拒絕或出現停頓。首選的修複方法是更新伺服器以符合 TLS/SSL 協定。這使伺服器可以成功地協商這些更新的協定或協商 TLSv1 或更早的協定,并忽略它不了解的傳輸層安全協定擴充程式。在某些情況下,在伺服器上禁用 TLSv1.1 和 TLSv1.2 可以作為權宜之計,直到更新伺服器軟體。

也可以修改應用以使用自定義 SSLSocketFactory 與伺服器通信。出廠時應精心設計以建立 SSLSocket 執行個體,該執行個體僅包含已啟用且伺服器可以正确為其提供支援的協定。

支援托管配置檔案

裝置管理者可以向裝置添加托管配置檔案。此配置檔案由管理者所有,讓管理者控制托管配置檔案的同時,允許由使用者控制其自己的個人配置檔案及其存儲空間。此變更會通過下列方式影響您的現有應用的行為。

處理 Intent

裝置管理者可以從托管配置檔案限制對系統應用的通路權限。在此情況下,如果應用從托管檔案觸發一個通常由該應用處理的 intent,且托管檔案上沒有适合此 intent 的處理程式,則此 intent 會引發異常。例如,裝置管理者可以限制托管配置檔案上的應用通路系統的相機應用。如果您的應用在托管配置檔案上運作,并為 

MediaStore.ACTION_IMAGE_CAPTURE

 調用 

startActivityForResult()

,且托管配置檔案上沒有可以處理此 intent 的應用,則會導緻 

ActivityNotFoundException

為防止出現此情況,您可以在觸發任何 intent 之前檢查是否至少有一個适合此 intent 的處理程式。要檢查是否存在有效的處理程式,請調用 

Intent.resolveActivity()

。您可以在輕松拍照:使用相機應用拍攝照片中檢視執行上述操作的示例。

在各個配置檔案中共享檔案

每個配置檔案都有自己的檔案存儲空間。檔案 URI 指的是檔案存儲空間中的特定位置,這意味着在一個配置檔案上有效的檔案 URI 在另一個檔案上是無效的。對于隻通路自己建立的檔案的應用而言,這通常不是什麼問題。不過,如果應用向某個 intent 附加檔案,則附加檔案 URI 并不安全,因為在某些情況下,可能會在其他配置檔案上處理該 intent。例如,裝置管理者可能會指定圖像采集事件應由個人配置檔案上的相機應用處理。如果此 intent 由托管配置檔案上的應用觸發,則相機需要能夠将圖像寫入托管配置檔案的應用可以讀取的位置。

為安全起見,如果您需要将檔案附加到某個可能會從一個配置檔案移動到另一個配置檔案的 intent,您應為該檔案建立并使用内容 URI。有關共享檔案及内容 URI 的更多資訊,請參閱共享檔案。例如,裝置管理者可能會制定将由個人配置檔案中的相機處理的 

ACTION_IMAGE_CAPTURE

 白名單。觸發的 intent 的 

EXTRA_OUTPUT

 應包含指定照片應存儲在何處的内容 URI。相機應用可以将圖像寫入該 URI 指定的位置,觸發 intent 的應用将能夠讀取該檔案,即使應用位于其他配置檔案上。

已移除鎖定螢幕小部件支援

Android 5.0 移除了對鎖定螢幕小部件的支援;它繼續為主螢幕上的小元件提供支援。

Android 6.0

運作時權限

此版本引入了一種新的權限模式,如今,使用者可直接在運作時管理應用權限。這種模式讓使用者能夠更好地了解和控制權限,同時為應用開發者精簡了安裝和自動更新過程。使用者可為所安裝的各個應用分别授予或撤銷權限。

對于以 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,或靜态連結到您選擇的加密庫。

硬體辨別符通路權

為給使用者提供更嚴格的資料保護,從此版本開始,對于使用 WLAN API 和 Bluetooth API 的應用,Android 移除了對裝置本地硬體辨別符的程式設計通路權。

WifiInfo.getMacAddress()

 方法和 

BluetoothAdapter.getAddress()

 方法現在會傳回常量值 

02:00:00:00:00:00

現在,要通過藍牙和 WLAN 掃描通路附近外部裝置的硬體辨別符,您的應用必須擁有 

ACCESS_FINE_LOCATION

 或 

ACCESS_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_MUTE

 或 

ADJUST_UNMUTE

文本選擇

Android5.0、6.0、7.0的新特性 Android 6.0 Android 6.0 Android 7.0

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

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

  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 的應用程序一般會被授予較高的優先級,進而使相機資源的擷取和使用更加可靠;
  • 當高優先級的應用嘗試使用相機時,系統可能會“驅逐”正在使用相機用戶端的低優先級應用。在已棄用的 

    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_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

  • 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_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)中曾經存在的 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_PROFILE

       或 

      ACTION_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 7.0

Android 7.0 除了提供諸多新特性和功能外,還對系統和 API 行為做出了各種變更。本文重點介紹您應該了解并在開發應用時加以考慮的一些主要變更。

如果您之前釋出過 Android 應用,請注意您的應用可能受到這些平台變化的影響。

電池和記憶體

Android 7.0 包括旨在延長裝置電池壽命和減少 RAM 使用的系統行為變更。這些變更可能會影響您的應用通路系統資源,以及您的應用通過特定隐式 intent 與其他應用互動的方式。

低電耗模式

Android 6.0(API 級别 23)引入了低電耗模式,當使用者裝置未插接電源、處于靜止狀态且螢幕關閉時,該模式會推遲 CPU 和網絡活動,進而延長電池壽命。而 Android 7.0 則通過在裝置未插接電源且螢幕關閉狀态下、但不一定要處于靜止狀态(例如使用者外出時把手持式裝置裝在口袋裡)時應用部分 CPU 和網絡限制,進一步增強了低電耗模式。

Android5.0、6.0、7.0的新特性 Android 6.0 Android 6.0 Android 7.0

圖 1. 低電耗模式如何應用第一級系統活動限制以延長電池壽命的圖示。

當裝置處于充電狀态且螢幕已關閉一定時間後,裝置會進入低電耗模式并應用第一部分限制:關閉應用網絡通路、推遲作業和同步。如果進入低電耗模式後裝置處于靜止狀态達到一定時間,系統則會對 

PowerManager.WakeLock

AlarmManager

 鬧鈴、GPS 和 WLAN 掃描應用餘下的低電耗模式限制。無論是應用部分還是全部低電耗模式限制,系統都會喚醒裝置以提供簡短的維護時間視窗,在此視窗期間,應用程式可以通路網絡并執行任何被推遲的作業/同步。

Android5.0、6.0、7.0的新特性 Android 6.0 Android 6.0 Android 7.0

圖 2. 低電耗模式如何在裝置處于靜止狀态達到一定時間後應用第二級系統活動限制的圖示。

請注意,激活螢幕或插接裝置電源時,系統将退出低電耗模式并移除這些處理限制。此項新增的行為不會影響有關使您的應用适應 Android 6.0(API 級别 23)中所推出的舊版本低電耗模式的建議和最佳做法,如對低電耗模式和應用待機模式進行針對性優化中所讨論。您仍應遵循這些建議(例如使用 Google 雲消息傳遞 (GCM) 發送和接收消息)并開始安排更新計劃以适應新增的低電耗模式行為。

Project Svelte:背景優化

Android 7.0 移除了三項隐式廣播,以幫助優化記憶體使用和電量消耗。此項變更很有必要,因為隐式廣播會在背景頻繁啟動已注冊偵聽這些廣播的應用。删除這些廣播可以顯著提升裝置性能和使用者體驗。

移動裝置會經曆頻繁的連接配接變更,例如在 WLAN 和移動資料之間切換時。目前,可以通過在應用清單中注冊一個接收器來偵聽隐式 

CONNECTIVITY_ACTION

 廣播,讓應用能夠監控這些變更。由于很多應用會注冊接收此廣播,是以單次網絡切換即會導緻所有應用被喚醒并同時處理此廣播。

同理,在之前版本的 Android 中,應用可以注冊接收來自其他應用(例如相機)的隐式 

ACTION_NEW_PICTURE

 和 

ACTION_NEW_VIDEO

 廣播。當使用者使用相機應用拍攝照片時,這些應用即會被喚醒以處理廣播。

為緩解這些問題,Android 7.0 應用了以下優化措施:

  • 面向 Android 7.0 開發的應用不會收到 

    CONNECTIVITY_ACTION

     廣播,即使它們已有清單條目來請求接受這些事件的通知。在前台運作的應用如果使用 

    BroadcastReceiver

     請求接收通知,則仍可以在主線程中偵聽 

    CONNECTIVITY_CHANGE

  • 應用無法發送或接收 

    ACTION_NEW_PICTURE

     或 

    ACTION_NEW_VIDEO

     廣播。此項優化會影響所有應用,而不僅僅是面向 Android 7.0 的應用。

如果您的應用使用任何 intent,您仍需要盡快移除它們的依賴關系,以正确适配 Android 7.0 裝置。Android 架構提供多個解決方案來緩解對這些隐式廣播的需求。例如,

JobScheduler

 API 提供了一個穩健可靠的機制來安排滿足指定條件(例如連入無限流量網絡)時所執行的網絡操作。您甚至可以使用 

JobScheduler

 來适應内容提供程式變化。

如需了解有關 Android N 中背景優化以及如何改寫應用的詳細資訊,請參閱背景優化。

權限更改

Android 7.0 做了一些權限更改,這些更改可能會影響您的應用。

系統權限更改

為了提高私有檔案的安全性,面向 Android 7.0 或更高版本的應用私有目錄被限制通路 (

0700

)。此設定可防止私有檔案的中繼資料洩漏,如它們的大小或存在性。此權限更改有多重副作用:

  • 私有檔案的檔案權限不應再由所有者放寬,為使用 

    MODE_WORLD_READABLE

     和/或 

    MODE_WORLD_WRITEABLE

     而進行的此類嘗試将觸發 

    SecurityException

    注:迄今為止,這種限制尚不能完全執行。應用仍可能使用原生 API 或 

    File

     API 來修改它們的私有目錄權限。但是,我們強烈反對放寬私有目錄的權限。
  • 傳遞軟體包網域外的 

    file://

     URI 可能給接收器留下無法通路的路徑。是以,嘗試傳遞 

    file://

     URI 會觸發 

    FileUriExposedException

    。分享私有檔案内容的推薦方法是使用 

    FileProvider

  • DownloadManager

     不再按檔案名分享私人存儲的檔案。舊版應用在通路 

    COLUMN_LOCAL_FILENAME

     時可能出現無法通路的路徑。面向 Android 7.0 或更高版本的應用在嘗試通路 

    COLUMN_LOCAL_FILENAME

     時會觸發 

    SecurityException

    。通過使用 

    DownloadManager.Request.setDestinationInExternalFilesDir()

     或 

    DownloadManager.Request.setDestinationInExternalPublicDir()

     将下載下傳位置設定為公共位置的舊版應用仍可以通路 

    COLUMN_LOCAL_FILENAME

     中的路徑,但是我們強烈反對使用這種方法。對于由 

    DownloadManager

     公開的檔案,首選的通路方式是使用

    ContentResolver.openFileDescriptor()

在應用間共享檔案

對于面向 Android 7.0 的應用,Android 架構執行的 

StrictMode

 API 政策禁止在您的應用外部公開 

file://

 URI。如果一項包含檔案 URI 的 intent 離開您的應用,則應用出現故障,并出現 

FileUriExposedException

 異常。

要在應用間共享檔案,您應發送一項 

content://

 URI,并授予 URI 臨時通路權限。進行此授權的最簡單方式是使用 

FileProvider

 類。如需了解有關權限和共享檔案的詳細資訊,請參閱共享檔案。

無障礙改進

為提高平台對于視力不佳或視力受損使用者的易用性,Android 7.0 做出了一些更改。這些更改一般并不要求更改您的應用代碼,不過您應仔細檢查并使用您的應用測試這些功能,以評估它們對使用者體驗的潛在影響。

螢幕縮放

Android 7.0 支援使用者設定顯示尺寸,以放大或縮小螢幕上的所有元素,進而提升裝置對視力不佳使用者的可通路性。使用者無法将螢幕縮放至低于最小螢幕寬度 sw320dp,該寬度是 Nexus 4 的寬度,也是正常中等大小手機的寬度。

Android5.0、6.0、7.0的新特性 Android 6.0 Android 6.0 Android 7.0
Android5.0、6.0、7.0的新特性 Android 6.0 Android 6.0 Android 7.0

圖 3. 右側螢幕顯示的是一台運作 Android 7.0 系統映像的裝置增大顯示尺寸後的效果。

當裝置密度發生更改時,系統會以如下方式通知正在運作的應用:

  • 如果是面向 API 級别 23 或更低版本系統的應用,系統會自動終止其所有背景程序。這意味着如果使用者切換離開此類應用,轉而打開 Settings 螢幕并更改 Display size 設定,則系統會像處理記憶體不足的情況一樣終止該應用。如果應用具有任何前台程序,則系統會如處理運作時更改中所述将配置變更通知給這些程序,就像對待裝置螢幕方向變更一樣。
  • 如果是面向 Android 7.0 的應用,則其所有程序(前台和背景)都會收到有關配置變更的通知,如處理運作時更改中所述。

大多數應用并不需要進行任何更改即可支援此功能,不過前提是這些應用遵循 Android 最佳做法。具體要檢查的事項:

  • 在螢幕寬度為 

    sw320dp

     的裝置上測試您的應用,并確定其充分運作。
  • 當裝置配置發生變更時,更新任何與密度相關的緩存資訊,例如緩存位圖或從網絡加載的資源。當應用從暫停狀态恢複運作時,檢查配置變更。

    注:如果您要緩存與配置相關的資料,則最好也包括相關中繼資料,例如該資料對應的螢幕尺寸或像素密度。儲存這些中繼資料便于您在配置變更後決定是否需要重新整理緩存資料。

  • 避免用像素機關指定尺寸,因為像素不會随螢幕密度縮放。應改為使用與密度無關像素 (

    dp

    ) 機關指定尺寸。

設定向導中的視覺設定

Android 7.0 在“Welcome”螢幕中加入了“Vision Settings”,使用者可以在新裝置上設定以下無障礙功能設定:Magnification gesture、Font size、Display size 和話語提示。此項變更讓您可以更容易發現與不同螢幕設定有關的錯誤。要評估此功能的影響,您應在啟用這些設定的狀态下測試應用。您可以在 Settings > Accessibility 中找到這些設定。

NDK 應用連結至平台庫

從 Android 7.0 開始,系統将阻止應用動态連結非公開 NDK 庫,這種庫可能會導緻您的應用崩潰。此行為變更旨在為跨平台更新和不同裝置提供統一的應用體驗。即使您的代碼可能不會連結私有庫,但您的應用中的第三方靜态庫可能會這麼做。是以,所有開發者都應進行相應檢查,確定他們的應用不會在運作 Android 7.0 的裝置上崩潰。如果您的應用使用原生代碼,則隻能使用公開 NDK API。

您的應用可通過以下三種方式嘗試通路私有平台 API:

  • 您的應用直接通路私有平台庫。您應更新您的應用以添加該應用的庫副本,或使用公開 NDK API。
  • 您的應用使用一個可通路私有平台庫的第三方庫。即使您确定您的應用不會直接通路私有庫,您仍應針對此情景測試您的應用。
  • 您的應用引用一個其 APK 中未包含的庫。例如,如果您嘗試使用您自己的 OpenSSL 副本,但忘記将它與應用的 APK 進行捆綁,則可能會出現此情況。正常情況下,此應用可在包含 

    libcrypto.so

     的 Android 平台版本上運作。不過,此應用在不包含此庫的新版 Android(例如,Android 6.0 和更高的版本)上會崩潰。為修複此問題,請確定您的 APK 捆綁您的所有非 NDK 庫。

應用不應使用 NDK 中未包含的原生庫,因為這些庫可能會發生更改或在不同 Android 版本之間的可用性不同。例如,從 OpenSSL 切換至 BoringSSL 即屬于此類更改。此外,由于不屬于 NDK 中的平台庫沒有相容性要求,是以不同的裝置可能提供不同級别的相容性。

為降低此限制可能對目前釋出的應用的影響,面向 API 級别 23 或更低級别的應用在 Android N 上可暫時通路頗為常用的一組庫,例如 

libandroid_runtime.so

libcutils.so

libcrypto.so

 和 

libssl.so

。如果您的應用加載其中某個庫,logcat 會生成一個警告,并在目标裝置上顯示一個 Toast 來通知您。如果您看到這些警告,您應更新您的應用以添加該應用自己的庫副本,或僅使用公開 NDK API。将來釋出的 Android 平台可能會完全限制對私有庫的使用,并導緻您的應用崩潰。

所有應用在調用既非公開又不可暫時通路的 API 時都會生成一個運作時錯誤。結果就是 

System.loadLibrary

 和 

dlopen(3)

 同時傳回 

NULL

,并可能導緻您的應用崩潰。您應檢查應用代碼以移除對私有平台 API 的使用,并使用預覽版裝置或模拟器全面測試應用。如果您不确定您的應用是否使用私有庫,您可以檢查 logcat 以識别運作時錯誤。

下表描述的是根據應用使用的私有原生庫及其目标 API 級别 (

android:targetSdkVersion

),應用預期顯示的行為。

目标 API 級别 通過動态連結器進行運作時通路 N Developer Preview 行為 最終 Android N 版本行為 未來的 Android 平台行為
公開 NDK 任意 可通路 合乎預期 合乎預期 合乎預期
私有(暫時可通路的私有庫) 23 或更低 暫時可通路 合乎預期,但您會在目标裝置上收到一個 logcat 警告和一條消息。 合乎預期,但您會收到一個 logcat 警告。 運作時錯誤
私有(暫時可通路的私有庫) 24 或更高 受限 運作時錯誤 運作時錯誤 運作時錯誤
私有(其他) 任意 受限 運作時錯誤 運作時錯誤 運作時錯誤

檢查您的應用是否使用私有庫

為幫助您識别加載私有庫的問題,logcat 可能會生成一個警告或運作時錯誤。例如,如果您的應用面向 API 級别 23 或更低級别,并在運作 Android 7.0 的裝置上嘗試通路私有庫,您可能會看到一個類似于下面所示的警告:

03-21 17:07:51.502 31234 31234 W linker  : library "libandroid_runtime.so"
("/system/lib/libandroid_runtime.so") needed or dlopened by
"/data/app/com.popular-app.android-2/lib/arm/libapplib.so" is not accessible
for the namespace "classloader-namespace" - the access is temporarily granted
as a workaround for http://b/26394120
      

這些 logcat 警告通知您哪個庫正在嘗試通路私有平台 API,但不會導緻您的應用崩潰。但是,如果應用面向 API 級别 24 或更進階别,logcat 會生成以下運作時錯誤,您的應用可能會崩潰:

java.lang.UnsatisfiedLinkError: dlopen failed: library "libcutils.so"
("/system/lib/libcutils.so") needed or dlopened by
"/system/lib/libnativeloader.so" is not accessible for the namespace
"classloader-namespace"
  at java.lang.Runtime.loadLibrary0(Runtime.java:977)
  at java.lang.System.loadLibrary(System.java:1602)
      

如果您的應用使用動态連結到私有平台 API 的第三方庫,您可能也會看到上述 logcat 輸出。利用 Android 7.0DK 中的 readelf 工具,您可以通過運作以下指令生成給定 

.so

 檔案的所有動态連結的共享庫清單:

aarch64-linux-android-readelf -dW libMyLibrary.so
      

更新您的應用

通過下面的一些步驟,您可以修複上述類型的錯誤并確定您的應用不會在将來的更新版平台上崩潰:

  • 如果您的應用使用私有平台庫,您應更新它,以添加該應用自己的庫副本或使用公開 NDK API。
  • 如果您的應用使用通路私有符号的第三方庫,則聯系庫作者以更新庫。
  • 請確定将您的所有非 NDK 庫與您的 APK 打包在一起。
  • 使用标準 JNI 函數而非來自 

    libandroid_runtime.so

     的 

    getJavaVM

     和 

    getJNIEnv

    AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h>
    AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or
    JavaVM::AttachCurrentThread from <jni.h>.
          
  • 使用 

    __system_property_get

     而非來自 

    libcutils.so

     的私有 

    property_get

     符号。為此,請使用 

    __system_property_get

    及以下 include 函數:
    #include <sys/system_properties.h>      
    注:系統屬性的可用性和内容未通過 CTS 進行測試。應執行進一步修複以避免同時使用這些屬性。
  • 使用來自 

    libcrypto.so

     的 

    SSL_ctrl

     符号的本地版本。例如,您應在您的 

    .so

     檔案中靜态連結 

    libcyrpto.a

    ,或從 BoringSSL/OpenSSL 添加一個動态連結的 

    libcrypto.so

     版本,并将其打包到您的 APK 中。

Android for Work

Android 7.0 包含一些針對面向 Android for Work 的應用的變更,包括對證書安裝、密碼重置、二級使用者管理、裝置辨別符通路權限的變更。如果您是要針對 Android for Work 環境開發應用,則應仔細檢查這些變更并相應地修改您的應用。

  • 您必須先安裝授權證書安裝程式,然後 DPC 才能對其進行設定。對于面向 N SDK 的配置檔案和裝置所有者應用,您應在裝置規範控制器 (DPC) 調用 

    DevicePolicyManager.setCertInstallerPackage()

     之前安裝授權證書安裝程式。如果尚未安裝此安裝程式,則系統會引發 

    IllegalArgumentException

  • 針對裝置管理者的重置密碼限制現在也适用于配置檔案所有者。裝置管理者無法再使用 

    DevicePolicyManager.resetPassword()

     來清除或更改已經設定的密碼。裝置管理者仍可以設定密碼,但隻能在裝置沒有密碼、PIN 碼或圖案時這樣做。
  • 即使設定了限制,裝置所有者和配置檔案所有者仍可以管理帳戶。而且,即使具有 

    DISALLOW_MODIFY_ACCOUNTS

     使用者限制,裝置所有者和配置檔案所有者仍可調用 Account Management API。
  • 裝置所有者可以更輕松地管理二級使用者。當裝置在裝置所有者模式下運作時,系統将自動設定 

    DISALLOW_ADD_USER

     限制。這樣可以防止使用者建立非托管二級使用者。此外,

    CreateUser()

     和 

    createAndInitializeUser()

     方法已棄用,取而代之的是 

    DevicePolicyManager.createAndManageUser()

     方法。
  • 裝置所有者可以通路裝置辨別符。裝置所有者可以使用 

    DevicePolicyManagewr.getWifiMacAddress()

     通路裝置的 WLAN MAC 位址。如果裝置上從未啟用 WLAN,則此方法将傳回一個 

    null

     值。
  • 工作模式設定控制工作應用通路。當工作模式關閉時,系統啟動器通過使工作應用顯示為灰色來訓示它們不可用。啟用工作模式會再次恢複正常行為。
  • 從 Settings UI 安裝包含用戶端證書鍊和對應的私鑰的 PKCS #12 檔案時,系統不再将該證書鍊中的 CA 證書安裝到受信任的憑據存儲空間。當應用稍後嘗試檢索用戶端證書鍊時,這不會影響 

    KeyChain.getCertificateChain()

     的結果。如果需要,使用 .crt 或 .cer 檔案擴充名的 DER 編碼格式通過 Settings UI 單獨将 CA 證書安裝到受信任的憑據存儲空間。
  • 從 Android 7.0 開始,可針對每個使用者管理指紋登記和存儲空間。如果配置檔案所有者的裝置規範用戶端 (DPC) 面向 Android N 裝置上的 Android N 之前的版本,則使用者仍可以在該裝置上設定指紋,但工作應用不能通路裝置指紋。當 DPC 面向 Android N 和更高版本時,使用者可以通過轉到 Settings > Security > Work profile security 專門為托管配置檔案設定指紋。
  • DevicePolicyManager.getStorageEncryptionStatus()

     傳回新的加密狀态 

    ENCRYPTION_STATUS_ACTIVE_PER_USER

    ,以表明加密處于活動狀态,且加密密鑰與使用者關聯。僅當 DPC 面向 API 級别 24 和更進階别時才會傳回新的狀态。對于面向更早的 API 級别的應用,即使加密密鑰是使用者或配置檔案特有的,系統也會傳回 

    ENCRYPTION_STATUS_ACTIVE

  • 在 Android 7.0 中,如果裝置通過單獨的工作挑戰安裝了托管配置檔案,則原本通常會影響整個裝置的多個方法将會改變其行為方式。這些方法将僅應用于托管配置檔案,而不是影響整個裝置。(此類方法的完整清單位于 

    DevicePolicyManager.getParentProfileInstance()

     文檔中。)例如,

    DevicePolicyManager.lockNow()

     隻鎖定托管配置檔案,而不是鎖定整個裝置。對于上述每個方法,您可以通過對 

    DevicePolicyManager

     的父執行個體調用該方法來擷取以前的行為;您可以通過調用 

    DevicePolicyManager.getParentProfileInstance()

     擷取此父項。例如,如果您調用父執行個體的 

    lockNow()

     方法,則整個裝置将被鎖定。

如需了解有關 Android 7.0 中針對 Android for Work 所做變更的詳細資訊,請參閱 Android for Work 更新。

注解保留

Android 7.0 修複了一個注解可見性被忽略的錯誤。這種問題會導緻應用可在運作時通路原本不允許通路的注解。這些注解包括:

  • VISIBILITY_BUILD

    :僅應編譯時可見。
  • VISIBILITY_SYSTEM

    :運作時應可見,但僅限底層系統。

如果您的應用依賴這種行為,請為運作時必須可用的注解添加保留政策。您可通過使用 

@Retention(RetentionPolicy.RUNTIME)

 來執行此操作。

其他重要說明

  • 如果一個應用在 Android 7.0 上運作,但卻是針對更低 API 級别開發的,那麼在使用者更改顯示尺寸時,系統将終止此應用程序。應用必須能夠妥善處理此情景。否則,當使用者從最近使用記錄中恢複運作應用時,應用将會出現崩潰現象。

    您應測試應用以確定不會發生此行為。要進行此測試,您可以通過 DDMS 手動終止應用,以造成相同的崩潰現象。

    在密度發生更改時,系統不會自動終止面向 N 及更高版本的應用;不過,這些應用仍可能對配置變更做出不良響應。

  • Android 7.0 上的應用應能夠妥善處理配置變更,并且在後續啟動時不會出現崩潰現象。您可以通過更改字型大小 (Setting >Display > Font size) 并随後從最近使用記錄中恢複運作應用,來驗證應用行為。
  • 由于之前的 Android 版本中的一項錯誤,系統未能将對主線程上的一個 TCP 套接字的寫入操作舉報為違反嚴格模式。Android 7.0 修複了此錯誤。呈現出這種行為的應用現在會引發 

    android.os.NetworkOnMainThreadException

    。一般情況下,我們不建議在主線程上執行網絡操作,因為這些操作通常會出現可能導緻 ANR 和卡頓的高尾延遲。
  • Debug.startMethodTracing()

     方法系列現在預設在您的共享存儲空間上的軟體包特定目錄中存儲輸出,而非 SD 卡根目錄。這意味着應用不再需要請求 

    WRITE_EXTERNAL_STORAGE

     權限來使用這些 API 。
  • 許多平台 API 現在開始檢查在 

    Binder

     事務間發送的大負載,系統現在會将 

    TransactionTooLargeExceptions

     作為 

    RuntimeExceptions

     再次引發,而不再隻是默默記錄或抑制它們。一個常見例子是在 

    Activity.onSaveInstanceState()

    上存儲過多資料,導緻 

    ActivityThread.StopInfo

     在您的應用面向 Android 7.0 時引發 

    RuntimeException

  • 如果應用向 

    View

     釋出 

    Runnable

     任務,并且 

    View

     未附加到視窗,系統會用 

    View

     為 

    Runnable

     任務排隊;在 

    View

     附加到視窗之前,不會執行 

    Runnable

     任務。此行為會修複以下錯誤:
    • 如果一項應用是從并非預期視窗 UI 線程的其他線程釋出到 

      View

      ,則 

      Runnable

       可能會是以運作錯誤的線程。
    • 如果 

      Runnable

       任務是從并非環路線程的其他線程釋出,則應用可能會曝光 

      Runnable

       任務。
  • 如果 Android 7.0 上一項有 

    DELETE_PACKAGES

     權限的應用嘗試删除一個軟體包,但另一項應用已經安裝了這個軟體包,則系統需要使用者進行确認。在這種情況下,應用在調用 

    PackageInstaller.uninstall()

     時預計的傳回狀态應為 

    STATUS_PENDING_USER_ACTION

  • 名為 Crypto 的 JCA 提供程式已棄用,因為它僅有的 SHA1PRNG 算法為弱加密。應用無法再使用 SHA1PRNG(不安全地)派生密鑰,因為不再提供此提供程式。如需了解詳細資訊,請參閱博文 Android N 中已棄用“Crypto”安全提供程式