[Android 7.0 開發者版本](https://developer.android.com/about/versions/nougat/android-7.0.html)
Android 7.0 Nougat 為用戶和開發者引入多種新功能。本文重點介紹面向開發者的新功能。
請務必查閱 [Android 7.0 行為變更](https://developer.android.com/about/versions/nougat/android-7.0-changes.html)以了解平臺變更可能影響您的應用的領域。
要詳細了解 Android 7.0 的消費者功能,請訪問 www.android.com。
#### **多窗口支持**
在 Android 7.0 中,我們為該平臺引入了一個新的而且非常需要的多任務處理功能 — 多窗口支持。
現在,用戶可以一次在屏幕上打開兩個應用。
* 在運行 Android 7.0 的手機和平板電腦上,用戶可以并排運行兩個應用,或者處于分屏模式時一個應用位于另一個應用之上。用戶可以通過拖動兩個應用之間的分隔線來調整應用。
* 在 Android TV 設備上,應用可以將自身置于[畫中畫模式](https://developer.android.com/preview/features/picture-in-picture.html),從而讓它們可以在用戶瀏覽或與其他應用交互時繼續顯示內容。

圖 1. 在分屏模式下運行的應用。
多窗口支持為您提供新的吸引用戶方式,特別是在平板電腦和其他更大屏幕的設備上。您甚至可以在您的應用中啟用拖放,從而使用戶可以方便地將內容拖放到您的應用或從其中拖出內容—這是一個非常好的增強用戶體驗的方式。
向您的應用添加多窗口支持并配置多窗口顯示的處理方式非常簡單。例如,您可以指定您的 Activity 允許的最小尺寸,從而防止用戶將 Activity 調整到該尺寸以下。您還可以為應用停用多窗口顯示,這可確保系統將僅以全屏模式顯示應用。
如需了解詳細信息,請參閱[多窗口支持](https://developer.android.com/preview/features/multi-window.html)開發者文檔。
#### **通知增強功能**
在 Android 7.0 中,我們重新設計了通知,使其更易于使用并且速度更快。部分變更包括:
* **模板更新**:我們正在更新通知模板,新強調了英雄形象和化身。開發者將能夠充分利用新模板,只需進行少量的代碼調整。
* **消息傳遞樣式自定義**:您可以自定義更多與您的使用 MessagingStyle 類的通知相關的用戶界面標簽。您可以配置消息、會話標題和內容視圖。
* **捆綁通知**:系統可以將消息組合在一起(例如,按消息主題)并顯示組。用戶可以適當地進行拒絕或歸檔等操作。如果您已實現 Android Wear 的通知,那么您已經很熟悉此模式。
* **直接回復**:對于實時通信應用,Android 系統支持內聯回復,以便用戶可以直接在通知界面中快速回復短信。
* **自定義視圖**:兩個新的 API 讓您在通知中使用自定義視圖時可以充分利用系統裝飾元素,如通知標題和操作。

圖 2. 綁定的通知和直接回復。
要了解如何實現新功能的信息,請參閱[通知](https://developer.android.com/preview/features/notification-updates.html)指南。
#### **配置文件指導的 JIT/AOT 編譯**
在 Android 7.0 中,我們添加了即時 (JIT) 編譯器,對 ART 進行代碼分析,讓它可以在應用運行時持續提升 Android 應用的性能。JIT 編譯器對 Android 運行組件當前的 Ahead of Time (AOT) 編譯器進行了補充,有助于提升運行時性能,節省存儲空間,加快應用更新和系統更新速度。
配置文件指導的編譯讓 Android 運行組件能夠根據應用的實際使用以及設備上的情況管理每個應用的 AOT/JIT 編譯。例如,Android 運行組件維護每個應用熱方法的配置文件,并且可以預編譯和緩存這些方法以實現最佳性能。對于應用的其他部分,在實際使用之前不會進行編譯。
除提升應用的關鍵部分的性能外,配置文件指導的編譯還有助于減少整個 RAM 占用,包括關聯的二進制文件。此功能對于低內存設備非常尤其重要。
Android 運行組件在管理配置文件指導的編譯時,可最大程度降低對設備電池的影響。僅當設備處于空閑狀態和充電時才進行編譯,從而可以通過提前執行該工作節約時間和省電。
#### **快速的應用安裝路徑**
Android 運行組件的 JIT 編譯器最實際的好處之一是應用安裝和系統更新的速度。即使在 Android 6.0 中需要幾分鐘進行優化和安裝的大型應用,現在只需幾秒鐘就可以完成安裝。系統更新也變得更快,因為省去了優化步驟。
#### **隨時隨地低電耗模式...**
Android 6.0 推出了低電耗模式,即設備處于空閑狀態時,通過推遲應用的 CPU 和網絡活動以實現省電目的的系統模式,例如,設備放在桌上或抽屜里時。
現在,在 Android 7.0 中,低電耗模式又前進了一步,隨時隨地可以省電。只要屏幕關閉了一段時間,且設備未插入電源,低電耗模式就會對應用使用熟悉的 CPU 和網絡限制。這意味著用戶即使將設備放入口袋里也可以省電。

圖 3. 低電耗模式現在應用限制以延長電池壽命,即使設備未處于靜止狀態。
屏幕關閉片刻后,設備在使用電池時,低電耗模式將限制網絡訪問,同時延遲作業和同步。在短暫的維護時間范圍后,其允許應用訪問網絡,并執行延遲的作業/同步。打開屏幕或將設備插入電源會使設備退出低電耗模式。
當設備再次處于靜止狀態時,屏幕關閉且使用電池一段時間,低電耗模式針對 PowerManager.WakeLock、AlarmManager 警報和 GPS/WLAN 掃描應用完整 CPU 和網絡限制。
無論設備是否處于運動狀態,將應用調整到低電耗模式的最佳做法均相同,因此,如果您已更新應用以妥善處理低電耗模式,則一切就緒。如果不是,請立即開始將應用調整到低電耗模式。
#### **Project Svelte:后臺優化**
Project Svelte 在持續改善,以最大程度減少生態系統中一系列 Android 設備中系統和應用使用的 RAM。在 Android 7.0 中,Project Svelte 注重優化在后臺中運行應用的方式。
后臺處理是大多數應用的一個重要部分。處理得當,可讓您實現非常棒的用戶體驗 — 即時、快速和情境感知。如果處理不得當,后臺處理會毫無必要地消耗 RAM(和電池),同時影響其他應用的系統性能。
自 Android 5.0 發布以來,JobScheduler 已成為執行后臺工作的首選方式,其工作方式有利于用戶。應用可以在安排作業的同時允許系統基于內存、電源和連接情況進行優化。JobScheduler 可實現控制和簡潔性,我們想要所有應用都使用它。
另一個非常好的選擇是 GCMNetworkManager(Google Play 服務的一部分),其在舊版 Android 中提供類似的作業安排和兼容性。
我們在繼續擴展 JobScheduler 和 GCMNetworkManager,以符合多個用例 — 例如,在 Android 7.0 中,現在,您可以基于內容提供程序中的更改安排后臺工作。同時,我們開始棄用一些較舊的模式,這些模式會降低系統性能,特別是低內存設備的系統性能。
在 Android 7.0 中,我們刪除了三個常用隱式廣播 — CONNECTIVITY_ACTION、ACTION_NEW_PICTURE 和ACTION_NEW_VIDEO — 因為這些廣播可能會一次喚醒多個應用的后臺進程,同時會耗盡內存和電池。如果您的應用收到這些廣播,請充分利用 Android 7.0 以遷移到 JobScheduler 和相關的 API。
如需了解詳情,請查看后臺優化文檔。
#### **SurfaceView**
Android 7.0 可同步移動到 SurfaceView 類,此類在某些情況下提供的電池性能優于 TextureView:在渲染視頻或 3D 內容時,包含滾動和動畫視頻位置的應用在使用 SurfaceView 時比 TextureView 耗電更少。
SurfaceView 類可減少屏幕合成對電池的消耗,因為它是在專用硬件中合成,與應用窗口內容分隔開。因此,它產生的中間副本少于 TextureView。
現在,SurfaceView 對象的內容位置和包含的應用內容同步更新。這一變化導致的一個結果是,在畫面移動時,SurfaceView 中播放的視頻的簡單的平移或縮放不再在畫面側面產生黑條。
從 Android 7.0 開始,我們強烈建議您使用 SurfaceView 代替 TextureView,以實現省電。
#### **流量節省程序**

圖 4. 設置中的流量節省程序
在移動設備的整個生命周期,移動數據網絡計劃的成本通常會超出設備本身的成本。對于許多用戶而言,移動數據網絡是他們想要節省的昂貴資源。
Android 7.0 推出了流量節省模式,這是一項新的系統服務,有助于減少應用使用的移動數據網絡,無論是在漫游,賬單周期即將結束,還是使用少量的預付費數據包。流量節省程序讓用戶可以控制應用使用移動數據網絡的方式,同時讓開發者打開流量節省程序時可以提供更多有效的服務。
用戶在 Settings 中啟用流量節省程序且設備位于按流量計費的網絡上時,系統屏蔽后臺流量消耗,同時指示應用在前臺盡可能使用較少的流量 — 例如,通過限制用于流媒體服務的比特率、降低圖像質量、延遲最佳的預緩沖等方法來實現。用戶可以將特定應用加入白名單以允許后臺按流量計費的流量消耗,即使在打開流量節省程序時也是如此。
Android 7.0 擴展了 ConnectivityManager,以便為應用檢索用戶的流量節省程序首選項并監控首選項變更提供一種方式。所有應用均應檢查用戶是否已啟用流量節省程序并努力限制前臺和后臺流量消耗。
#### **Vulkan API**
Android 7.0 將一項新的 3D 渲染 API Vulkan? 集成到平臺中。就像 OpenGL? ES 一樣,Vulkan 是 3D 圖形和渲染的一項開放標準,由 Khronos Group 維護。
Vulkan 是完全從零開始設計,以最小化驅動器中的 CPU 開銷,并能讓您的應用更直接地控制 GPU 操作。Vulkan 還允許多個線程同時執行工作,如命令緩沖區構建,以獲得更好的并行化。
Vulkan 開發工具和庫都已卷入 Android 7.0DK。它們包括:
* 標頭
* 驗證層(調試庫)
* SPIR-V 著色程序編譯器
* SPIR-V 運行時著色器編譯庫
Vulkan 僅適用于已啟用 Vulkan 硬件的設備上的應用,如 Nexus 5X、Nexus 6P 和 Nexus Player。我們正在與合作伙伴密切合作,以盡快使 Vulkan 能面向更多的設備。
如需了解詳細信息,請參閱 API 文檔。
#### **Quick Settings Tile API**

圖 5. 通知欄中的快速設置圖塊。
“快速設置”通常用于直接從通知欄顯示關鍵設置和操作,非常簡單。在 Android 7.0 中,我們已擴展“快速設置”的范圍,使其更加有用更方便。
我們為額外的“快速設置”圖塊添加了更多空間,用戶可以通過向左或向右滑動跨分頁的顯示區域訪問它們。我們還讓用戶可以控制顯示哪些“快速設置”圖塊以及顯示的位置 — 用戶可以通過拖放圖塊來添加或移動圖塊。
對于開發者,Android 7.0 還添加了一個新的 API,從而讓您可以定義自己的“快速設置”圖塊,使用戶可以輕松訪問您應用中的關鍵控件和操作。
對于急需或頻繁使用的控件和操作,保留“快速設置”圖塊,且不應將其用作啟動應用的快捷方式。
定義圖塊后,您可以將它們顯示給用戶,用戶可通過拖放將圖塊添加到“快速設置”。
如需了解有關創建應用圖塊的信息,請參閱可下載的 [API 參考](https://developer.android.com/preview/setup-sdk.html#docs-dl)中的文件 android.service.quicksettings.Tile。
#### **號碼屏蔽**
Android 7.0 現在支持在平臺中進行號碼屏蔽,提供框架 API,讓服務提供商可以維護屏蔽的號碼列表。默認短信應用、默認手機應用和運營商應用可以對屏蔽的號碼列表進行讀取和寫入操作。其他應用則無法訪問此列表。
通過使號碼屏蔽成為平臺的標準功能,Android 為應用提供一致的方式來支持廣泛的設備上的號碼屏蔽。應用可以利用的其他優勢包括:
* 還會屏蔽已屏蔽的來電號碼發出的短信
* 通過 Backup & Restore(備份和還原)功能可以跨重置和設備保留屏蔽的號碼
* 多個應用可以使用相同的屏蔽號碼列表
此外,通過 Android 的運營商應用集成表示運營商可以讀取設備上屏蔽的號碼列表,并為用戶執行服務端屏蔽,以阻止不需要的來電和短信通過任何介質(如 VOIP 端點或轉接電話)到達用戶。
如需了解詳細信息,請參閱可下載的 API 參考中的 android.provider.BlockedNumberContract。
#### **來電過濾**
Android 7.0 允許默認的手機應用過濾來電。手機應用執行此操作的方式是實現新的 CallScreeningService,該方法允許手機應用基于來電的 Call.Details 執行大量操作,例如:
* 拒絕來電
* 不允許來電到達通話記錄
* 不向用戶顯示來電通知
如需了解詳細信息,請參閱可下載的 API 參考中的 android.telecom.CallScreeningService。
#### **多語言區域支持,更多語言**
Android 7.0 現在允許用戶在設置中選擇多個語言區域,以更好地支持雙語用例。應用可以使用新的 API 獲取用戶選擇的語言區域,然后為多區域設置用戶提供更成熟的用戶體驗 — 如以多個語言顯示搜索結果,并且不會以用戶了解的語言翻譯網頁。
除多語言區域支持外,Android 7.0 還擴展了用戶可用的語言范圍。它針對常用語言提供超過 25 種的變體,如英語、西班牙語、法語和阿拉伯語。它還針對 100 多種新語言添加了部分支持。
應用可以通過調用 LocaleList.GetDefault() 獲取用戶設置的語言區域列表。為支持擴展的語言區域數量,Android 7.0 正在改變其解析資源的方式。請務必使用新的資源解析邏輯測試和驗證您的應用是否能如期運行。
要了解新資源解析行為和應遵循的最佳做法,請參閱[多語言支持](https://developer.android.com/preview/features/multilingual-support.html)。
#### **新增的表情符號**
Android 7.0 引入更多表情符號和表情符號相關功能,包括膚色表情符號和支持變量選擇符。如果您的應用支持表情符號,請遵循以下準則,以便能充分利用這些表情符號相關功能優勢。
* **在插入之前,檢查設備是否包含表情符號**。要檢查系統字體中有哪些表情符號,使用 hasGlyph(String) 方法。
* **檢查表情符號是否支持變量選擇符**。變量選擇符使您能夠呈現一些彩色或黑白的表情符號。在移動設備上,應用應呈現彩色的表情符號,而不是黑白的。但是,如果您的應用顯示嵌入在文本中的表情符號,那應使用黑白變量。要確定表情符號是否有變量,使用變量選擇符。如需有關支持變量的字符的完整清單,請參閱變量的 Unicode 文檔中的表情符號變量序列部分。
* **檢查表情符號是否支持膚色**。Android 7.0 允許用戶按照他們的喜好修改表情符號呈現的膚色。鍵盤應用應為有多個膚色的表情符號提供可視化的指示,并應允許用戶選擇他們喜歡的膚色。要確定哪些系統表情符號有膚色修改器,使用 hasGlyph(String) 方法。您可以通過讀取 Unicode 文檔來確定哪些表情符號使用膚色。
#### **Android 中的 ICU4J API**
Android 7.0 目前在 Android 框架(位于 android.icu 軟件包下)中提供 ICU4J API 的子集。遷移很簡單,主要是需要從 com.java.icu 命名空間更改為 android.icu。如果您已在您的應用中使用 ICU4J 捆綁包,切換到 Android 框架中提供的 android.icu API 可以大量節省 APK 大小。
要詳細了解 Android ICU4J API,請參閱 ICU4J 支持。
#### **WebView**
**Chrome 和 WebView 配合使用**
從 Android 7.0 及更高版本中的 Chrome 版本 51 開始,您的設備中的 Chrome APK 用于提供和渲染 Android 系統 WebView。這種方法改善了設備本身的內存使用率,同時減少保持 WebView 更新所需的帶寬(因為只要保持啟用 Chrome,單機版 WebView APK 將不再進行更新)。
您可以啟用開發者選項和選擇 WebView 實現,選擇您的 WebView 提供商。您可以使用設備上安裝的任何兼容的 Chrome 版本(Dev、Beta 或 Stable)或單機版 Webview APK,作為 WebView 實現。
**多進程**
從 Android 7.0 中的 Chrome 版本 51 開始,WebView 將開發者選項“多進程 WebView”被啟用時,在一個單獨的沙盒進程中運行網頁內容。
我們正在尋求關于 N 中的兼容性和運行時性能的反饋,并隨后將在未來 Android 版本中啟用多進程 WebView。在這個版本中,可預期啟動時間回歸、總內存使用和軟件渲染性能。
如果您在多進程模式中遇到意外問題,請告訴我們。請通過 Chromium 錯誤跟蹤程序聯系 WebView 團隊。
**Javascript 在頁面加載之前運行**
從以 Android 7.0 為目標平臺的應用開始,JavaScript 上下文會在加載新頁面時重置。目前,新 WebView 實例中加載的第一個頁面會繼承上下文。
想要在 WebView 中注入 Javascript 的開發者應在頁面開始加載后執行腳本。
**不安全起點上的地理定位**
從以 Android 7.0 為目標平臺的應用開始,地理定位 API 將僅在安全的起點(通過 HTTPS)上被允許。此政策的目的是在用戶使用不安全連接時保護他們的私人信息。
**測試 WebView 測試版**
WebViewis 定期更新,因此我們建議您經常使用 WebView 的測試版本測試應用的兼容性。要在 Android 7.0 上著手測試 WebView 的預發布版本,請下載并安裝 Chrome Dev 或 Chrome 測試版,然后按上述說明在開發者選項下面選擇它作為 WebView 實現。請通過 Chromium 錯誤跟蹤程序報告問題,以便我們可以在發布新的 WebView 版本前修復問題。
如果您遇到其他任何問題,可隨時通過我們的 G+ 社區與 WebView 團隊聯系。
#### **OpenGL? ES 3.2 API**
Android 7.0 添加了框架接口和對 OpenGL ES 3.2 的平臺支持,包括:
* 來自 Android 擴展包 (AEP) 的所有擴展(EXT_texture_sRGB_decode 除外)。
* 針對 HDR 的浮點幀緩沖和延遲著色。
* BaseVertex 繪圖調用可實現更好的批處理和流媒體服務。
* 強大的緩沖區訪問控制可減少 WebGL 開銷。
Android 7.0 上適用于 OpenGL ES 3.2 的框架 API 與 GLES32 類一起提供。使用 OpenGL ES 3.2 時,請務必通過 <uses-feature> 標記和 android:glEsVersion 屬性在您的清單文件中聲明要求。
如需了解有關使用 OpenGL ES 的信息,包括如何在運行時檢查設備支持的 OpenGL ES 版本,請參閱 OpenGL ES API 指南。
#### **Android TV 錄制**
Android 7.0 通過新的錄制 API 添加了從 Android TV 輸入服務錄制和播放內容的功能。構建在現有時移 API 之上,TV 輸入服務可以控制能夠錄制的渠道數據、保存錄制的會話的方式,同時可通過錄制的內容管理用戶交互。
如需了解詳細信息,請參閱 [Android TV Recording API](https://developer.android.com/preview/features/tv-recording-api.html)。
#### **Android for Work**
Android for Work 針對運行 Android 7.0 的設備添加了許多新功能和 API。部分重要內容如下— 有關變更的完整列表,請參閱 Android for Work 更新。
#### **工作資料安全性挑戰**
面向 N SDK 的配置文件所有者可以為在工作資料中運行的應用指定單獨的安全性挑戰。當用戶嘗試打開任何工作應用時將顯示工作挑戰。成功完成安全性挑戰可解鎖工作資料并將其解密(如果需要)。對于配置文件所有者,ACTION_SET_NEW_PASSWORD 提示用戶設置工作挑戰,ACTION_SET_NEW_PARENT_PROFILE_PASSWORD 提示用戶設置設備鎖。
配置文件所有者可以使用 setPasswordQuality()、setPasswordMinimumLength() 和相關方法針對工作挑戰設置不同的密碼策略(例如,PIN 碼必須多長,或是否可以使用指紋解鎖配置文件)。配置文件所有者還可以使用新的 getParentProfileInstance() 方法返回的 DevicePolicyManager 實例設置設備鎖定。此外,配置文件所有者可以使用新的 setOrganizationColor() 和 setOrganizationName() 方法針對工作挑戰自定義憑據屏幕。
#### **關閉工作**
在有工作資料的設備上,用戶可以切換工作模式。工作模式關閉時,管理的用戶臨時關閉,其停用托管工作資料應用、后臺同步和通知。這包括配置文件所有者應用。關閉工作模式時,系統顯示永久狀態圖標,以提醒用戶他們無法啟動工作應用。啟動器指示該工作應用和小部件無法訪問。
#### **Always on VPN**
設備所有者和配置文件所有者可以確保工作應用始終通過指定的 VPN 連接。系統在設備啟動后自動啟動該 VPN。
新的 DevicePolicyManager 方法為 setAlwaysOnVpnPackage() 和 getAlwaysOnVpnPackage()。
由于 VPN 服務無需應用交互即可由系統直接綁定,因此,VPN 客戶端必須針對 Always on VPN 處理新的入口點。和以前一樣,由與操作 android.net.VpnService 匹配的 intent 過濾器將服務指示給系統。
用戶還可以使用 Settings>More>Vpn 手動設置實現 VPNService 方法的 Always on VPN 客戶端。通過“設置”啟用 Always on VPN 的選項僅在 VPN 客戶端以 API 級別 24 為目標時可用。
#### **自定義配置**
應用可以用企業顏色和徽標來自定義配置文件所有者和設備所有者配置流程。DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR 自定義流程顏色。DevicePolicyManager.EXTRA_PROVISIONING_LOGO_URI 用企業徽標自定義流程。
#### **無障礙增強功能**
Android 7.0 現在針對新的設備設置直接在歡迎屏幕上提供“Vision Settings”。這使用戶可以更容易發現和配置他們設備上的無障礙功能,包括放大手勢、字體大小、顯示屏尺寸和話語提示。
隨著這些無障礙功能更為突出,在啟用這些功能后,您的用戶更可能試用您的應用。請務必提前啟用這些設置測試您的應用。您可以通過 Settings > Accessibility 啟用它們。
還是在 Android 7.0 中,無障礙服務現在可以幫助具有動作障礙的用戶觸摸屏幕。全新的 API 允許使用人臉追蹤、眼球追蹤、點掃描等功能構建服務,以滿足這些用戶的需求。
如需了解詳細信息,請參閱可下載的 API 參考中的 android.accessibilityservice.GestureDescription。
#### **直接啟動**
直接啟動可以縮短設備啟動時間,讓注冊的應用具有有限的功能,即使在意外重啟后。例如,如果當用戶睡覺時加密的設備重啟,那么注冊的警報、消息和來電現在可以和往常一樣繼續通知用戶。這也意味著重啟后無障礙服務會立即可用。
在 Android 7.0 中,直接啟動充分利用基于文件的加密,以針對系統和應用數據啟用細化的加密策略。系統針對選定的系統數據和顯式注冊的應用數據使用設備加密存儲。默認情況下,憑據加密存儲可用于所有其他系統數據、用戶數據、應用及應用數據。
啟動時,系統在受限的模式中啟動,僅訪問設備加密數據,不會對應用或數據進行常規訪問。如果您有想要在此模式下運行的組件,您可以通過在清單中設置標記注冊它們。重啟后,系統通過廣播 LOCKED_BOOT_COMPLETED intent 激活注冊的組件。系統確保注冊的設備加密的應用數據在解鎖前可用。所有其他數據在用戶確認鎖定屏幕憑據進行解密前均不可用。
如需了解詳細信息,請參閱直接啟動。
#### **密鑰認證**
Android 7.0 引入密鑰認證,這是一個新的安全工具,可幫助您確保設備的硬件支持的密鑰庫中存儲的密鑰對適當保護您的應用使用的敏感信息。借助此工具,您可以更加放心地讓您的應用與駐留在安全硬件中的密鑰交互,即使運行您的應用的設備已被破解 root 權限。如果您在應用中使用硬件支持的密鑰庫中的密鑰,您應使用此工具,尤其當您使用密鑰驗證應用中的敏感信息時。
通過密鑰認證,您可以在設備的可信執行環境 (TEE) 中驗證在設備的硬件支持的密鑰庫中創建和存儲的 RSA 或 EC 密鑰對。通過此工具,您還可以使用設備服務,例如您的應用的后端服務器,確定和有效驗證密鑰對的使用和有效性。這些功能為保護密鑰對提供額外的安全級別,即使有人破解設備的 root 權限或損害運行于設備的 Android 平臺的安全。
> 注:僅少部分運行 Android 7.0 的設備支持硬件級密鑰認證;其他所有運行 Android 7.0 的設備則使用軟件級密鑰認證。在生產級環境中驗證設備的硬件支持的密鑰之屬性前,您應確保設備支持硬件級密鑰認證。為此,您應確保認證證書鏈包含由 Google 認證根密鑰簽署的根證書,且密鑰說明數據結構中的 attestationSecurityLevel 元素設置為 TrustedEnvironment 安全級別。
如需了解詳細信息,請參閱密鑰認證開發者文檔。
#### **網絡安全性配置**
在 Android 7.0 中,通過使用說明性“網絡安全性配置”(而不是使用傳統的易出錯的編程 API(例如,X509TrustManager)),應用可以安全地自定義其安全(HTTPS、TLS)連接的行為,無需任何代碼修改。
支持的功能:
* 自定義信任錨。讓應用可以針對安全連接自定義哪些證書頒發機構 (CA) 值得信賴。例如,信任特定的自簽署證書或限制應用信任的公共 CA 集。
* 僅調試重寫。讓應用開發者可以安全調試其應用的安全連接,而不會增加安裝基礎的風險。
* 明文流量選擇退出。讓應用可以防止自身意外使用明文流量。
* 證書固定。這是一項高級功能,讓應用可以針對安全連接限制哪些服務器密鑰受信任。
如需了解詳細信息,請參閱網絡安全性配置。
#### **默認受信任的證書頒發機構**
默認情況下,面向 Android 7.0 的應用僅信任系統提供的證書,且不再信任用戶添加的證書頒發機構 (CA)。如果面向 Android N 的應用希望信任用戶添加的 CA,則應使用網絡安全性配置以指定信任用戶 CA 的方式。
#### **APK signature scheme v2**
Android 7.0 引入一項新的應用簽名方案 APK Signature Scheme v2,它能提供更快的應用安裝時間和更多針對未授權 APK 文件更改的保護。在默認情況下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 會使用 APK Signature Scheme v2 和傳統簽名方案來簽署您的應用。
雖然我們建議您對您的應用采用 APK Signature Scheme v2,但這項新方案并非強制性的。如果您的應用在使用 APK Signature Scheme v2 時不能正確開發,您可以停用這項新方案。禁用過程會導致 Android Studio 2.2 和 Android Plugin for Gradle 2.2 僅使用傳統簽名方案來簽署您的應用。要僅用傳統方案簽署,打開模塊級 build.gradle 文件,然后將行 v2SigningEnabled false 添加到您的版本簽名配置中:
~~~
android {
...
defaultConfig { ... }
signingConfigs {
release {
storeFile file("myreleasekey.keystore")
storePassword "password"
keyAlias "MyReleaseKey"
keyPassword "password"
v2SigningEnabled false
}
}
}
~~~
> 注意:如果您使用 APK Signature Scheme v2 簽署您的應用,并對應用進行了進一步更改,則應用的簽名將無效。出于這個原因,請在使用 APK Signature Scheme v2 簽署您的應用之前、而非之后使用 zipalign 等工具。
如需了解詳細信息,請閱讀相關的 Android Studio 文檔,這些文檔介紹了如何在 Android Studio 中簽署應用以及如何使用 Android Plugin for Gradle 為簽署應用配置構建文件。
#### **作用域目錄訪問**
在 Android 7.0 中,應用可以使用新的 API 請求訪問特定的外部存儲目錄,包括可移動媒體上的目錄,如 SD 卡。新 API 大大簡化了應用訪問標準外部存儲目錄的方式,如 Pictures 目錄。應用(如照片應用)可以使用這些 API(而不是使用 READ_EXTERNAL_STORAGE),其授予所有存儲目錄的訪問權限或存儲訪問框架,從而讓用戶可以導航到目錄。
此外,新的 API 簡化了用戶向應用授予外部存儲訪問權限的步驟。當您使用新的 API 時,系統使用一個簡單的權限 UI,其清楚地詳細介紹應用正在請求訪問的目錄。
如需了解詳細信息,請參閱作用域目錄訪問開發者文檔。
#### **鍵盤快捷鍵輔助工具**
在 Android 7.0 中,用戶可以按“Meta + /”觸發“鍵盤快捷鍵”屏幕,它會顯示的系統和對焦的應用中可用的所有快捷鍵。如果快捷鍵存在,系統自動從應用菜單檢索這些快捷鍵。您也可以為屏幕提供微調的快捷鍵列表。您可以通過重寫新 Activity.onProvideKeyboardShortcuts() 的方法來進行這項操作,如可下載的 API 參考中所述。
> 注:所有鍵盤都沒有 Meta 鍵:在 Macintosh 鍵盤上,它是 Command 鍵;在 Windows 鍵盤上,它是 Windows 鍵;而在 Pixel C 和 Chrome 操作系統鍵盤上,它是 Search 鍵。
要在您的應用的任何地方觸發鍵盤快捷鍵輔助工具,為相關 Activity 調用 Activity.requestKeyboardShortcutsHelper()。
#### **Custom Pointer API**
Android 7.0 引入 Custom Pointer API,以便您可以自定義指針的外觀、 可見性和行為。此功能在用戶使用鼠標或觸控板與 UI 對象交互尤為有用。默認指針使用標準圖標。此 API 還包含多種高級功能,例如根據鼠標或觸控板特定移動情況改變指針圖標外觀。
要設置指針圖標,請替換 View 類的 onResolvePointerIcon() 方法。此方法使用 PointerIcon 對象繪制與特定移動事件對應的圖標。
#### **Sustained Performance API**
長期運行的應用的性能可能會顯著波動,因為系統會阻止系統芯片在設備組件達到溫度限制時啟動。這種波動是建立高性能長期運行應用的應用開發者的移動目標。
為解決這些限制,Android 7.0 包括了對持續性能模式的支持,幫助原始設備制造商 (OEM) 提供關于長期運行應用的設備性能能力的提示。應用開發者可以使用這些提示來根據可預測的一致設備性能水平調整長期應用。
應用開發者只能在 Nexus 6P 設備的 Android 7.0 中嘗試這款新 API。要使用此功能,為您希望以持續性能模式運行的窗口設置持續性能窗口標記。使用 Window.setSustainedPerformanceMode() 方法設置此標記。當窗口不再對焦時,系統會自動停用此模式。
#### **VR 支持**
Android 7.0 添加了新的 VR 模式的平臺支持和優化,以使開發者能為用戶打造高質量移動 VR 體驗。增加了一些性能增強特性,包括允許 VR 應用訪問某個專屬的 CPU 核心。在您的應用中,您可以充分利用到專為 VR 設計的智能頭部跟蹤和立體聲通知功能。最重要的是,Android 7.0 的圖形延時非常低。如需了解有關開發面向 Android 7.0 的 VR 應用的完整信息,請參閱面向 Android 的 Google VR SDK。
#### **打印服務增強**
在 Android 7.0 中,打印服務開發者現在可以公開關于個別打印機和打印作業的其他信息。
在列出各打印機時,打印服務現在可以通過兩種方式來設置按打印機的圖標:
* 您可以通過調用 PrinterInfo.Builder.setResourceIconId() 設置源于資源 ID 的圖標
* 您可以通過調用 PrinterInfo.Builder.setHasCustomPrinterIcon(),并針對使用 android.printservice.PrinterDiscoverySession.onRequestCustomPrinterIcon() 請求圖標的情況設置回調來顯示源自網絡的圖標
此外,您還可以通過調用 PrinterInfo.Builder.setInfoIntent() 提供按打印機活動,以顯示其他信息。
您可以通過分別調用 android.printservice.PrintJob.setProgress() 和 android.printservice.PrintJob.setStatus() 在打印任務通知中指示打印任務的進度和狀態。
如需了解有關這些方法的詳細信息,請參閱可下載的 API 參考。
#### **FrameMetricsListener API**
FrameMetricsListener API 允許應用監測它的 UI 渲染性能。API 通過公開流式傳輸 Pub/Sub API 來提供此能力,以傳遞應用當前窗口的幀計時信息。返回的數據相當于 adb shell dumpsys gfxinfo framestats 顯示的數據,但不限定于在過去的 120 幀內。
您可以使用 FrameMetricsListener 來衡量生產中的交互級 UI 性能,無需 USB 連接。此 API 允許在比 adb shell dumpsys gfxinfo 更高的粒度上收集數據。因為系統可以從應用中的特定交互中收集數據,因此更高的粒度變得可行;系統不需要采集關于完整應用性能的全局概要或清除任何全局狀態。您可以使用這種能力來針對應用的真實使用案例收集性能數據和捕捉 UI 性能回歸。
要監測一個窗口,實現 FrameMetricsListener.onMetricsAvailable() 回調方法,并在窗口上注冊。如需了解詳細信息,請參閱可下載的 API 參考中的 FrameMetricsListener 類文檔。
API 提供了一個包含計時數據的 FrameMetrics 對象,其渲染子系統會在一幀長度內報告各種里程碑。支持的指標有:UNKNOWN_DELAY_DURATION、INPUT_HANDLING_DURATION、ANIMATION_DURATION、LAYOUT_MEASURE_DURATION、DRAW_DURATION、 SYNC_DURATION、COMMAND_ISSUE_DURATION、SWAP_BUFFERS_DURATION、TOTAL_DURATION 和 FIRST_DRAW_FRAME。
#### **虛擬文件**
在較早的 Android 版本中,您的應用可以使用存儲訪問框架來允許用戶從他們的云存儲帳戶中選擇文件,如 Google Drive。但是,不能表示沒有直接字節碼表示的文件;每個文件都必須提供一個輸入流。
Android 7.0 在存儲訪問框架中添加了虛擬文件的概念。虛擬文件功能可以讓您的 DocumentsProvider 返回可與 ACTION_VIEW intent 使用的文件 URI,即使它們沒有直接字節碼表示。Android 7.0 還允許您為用戶文件(虛擬或其他類)提供備用格式。
為獲得您的應用中的虛擬文件的 URI,首先您應創建一個 Intent 以打開文件選擇器 UI。由于應用不能使用 openInputStream() 方法來直接打開一個虛擬文件,因此如果您包括了 CATEGORY_OPENABLE 類別,您的應用不會收到任何虛擬文件。
在用戶選擇之后,系統調用 onActivityResult() 方法。您的應用可以檢索虛擬文件的 URI,并得到一個輸入流,這表現在以下片段中的代碼。
~~~
// Other Activity code ...
final static private int REQUEST_CODE = 64;
// We listen to the OnActivityResult event to respond to the user's selection.
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent resultData) {
try {
if (requestCode == REQUEST_CODE &&
resultCode == Activity.RESULT_OK) {
Uri uri = null;
if (resultData != null) {
uri = resultData.getData();
ContentResolver resolver = getContentResolver();
// Before attempting to coerce a file into a MIME type,
// check to see what alternative MIME types are available to
// coerce this file into.
String[] streamTypes =
resolver.getStreamTypes(uri, "*/*");
AssetFileDescriptor descriptor =
resolver.openTypedAssetFileDescriptor(
uri,
streamTypes[0],
null);
// Retrieve a stream to the virtual file.
InputStream inputStream = descriptor.createInputStream();
}
}
} catch (Exception ex) {
Log.e("EXCEPTION", "ERROR: ", ex);
}
}
~~~
如需了解有關訪問用戶文件的詳細信息,請參閱存儲訪問框架指南。
- 前言
- Google官網對Android API各版本的介紹
- jelly Bean(果凍豆)Android 4.1、4.2、4.3
- Android 4.1
- Android 4.2
- Android 4.3
- KitKat(Android 4.4.*)巧克力
- Android 4.4 APIS
- Lollipop(棒棒糖)Android 5.*
- Android 5.0 APIs
- Android 5.0 Changes(變更)
- Android 5.1APIs
- Marshmallow(棉花糖)Android 6.0
- Android 6.0 APIs
- Android 6.0 Changes(變更)
- Android 6.0 Samples
- Android 6.0 Testing
- Nougat(牛扎塘)Android 7.*
- Android 7.0
- API
- 行為變更
- 示例
- Android 7.1
- 開發者API
- 示例Sample
- Oreo(奧利奧)8.*
- Android 8.0
- 功能和 API
- Android 8.0 行為變更
- 向 Android 8.0 遷移應用
- Android 8.0 示例
- Android 8.1
- 后臺執行限制
- 后臺位置限制
- API指南
- Android 簡介
- 應用基礎知識
- 設備兼容性
- 系統權限
- 請求權限
- 定義權限
- 平臺架構
- Java8 概覽
- 在ART上驗證應用行為
- 應用組件
- Intent 和 Intent 過濾器(Google官網介紹)
- 通用intent
- Activity
- 任務和返回棧(官網譯文)
- 概覽屏幕
- 活動簡介
- 活動生命周期
- 活動狀態更改
- 進程和應用程序生命周期
- 包裹和捆綁
- 最近的屏幕
- 片段
- 加載器
- 服務Service
- 綁定服務
- AIDL
- 內容提供程序
- 內容提供程序基礎知識
- 創建內容提供程序
- 日歷提供程序
- 聯系人提供程序
- 存儲訪問框架
- 使用存儲訪問框架打開文件
- 創建自定義文檔提供程序
- 應用小部件
- 應用小部件主機
- 進程和線程
- 應用資源
- 概覽
- 提供資源
- 訪問資源
- 處理運行時變更
- 本地化
- ICU4J Android框架API
- Android上的國際化
- 語言和語言區域
- 復雜的XML資源
- 資源類型
- 動畫
- 顏色狀態列表
- 可繪制對象
- 布局
- 菜單
- 字符串
- 樣式
- 其他類型
- 應用清單
- <action>
- <activity>
- <activity-alias>
- <application>
- <category>
- <compatiable-screens>
- <data>
- <grant-uri-permission>
- <intent-filter>
- <manifest>
- <meta-data>
- <path-permission>
- <permission>
- <permission-group>
- <permission-tree>
- <provider>
- <receiver>
- <service>
- <supporte-gl-texture>
- <supports-screens>
- <uses-configuration>
- <uses-feature>
- <uses-library>
- <uses-permission>
- <uses-permission-sdk-23>
- <uses-sdk>
- 用戶界面
- 界面概覽
- 界面布局
- 線性布局
- 相對布局
- 列表視圖
- 網格視圖
- 回收站視圖
- 外觀和感覺
- 可下載的字體
- XML中的字體
- 表情符號兼容性
- 自動調整TextView
- 樣式和主題-
- 輸入控件
- 按鈕
- 文本字段
- 復選框
- 單選按鈕
- 切換按鈕
- 微調框
- 選取器
- 輸入事件
- 菜單Menu
- 設置
- 對話框
- 通知
- Toast
- 自適應圖標
- 應用快捷方式
- 搜索
- 創建搜索界面
- 添加近期查詢建議
- 添加自定義建議
- 可搜索配置
- 多窗口支持
- 拖放
- 無障礙功能
- 為應用設置無障礙功能
- 無障礙功能開發者檢查單
- 構建無障礙服務
- 讓應用更容易訪問
- 使用節點樹調試
- 構建可訪問自定義視圖
- 樣式和主題
- 自定義組件
- 動畫和圖形
- 概覽介紹
- 屬性動畫
- 視圖動畫
- 可繪制動畫
- 畫布和可繪制對象
- 基于物理的動畫
- Spring Animation
- Fling Animation
- OpenGL ES
- 硬件加速
- 計算
- RenderScript
- 高級RenderScript
- Runtime API Reference(參考)
- Numerical Types(數字類型)
- Object Types(對象類型)
- Conversion Functions(轉換函數)
- Mathematical Constants and Functions(數學常量和函數)
- Vector Math Functions(矢量數學函數)
- Matrix Functions(矩陣函數)
- Quaternion Functions(四元數函數)
- Atomic Update Functions(原子更新函數)
- Time Functions and Types(時間函數和類型)
- Allocation Data Access Functions(分配數據訪問函數)
- Object Characteristics Functions(對象特性函數)
- Kernel Invocation Functions and Types(內核調用函數和類型)
- Input/Output Functions(輸入輸出函數)
- Debugging Functions(調試函數)
- Graphics Functions and Types(圖形函數和類型)
- Index(索引)
- Media Apps(媒體應用)
- Media Apps Overview(媒體應用程序概述)
- Working with a Media Session(使用媒體會話)
- Building an Audio App(建立一個音頻應用)
- Building a Media Browser Service(構建媒體瀏覽器服務)
- Building a Media Browser Client(構建媒體瀏覽器客戶端)
- Media Session Callbacks(媒體會話回調)
- Building a Video App(建立一個視頻應用)
- Building a Video Player Activity(建立一個視頻播放器Activity)
- Media Session Callbacks-(媒體會話回調)
- Responding to Media Buttons(響應媒體按鈕)
- Handling Changes in Audio Output(處理音頻輸出的變化)
- Managing Audio Focus(管理音頻焦點)
- The Google Assistant and Media Apps(Google智能助理和媒體應用)
- 媒體和相機
- Supported Media Formats(支持的媒體格式)
- MediaPlayer(媒體播放器)
- MediaRecorder
- ExoPlayer
- Controller Amplitude with VolumeShaper(VolumeShaper控制器振幅)
- Media Routing(媒體路由)
- MediaRouter API
- MediaRouteProvider API
- Camera API(相機API)
- 位置和傳感器
- Location and Maps(位置和地圖)
- Location Strategies(位置策略)
- Sensors Overview(傳感器概覽)
- Motion Sensors(運動傳感器)
- Position Sensors(位置傳感器)
- Environment Sensors(環境傳感器)
- Raw GNSS Measurements(原始的GNSS測量)
- 連接
- Bluetooth
- Bluetooth Low Energy(藍牙低功耗)
- NFC
- NFC Basics(NFC基礎知識)
- Advanced NFC(高級NFC)
- Host-based Card Emulation(基于主機的卡模擬)
- Telecom(電信)
- Self-Managed ConnectionServices(自我管理的連接服務)
- Wi-Fi P2P
- Wi-Fi Aware
- Companion Device Pairing
- USB
- Accessory(配件)
- Host(主機)
- SIP
- 文本和輸入
- Autofill Framework(自動填充框架)
- Test your app with autofill(使用自動填充測試你的應用)
- Building autofill services(構建自動填充服務)
- Copy and Paste(復制和粘貼)
- Creating an IME(創建IME)
- Image Keyboard(圖像鍵盤)
- Spelling Checker(拼寫檢查程序)
- 數據存儲
- Storage Options(存儲選項)
- Data Backup(數據備份)
- Account Transfer API(賬戶轉移API)
- Auto Backup(自動備份)
- Key/Value Backup(鍵值備份)
- Testing Backup and Restore(測試備份和還原)
- App Install Location(應用安裝位置)
- 庫
- 支持庫
- 功能
- 修訂歷史記錄
- 庫設置
- 數據綁定庫
- 測試支持庫
- 管理
- 設備策略
- 網絡應用
- Supporting Different Screens in Web Apps(在網絡應用中支持不同屏幕)
- Building Web Apps in WebView(在WebView中構建網絡應用)
- Managing WebViews
- Migrating to WebView in Android 4.4(遷移到Android4.4中的WebView)
- Debugging Web Apps(調試網絡應用)
- Best Practices for Web Apps(網絡應用最佳做法)
- 最佳實踐
- Supporting Multiple Screens(支持多種屏幕)
- Distributing to Specific Screens(分配到特定屏幕)
- Screen Compatibility Mode(屏幕兼容性模式)
- Designing for Seamlessness
- Supporting Tablets and Handsets
- 培訓