Android7.0更新一覽,快來喫Nougat

Android N 仍處於活躍的開發狀態,但現在您可以將其作爲 N Developer Preview 的一部分進行試用。 以下部分重點介紹面向開發者的一些新功能。

多窗口支持

在Android N中,我們爲該平臺引入了一個新的而且非常需要的多任務處理功能 — 多窗口支持。

現在,用戶可以一次在屏幕上打開兩個應用。

  • 在運行 Android N 的手機和平板電腦上,用戶可以並排運行兩個應用,或者處於分屏模式時一個應用位於另一個應用之上。 用戶可以通過拖動兩個應用之間的分隔線來調整應用。
  • 在 Android TV 設備上,應用可以將自身置於畫中畫模式,從而讓它們可以在用戶瀏覽或與其他應用交互時繼續顯示內容。

多窗口支持爲您提供新的吸引用戶方式,特別是在平板電腦和其他更大屏幕的設備上。 您甚至可以在您的應用中啓用拖放,從而使用戶可以方便地將內容拖放到您的應用或從其中拖出內容—這是一個非常好的增強用戶體驗的方式。

向您的應用添加多窗口支持並配置多窗口顯示的處理方式非常簡單。 例如,您可以指定您的 Activity 允許的最小尺寸,從而防止用戶將 Activity 調整到該尺寸以下。 您還可以爲應用禁用多窗口顯示,這可確保系統將僅以全屏模式顯示應用。

通知增強功能

在 Android N 中,我們重新設計了通知,使其更易於使用並且速度更快。 部分變更包括:

  • 模板更新:我們正在更新通知模板,新強調了英雄形象和化身。 開發者將能夠充分利用新模板,只需進行少量的代碼調整。
  • 消息樣式自定義:您可以自定義更多與您的使用 MessageStyle 類的通知相關的用戶界面標籤。 您可以配置消息、會話標題和內容視圖。
  • 捆綁通知:系統可以將消息組合在一起(例如,按消息主題)並顯示組。 用戶可以適當地進行 Dismiss 或 Archive 等操作。 如果您已實現 Android Wear 的通知,那麼您已經很熟悉此模型。
  • 直接回復:對於實時通信應用,Android 系統支持內聯回覆,以便用戶可以直接在通知界面中快速回復短信。
  • 自定義視圖:兩個新的 API 讓您在通知中使用自定義視圖時可以充分利用系統裝飾元素,如通知標題和操作。


JIT/AOT 編譯


在 Android N 中,我們添加了 Just in Time (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 N 中,低電耗模式又前進了一步,隨時隨地可以省電。只要屏幕關閉了一段時間,且設備未插入電源,低電耗模式就會對應用使用熟悉的 CPU 和網絡限制。這意味着用戶即使將設備放入口袋裏也可以省電。

圖 3. 低電耗模式現在應用限制以延長電池壽命,即使設備未處於靜止狀態。

屏幕關閉片刻後,設備在使用電池時,低電耗模式將限制網絡訪問,同時延遲作業和同步。 在短暫的維護時間範圍後,其允許應用訪問網絡,並執行延遲的作業/同步。 打開屏幕或將設備插入電源會使設備退出低電耗模式。

當設備再次處於靜止狀態時,屏幕關閉且使用電池一段時間,低電耗模式針對 PowerManager.WakeLockAlarmManager 警報和 GPS/Wi-Fi 掃描應用完整 CPU 和網絡限制。

無論設備是否處於運動狀態,將應用調整到低電耗模式的最佳做法均相同,因此,如果您已更新應用以妥善處理低電耗模式,則一切就緒。 如果不是,請立即開始將應用調整到低電耗模式

Project Svelte:後臺優化


Project Svelte 在持續改善,以最大程度減少生態系統中一系列 Android 設備中系統和應用使用的 RAM。 在 Android N 中,Project Svelte 注重優化在後臺中運行應用的方式。

後臺處理是大多數應用的一個重要部分。處理得當,可讓您實現非常棒的用戶體驗 — 即時、快速和情境感知。如果處理不得當,後臺處理會毫無必要地消耗 RAM(和電池),同時影響其他應用的系統性能。

自 Android 5.0 發佈以來,JobScheduler 已成爲執行後臺工作的首選方式,其工作方式有利於用戶。 應用可以在安排作業的同時允許系統基於內存、電源和連接情況進行優化。 JobScheduler 可實現控制和簡潔性,我們想要所有應用都使用它。

另一個非常好的選擇是 GCMNetworkManager(Google Play 服務的一部分),其在舊版 Android 中提供類似的作業安排和兼容性。

我們在繼續擴展 JobScheduler 和 GCMNetworkManager,以符合多個用例 — 例如,在 Android N 中,現在,您可以基於內容提供程序中的更改安排後臺工作。 同時,我們開始棄用一些較舊的模式,這些模式會降低系統性能,特別是低內存設備的系統性能。

在 Android N 中,我們刪除了三個常用隱式廣播 — CONNECTIVITY_ACTIONACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO — 因爲這些廣播可能會一次喚醒多個應用的後臺進程,同時會耗盡內存和電池。 如果您的應用收到這些廣播,請充分利用 N Developer Preview 以遷移到 JobScheduler 和相關的 API。

Data Saver

在移動設備的整個生命週期,蜂窩數據計劃的成本通常會超出設備本身的成本。 對於許多用戶而言,蜂窩數據是他們想要節省的昂貴資源。

Android N 推出了 Data Saver 模式,這是一項新的系統服務,有助於減少應用使用的蜂窩數據,無論是在漫遊,賬單週期即將結束,還是使用少量的預付費數據包。 Data Saver 讓用戶可以控制應用使用蜂窩數據的方式,同時讓開發者打開 Data Saver 時可以提供更多有效的服務。

用戶在 Settings 中啓用 Data Saver 且設備位於按流量計費的網絡上時,系統屏蔽後臺流量消耗,同時指示應用在前臺儘可能使用較少的流量 — 例如,通過限制用於流媒體服務的比特率、降低圖片質量、延遲最佳的預緩衝等方法來實現。 用戶可以將特定應用加入白名單以允許後臺按流量的流量消耗,即使在打開 Data Saver 時也是如此。

Android N 擴展了 ConnectivityManager,以便爲應用檢索用戶的 Data Saver 首選項監控首選項變更提供一種方式。 所有應用均應檢查用戶是否已啓用 Data Saver 並努力限制前臺和後臺流量消耗。

Vulkan API

Android N 將一項新的 3D 渲染 API Vulkan™ 集成到平臺中。就像 OpenGL™ ES 一樣,Vulkan 是 3D 圖形和渲染的一項開放標準,由 Khronos Group 維護。

Vulkan 是完全從零開始設計,以最小化驅動器中的 CPU 開銷,並能讓您的應用更直接地控制 GPU 操作。 Vulkan 還允許多個線程同時執行工作,如命令緩衝區構建,以獲得更好的並行化。

Vulkan 開發工具和庫都已捲入 Android NDK。它們包括:

  • 驗證層(調試庫)
  • SPIR-V 着色程序編譯器
  • SPIR-V 運行時着色器編譯庫

Vulkan 僅適用於已啓用 Vulkan 硬件的設備上的應用,如 Nexus 5X、Nexus 6P 和 Nexus Player。 我們正在與合作伙伴密切合作,以儘快使 Vulkan 能面向更多的設備。

Quick Settings Tile API

“快速設置”通常用於直接從通知欄顯示關鍵設置和操作,非常簡單。 在 Android N 中,我們已擴展“快速設置”的範圍,使其更加有用更方便。

我們爲額外的“快速設置”圖塊添加了更多空間,用戶可以通過向左或向右滑動跨分頁的顯示區域訪問它們。 我們還讓用戶可以控制顯示哪些“快速設置”圖塊以及顯示的位置 — 用戶可以通過拖放圖塊來添加或移動圖塊。

對於開發者,Android N 還添加了一個新的 API,從而讓您可以定義自己的“快速設置”圖塊,使用戶可以輕鬆訪問您應用中的關鍵控件和操作。

對於急需或頻繁使用的控件和操作,保留“快速設置”圖塊,且不應將其用作啓動應用的快捷方式。

定義圖塊後,您可以將它們顯示給用戶,用戶可通過拖放將圖塊添加到“快速設置”。

號碼屏蔽

Android N 現在支持在平臺中進行號碼屏蔽,提供框架 API,讓服務提供商可以維護屏蔽的號碼列表。 默認短信應用、默認手機應用和提供商應用可以對屏蔽的號碼列表進行讀取和寫入操作。 其他應用則無法訪問此列表。

通過使號碼屏蔽成爲平臺的標準功能,Android 爲應用提供一致的方式來支持廣泛的設備上的號碼屏蔽。 應用可以利用的其他優勢包括:

  • 還會屏蔽已屏蔽的來電號碼發出的短信
  • 通過 Backup & Restore(備份和還原)功能可以跨重置和設備保留屏蔽的號碼
  • 多個應用可以使用相同的屏蔽號碼列表

此外,通過 Android 的運營商應用集成表示運營商可以讀取設備上屏蔽的號碼列表,併爲用戶執行服務端屏蔽,以阻止不需要的來電和短信通過任何介質(如 VOIP 端點或轉接電話)到達用戶

來電過濾

Android N 允許默認的手機應用過濾來電。手機應用執行此操作的方式是實現新的 CallScreeningService,該方法允許手機應用基於來電的Call.Details 執行大量操作,例如:

  • 拒絕來電
  • 不允許來電到達通話記錄
  • 不向用戶顯示來電通知

如需瞭解詳細信息,請參閱可下載的 API 參考中的 android.telecom.CallScreeningService

多區域設置支持、多語言


Android N 現在允許用戶在設置中選擇多個區域設置,以更好地支持雙語用例。 應用可以使用新的 API 獲取用戶選擇的區域設置,然後爲多區域設置用戶提供更成熟的用戶體驗 — 如以多個語言顯示搜索結果,並且不會以用戶瞭解的語言翻譯網頁。

除多區域設置支持外,Android N 還擴展了用戶可用的語言範圍。 它針對常用語言提供超過 25 種的變體,如英語、西班牙語、法語和阿拉伯語。 它還針對 100 多種新語言添加了部分支持。

應用可以通過調用 LocaleList.GetDefault() 獲取用戶設置的區域設置列表。 爲支持擴展的區域設置數量,Android N 正在改變其解析資源的方式。 請務必使用新的資源解析邏輯測試和驗證您的應用是否能如期運行。

如需有關新資源解析行爲和應遵循的最佳做法的更多信息,請參閱多語言支持

新增的表情符號


Android N 引入更多表情符號和表情符號相關功能,包括膚色表情符號和支持變量選擇符。 如果您的應用支持表情符號,請遵循以下準則,以便能充分利用這些表情符號相關功能優勢。

  • 在插入之前,檢查設備是否包含表情符號。 若要檢查系統字體中有哪些表情符號,使用 hasGlyph(String) 方法。
  • 檢查表情符號是否支持變量選擇符。 變量選擇符使您能夠呈現一些彩色或黑白的表情符號。 在移動設備上,應用應呈現彩色的表情符號,而不是黑白的。但是,如果您的應用顯示嵌入在文本中的表情符號,那應使用黑白變量。 若要確定表情符號是否有變量,使用變量選擇符。
  • 如需有關支持變量的字符的完整清單,請參閱變量的 Unicode 文檔中的 表情符號變量序列部分。
  • 檢查表情符號是否支持膚色。Android N 允許用戶按照他們的喜好修改表情符號呈現的膚色。 鍵盤應用應爲有多個膚色的表情符號提供可視化的指示,並應允許用戶選擇他們喜歡的膚色。 若要確定哪些系統表情符號有膚色修改器,使用 hasGlyph(String) 方法。 您可以通過讀取 Unicode 文檔來確定哪些表情符號使用膚色。

Android 中的 ICU4J API


Android N 目前在 Android 框架(位於 android.icu 軟件包下)中提供 ICU4J API 的子集。 遷移很簡單,主要是需要從 com.java.icu 命名空間更改爲android.icu。 如果您已在您的應用中使用 ICU4J 捆綁包,切換到 Android 框架中提供的 android.icu API 可以大量節省 APK 大小。

如果要了解有關 Android ICU4J API 的更多信息,請參閱 ICU4J 支持

OpenGL™ ES 3.2 API


Android N 添加了框架接口和對 OpenGL ES 3.2 的平臺支持,包括:

  • 來自 Android 擴展包 (AEP) 的所有擴展(EXT_texture_sRGB_decode 除外)。
  • 針對 HDR 的浮點幀緩衝和延遲着色。
  • BaseVertex 繪圖調用可實現更好的批處理和流媒體服務。
  • 強大的緩衝區訪問控制可減少 WebGL 開銷。

Android N 上適用於 OpenGL ES 3.2 的框架 API 與 GLES32 類一起提供。 使用 OpenGL ES 3.2 時,請務必通過 <uses-feature> 標記和android:glEsVersion 屬性在您的清單中聲明要求。

如需瞭解有關使用 OpenGL ES 的信息,包括如何在運行時檢查設備支持的 OpenGL ES 版本,請參閱 OpenGL ES API 指南

Android TV 錄製


Android N 通過新的錄製 API 添加了從 Android TV 輸入服務錄製和播放內容的功能。 構建在現有時移 API 之上,TV 輸入服務可以控制能夠錄製的渠道數據、保存錄制的會話的方式,同時可通過錄制的內容管理用戶交互。

如需瞭解詳細信息,請參閱 Android TV 錄製 API

Android for Work


Android for Work 針對運行 Android N 的設備添加了許多新功能和 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 處理新的入口點。 和以前一樣,由與操作匹配的 Intent 過濾器將服務指示給系統。android.net.VpnService

用戶還可以使用 Settings>More>Vpn 在主要用戶中手動設置實現 VPNService 方法的 Always on VPN 客戶端。

自定義配置

應用可以用企業顏色和徽標來自定義個人資料所有者和設備所有者配置流程。DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR 自定義流程顏色。DevicePolicyManager.EXTRA_PROVISIONING_LOGO_URI 用企業徽標自定義流程。

無障礙增強功能


Android N 現在針對新的設備設置直接在歡迎屏幕上提供“Vision Settings”。 這使用戶可以更容易發現和配置他們設備上的無障礙功能,包括放大手勢、字體大小、顯示屏尺寸和 TalkBack。

隨着這些無障礙功能更爲突出,在啓用這些功能後,您的用戶更可能試用您的應用。 請務必提前啓用這些設置測試您的應用。 您可以通過 Settings > Accessibility 啓用它們。

還是在 Android N 中,無障礙服務現在可以幫助具有動作障礙的用戶觸摸屏幕。 全新的 API 允許使用人臉追蹤、眼球追蹤、點掃描等功能構建服務,以滿足這些用戶的需求。

如需瞭解詳細信息,請參閱可下載的 API 參考 中的 android.accessibilityservice.GestureDescription 

直接啓動


直接啓動可以縮短設備啓動時間,讓註冊的應用具有有限的功能,即使在意外重啓後。例如,如果當用戶睡覺時加密的設備重啓,那麼註冊的警報、消息和來電現在可以和往常一樣繼續通知用戶。 這也意味着重啓後無障礙服務會立即可用。

在 Android N 中,直接啓動充分利用基於文件的加密,以針對系統和應用數據啓用細化的加密策略。爲系統和應用數據。系統針對選定的系統數據和顯式註冊的應用數據使用設備加密的存儲。 默認情況下,憑據加密的存儲可用於所有其他系統數據、用戶數據、應用及應用數據。

啓動時,系統在受限的模式中啓動,僅訪問設備加密的數據,不會對應用或數據進行常規訪問。如果您有想要在此模式下運行的組件,您可以通過在清單文件中設置標記註冊它們。 重啓後,系統通過廣播 LOCKED_BOOT_COMPLETED Intent

激活註冊的組件。 系統確保註冊的設備加密的應用數據在解鎖前可用。 所有其他數據在用戶確認鎖定屏幕憑據進行解密前均不可用。

如需瞭解詳細信息,請參閱直接啓動

密鑰認證


使用硬件支持的密鑰庫,可更安全地在 Android 設備上創建、存儲和使用加密密鑰。 它們可保護密鑰免受 Linux 內核、潛在的 Android 漏洞的攻擊,也可防止從已取得根權限的設備提取密鑰。

爲了讓硬件支持的密鑰庫使用起來更簡單和更安全,Android N 引入了密鑰認證。 應用和關閉的設備可使用密鑰認證以堅決地確定 RSA 或 EC 密鑰對是否受硬件支持、密鑰對的屬性如何,以及其使用和有效性有何限制。

應用和關閉的設備服務可以通過 X.509 認證證書(必須由有效的認證密鑰簽署)請求有關密鑰對的信息。 認證密鑰是一個 ECDSA 簽署密鑰,其在出廠時被注入設備的硬件支持的密鑰庫。因此,有效的認證密鑰簽署的認證證書可確認硬件支持的密鑰庫是否存在,以及該密鑰庫中密鑰對的詳細信息。

爲確保設備使用安全的官方 Android 出廠映像,密鑰認證要求設備 bootloader 向可信執行環境 (TEE) 提供以下信息:

  • 設備上安裝的操作系統版本和補丁級別
  • 驗證的啓動公鑰和鎖定狀態。

如需瞭解有關硬件支持的密鑰庫功能的詳細信息,請參閱硬件支持的密鑰庫指南。

除密鑰認證外,Android N 還推出了指紋綁定密鑰,在指紋註冊時不會撤銷。

網絡安全性配置


在 Android N 中,通過使用說明性“網絡安全性配置”(而不是使用傳統的易出錯的編程 API(例如,X509TrustManager)),應用可以安全地自定義其安全(HTTPS、TLS)連接的行爲,無需任何代碼修改。

支持的功能:

  • 自定義信任錨。讓應用可以針對安全連接自定義哪些證書頒發機構 (CA) 值得信賴。 例如,信任特定的自簽署證書或限制應用信任的公共 CA 集。
  • 僅調試重寫。讓應用開發者可以安全調試其應用的安全連接,而不會增加安裝基礎的風險。
  • 明文流量選擇退出。讓應用可以防止自身意外使用明文流量。
  • 證書固定。這是一項高級功能,讓應用可以針對安全連接限制哪些服務器密鑰受信任。

如需瞭解詳細信息,請參閱網絡安全性配置

默認受信任的證書頒發機構


默認情況下,面向 Android N 的應用僅信任系統提供的證書,且不再信任用戶添加的證書頒發機構 (CA)。 如果面向 Android N 的應用希望信任用戶添加的 CA,則應使用網絡安全性配置以指定信任用戶 CA 的方式。

APK signature scheme v2


Android N 引入一項新的應用簽名方案 APK Signature Scheme v2,它能提供更快的應用安裝時間和更多針對未授權 APK 文件更改的保護。 在默認情況下,Android Studio 2.2 和 Android Gradle 2.2 插件會使用 APK Signature Scheme v2 和傳統簽名方案來簽署您的應用。

雖然我們建議您對您的應用採用 APK Signature Scheme v2,但這項新方案並非強制性的。 如果您的應用在使用 APK Signature Scheme v2 時不能正確構建,您可以停用這項新方案。 禁用過程會導致 Android Studio 2.2 和 Android 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 Gradle 插件來爲簽署應用配置構建文件

作用域目錄訪問


在 Android N 中,應用可以使用新的 API 請求訪問特定的外部存儲目錄,包括可移動媒體上的目錄,如 SD 卡。 新 API 大大簡化了應用訪問標準外部存儲目錄的方式,如 Pictures 目錄。 應用(如照片應用)可以使用這些 API(而不是使用 READ_EXTERNAL_STORAGE),其授予所有存儲目錄的訪問權限或存儲訪問框架,從而讓用戶可以導航到目錄。

此外,新的 API 簡化了用戶嚮應用授予外部存儲訪問權限的步驟。 當您使用新的 API 時,系統使用一個簡單的權限 UI,其清楚地詳細介紹應用正在請求訪問的目錄。

如需瞭解詳細信息,請參閱作用域目錄訪問開發者文檔。

鍵盤快捷鍵輔助工具


在 Android N 中,用戶可以按“Alt + /”觸發“鍵盤快捷鍵”屏幕,它會顯示的系統和對焦的應用中可用的所有快捷鍵。 這些是從應用菜單(如可用)中自動檢索到的,但開發者可以提供自己的屏幕微調快捷鍵。 您可以通過重寫新 Activity.onProvideKeyboardShortcuts() 的方法來進行這項操作,如可下載的 API 參考 中所述。

若要在您的應用程序的任何地方觸發鍵盤快捷鍵輔助工具,爲相關活動調用 Activity.requestKeyboardShortcutsHelper()

持續性能 API


長期運行的應用的性能可能會顯著波動,因爲系統會阻止系統芯片在設備組件達到溫度限制時啓動。 這種波動是建立高性能長期運行應用的應用開發者的移動目標。

爲解決這些限制,Android N 包括了“持續性能模式”支持,幫助原始設備製造商 (OEM) 提供關於長期運行應用的設備性能能力的提示。 應用開發者可以使用這些提示來根據可預測的一致設備性能水平調整長期應用。

應用開發者只能在 Nexus 6P 設備的 N Developer Preview 上嘗試這項新的 API。 若要使用此功能,爲您希望以持續性能模式運行的窗口設置持續性能窗口標記。 使用 Window.setSustainedPerformanceMode() 方法設置此舉報。 當窗口不再對焦時,系統會自動停用此模式。

VR 支持


Android N 添加了新的 VR 模式的平臺支持和優化,以使開發者能爲用戶打造高質量移動 VR 體驗。 新版針對開發者提供了大量性能增強特性,包括單一緩衝區渲染以及允許 VR 應用訪問某個專屬的 CPU 核心。在您的應用中,您可以享受到專爲 VR 設計的平滑頭部跟蹤和立體聲通知功能。 最重要的是,

Android N 的圖形延時非常低。 如需有關構建面向的 Android N 的 VR 應用的完整信息,請參閱 面向 Android 的 Google VR SDK


在 Android N 中,打印服務開發者現在可以公開關於個別打印機和打印作業的其他信息。

在列出各打印機時,打印服務現在可以通過兩種方式來設置按打印機的圖標:

  • 您可以通過調用 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_DURATIONINPUT_HANDLING_DURATIONANIMATION_DURATIONLAYOUT_MEASURE_DURATIONDRAW_DURATIONSYNC_DURATION

COMMAND_ISSUE_DURATIONSWAP_BUFFERS_DURATIONTOTAL_DURATION和 FIRST_DRAW_FRAME

虛擬文件


在較早的 Android 版本中,您的應用可以使用存儲訪問框架來允許用戶從他們的雲存儲帳戶中選擇文件,如 Google 雲端硬盤。 但是,不能表示沒有直接字節碼錶示的文件;每個文件都必須提供一個輸入流。

Android N 在存儲訪問框架中增加了“虛擬文件”的概念。 虛擬文件功能可以讓您的 DocumentsProvider 返回可與 ACTION_VIEWIntent 使用的文件 URI,即使它們沒有直接字節碼錶示。 Android N 還允許您爲用戶文件(虛擬或其他類)提供備用格式。

爲獲得您的應用中的虛擬文件的 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);
      }
  }

行爲變更

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

如果您之前發佈過 Android 應用,請注意您的應用可能受到這些平臺變更的影響。

電池和內存

Android N 包括旨在延長設備電池壽命和減少 RAM 使用的系統行爲變更。 這些變更可能會影響您的應

用訪問系統資源,以及您的系統通過特定隱式 Intent 與其他應用互動的方式。

低電耗模式

Android 6.0(API 級別 23)引入了低電耗模式,當用戶設備未插接電源、處於靜止狀態且屏幕關閉時,

該模式會推遲 CPU 和網絡活動,從而延長電池壽命。而 Android N 則通過在設備未插接電源且屏幕關閉

狀態下、但不一定要處於靜止狀態(例如用戶外出時把手持式設備裝在口袋裏)時應用部分 CPU 和網絡

限制,進一步增強了低電耗模式。

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

當設備處於充電狀態且屏幕已關閉一定時間後,設備會進入低電耗模式並應用第一部分限制: 關閉應用網絡訪問、推遲作業和同步。

如果進入低電耗模式後設備處於靜止狀態達到一定時間,系統則會對 PowerManager.WakeLockAlarmManager 鬧鈴、GPS 和 Wi-Fi

掃描應用餘下的低電耗模式限制。 無論是應用部分還是全部低電耗模式限制,系統都會喚醒設備以提供簡短的維護時間窗口,在此窗

口期間,應用程序可以訪問網絡並執行任何被推遲的作業/同步。

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

請注意,激活屏幕或插接設備電源時,系統將退出低電耗模式並取消這些處理限制。 此項新增的行爲不會影響有關使您的應用適應

Android 6.0(API 級別 23)中所推出的舊版本低電耗模式的建議和最佳實踐,如低電耗模式和應用待機模式優化中所討論。 您仍應遵

循這些建議(例如使用 Google Cloud Messaging (GCM) 發送和接收消息)並開始安排更新計劃以適應新增的低電耗模式行爲。

Project Svelte:後臺優化

Android N 刪除了三項隱式廣播,以幫助優化內存使用和電量消耗。 此項變更很有必要,因爲隱式廣播會在後臺頻繁啓動已註冊偵聽這些廣

播的應用。 刪除這些廣播可以顯著提升設備性能和用戶體驗。

移動設備會經歷頻繁的連接變更,例如在 Wi-Fi 和移動數據之間切換時。 目前,可以通過在應用清單中註冊一個接收器來偵聽隱式

CONNECTIVITY_ACTION 廣播,讓應用能夠監控這些變更。 由於很多應用會註冊接收此廣播,因此單次網絡切換即會導致所有應用被

喚醒並同時處理此廣播。

同理,應用可以註冊接收來自其他應用(例如相機)的隱式 ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 廣播。 當用戶使用相機應用拍

攝照片時,這些應用即會被喚醒以處理廣播。

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

  • 面向 Android N 開發的應用不會收到 CONNECTIVITY_ACTION 廣播,即使它們已有清單條目來請求接受這些事件的通知。 在前臺運行的
  • 應用如果使用BroadcastReceiver 請求接收通知,則仍可以在主線程中偵聽 CONNECTIVITY_CHANGE
  • 應用無法發送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 廣播。此項優化會影響所有應用,而不僅僅是面向 Android N 的應用。

如果您的應用使用任何 Intent,您仍需要儘快移除它們的依賴關係,以正確適配 Android N 設備。 Android 框架提供多個解決方案來緩解對

這些隱式廣播的需求。 例如,JobScheduler API 提供了一個穩健可靠的機制來安排滿足指定條件(例如連入無限流量網絡)時所執行的網絡操作。 您甚至可以使用JobScheduler 來適應內容提供程序變化。

如需瞭解有關 Android N 中後臺優化以及如何改寫應用的詳細信息,請參閱後臺優化

權限更改

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

系統權限更改

爲了提高私有文件的安全性,面向 Android N 或更高版本的應用私有目錄被限制訪問 (0700)。 此設置可防止私有文件的元數據泄漏,

如它們的大小或存在。 此權限更改有多重副作用:

應用間共享文件

對於面向 Android N 的應用,Android 框架執行的 StrictMode API 政策禁止向您的應用外公開 file:// URI。 如果一項包含文件 URI 的 Intent 離開您的應用,應用失敗,並出現 FileUriExposedException 異常。

若要在應用間共享文件,您應發送一項 content:// URI,並授予 URI 臨時訪問權限。 進行此授權的最簡單方式是使用 FileProvider 類。 如需有關權限和共享文件的更多信息,請參閱共享文件

無障礙改進

爲提高平臺對於視力不佳或視力受損用戶的可用性,Android N 做出了一些更改。這些更改一般並不要求更改您的應用代碼,不過您應仔細檢查並使用您的應用測試這些功能,以評估它們對用戶體驗的潛在影響。

屏幕縮放

Android N 支持用戶設置顯示尺寸,以放大或縮小屏幕上的所有元素,從而提升設備對視力不佳用戶的可訪問性。用戶無法將屏幕縮放至低於最小屏幕寬度 sw320dp,該寬度是 Nexus 4 的寬度,也是常規中等大小手機的寬度。

圖 3. 右側屏幕顯示的是一臺運行 Android N 系統映像的設備增大顯示尺寸後的效果。

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

  • 如果是面向 API 級別 23 或更低版本系統的應用,系統會自動終止其所有後臺進程。 這意味着如果用戶切換離開此類應用,轉而打開“Settings”屏幕並更改 Display size 設置,
  • 則系統會像處理內存不足的情況一樣終止該應用。 如果應用具有任何前臺進程,則系統會如處理運行時變更中所述將配置變更通知給這些進程,就像對待設備屏幕方向變更一樣。
  • 如果是面向 Android N 的應用,則其所有進程(前臺和後臺)都會收到有關配置變更的通知,如處理運行時變更中所述。

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

  • 在屏幕寬度爲 sw320dp 的設備上測試您的應用,並確保其充分運行。
  • 當設備配置發生變更時,更新任何與密度相關的緩存信息,例如緩存位圖或從網絡加載的資源。當應用從暫停狀態恢復運行時,檢查配置變更。

    注:如果您要緩存與配置相關的數據,則最好也包括相關元數據,例如該數據對應的屏幕尺寸或像素密度。 保存這些元數據便於您在配置變更後決定是否需要刷新緩存數據。

  • 避免用像素單位指定尺寸,因爲像素不會隨屏幕密度縮放。應改爲使用與密度無關像素 (dp) 單位指定尺寸。

設置嚮導中的視覺設置

Android N 在“Welcome”屏幕中加入了“Vision Settings”,用戶可以在新設備上設置以下無障礙功能設置: Magnification gestureFont sizeDisplay size 和 TalkBack。 此項變更增強了與

不同屏幕設置相關的錯誤的可見性。 要評估此功能的影響,您應在啓用這些設置的狀態下測試應用。 您可以在Settings > Accessibility 中找到這些設置。

NDK 應用鏈接至平臺庫

Android N 做了一些命名空間更改,以阻止加載非公開 API。 如果您使用 NDK,則只能使用 Android 平臺提供的公開 API。 在下一個官方發佈的 Android 版本上使用非公開 API 會導致應用崩潰。

爲提醒您使用了非公開 API,在 Android N 設備上運行的應用會在有應用調用非公開 API 時在日誌消息輸出中生成一個錯誤。 此錯誤還會作爲消息顯示在設備屏幕上,以幫助增強您對此情況的認識。

您應檢查應用代碼以刪除使用非公開平臺 API,並使用預覽版設備或模擬器全面測試應用。

如果您的應用依賴平臺庫,則請參見 NDK 文檔,瞭解使用公開 API 等效項替換普通私有 API 的典型修復。 您還可以鏈接至平臺庫,而無需實現此應用,如果應用使用的庫是平臺的一部分(例如 libpng),

但不屬於 NDK,則更可如此。 此情況下,請確保您的 APK 包含您打算鏈接到的所有 .so 文件。

注意:有些第三方庫可能會鏈接至非公開 API。 如果您的應用使用這些庫,那麼當您的應用在下一個官方發佈的 Android 版本上運行時可能會出現崩潰現象。

應用不應依賴或使用不屬於 NDK 的原生庫,因爲這些庫可能會發生更改或從一個 Android 版本遷移至另一版本。 例如,從 OpenSSL 切換至 BoringSSL 即屬於此類更改。 此外,

不同的設備可能提供不同級別的兼容性,因爲不屬於 NDK 中的平臺庫沒有兼容性要求。 如果您必須在較舊設備上訪問非 NDK 庫,則請依據 Android API 級別進行加載。

爲幫助您診斷此類問題,下面列舉了一些在您試圖使用 Android N 開發應用時可能遇到的 Java 和 NDK 錯誤:

Java 錯誤示例:

java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so"
    is not accessible for the namespace "classloader-namespace"

NDK 錯誤示例:

dlopen failed: cannot locate symbol "__system_property_get" referenced by ...

以下是遇到這類錯誤的應用的一些典型修復:

  • 可以使用標準 JNI 函數來替代使用 libandroid_runtime.so 中的 getJavaVM 和 getJNIEnv:
    AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h>
    AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or
    JavaVM::AttachCurrentThread from <jni.h>.
    
  • 可以使用公開 alternative __system_property_get 來替代使用 libcutils.so 中的 property_get 符號。如需這樣做,請使用__system_property_get 及以下 include 函數:
    #include <sys/system_properties.h>
    
  • 應使用應用本地版本來替代使用 libcrypto.so 中的 SSL_ctrl 符號。例如,您應在 .so 文件中靜態鏈接 libcyrpto.a,或者在應用中包含您自己的來自 BoringSSL 或 OpenSSL 的動態 libcrypto.so

Android for Work

Android N 包含一些針對面向 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() 訪問設備的 Wi-Fi MAC 地址。 如果設備上從未啓用 Wi-Fi,則此方法將返回一個 null 值。
  • 工作模式設置控制工作應用訪問。當工作模式關閉時,系統啓動器通過使工作應用顯示爲灰色來指示它們不可用。 啓用工作模式會再次恢復正常行爲。

如需瞭解有關 Android N 中針對 Android for Work 所做變更的詳細信息,請參閱 Android for Work 更新

註解保留

Android N 在註解可見性被忽略時修復錯誤。這種問題將啓用本不應被允許的運行時訪問註解。 這些註解包括:

  • VISIBILITY_BUILD:僅應編譯時可見。
  • VISIBILITY_SYSTEM:運行時應可見,但僅限基本系統。

如果您的應用依賴這種行爲,請在註解中添加一項運行時必須可用的保留政策。 您可通過使用 @Retention(RetentionPolicy.RUNTIME) 來如此做。

其他重要說明

  • 如果一個應用在 Android N 上運行,但卻是針對更低 API 級別開發的,那麼在用戶更改顯示尺寸時,系統將終止此應用進程。 應用必須能夠正常處理此情景。 否則,當用戶從最近使用記錄中恢復運行應用時,應用將會出現崩潰現象。

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

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

  • Android N 上的應用應能夠正常處理配置變更,並且在後續啓動時不會出現崩潰現象。您可以通過更改字體大小 (Setting > Display > Font size) 並隨後從最近使用記錄中恢復運行應用,來驗證應用行爲。
  • 由於之前的 Android 版本中的一項錯誤,系統未能將對主線程上的一個 TCP 套接字的寫入操作舉報爲嚴格模式違反。 Android N 修復了此錯誤。呈現出這種行爲的應用引發 android.os.NetworkOnMainThreadException
  • 一般情況下,我們不建議在主線程上執行網絡操作,因爲這些操作通常都有可能導致 ANR 和卡頓的高尾延遲。
  • Debug.startMethodTracing() 方法族現在默認在您的共享的存儲空間上的軟件包特定目錄中存儲輸出,而非 SD 卡頂級。 這意味着應用不再需要請求 WRITE_EXTERNAL_STORAGE 使用這些 API 的權限。
  • 許多平臺 API 現在開始檢查在 Binder 事務間發送的大負載,系統現在會將 TransactionTooLargeExceptions 再次作爲 RuntimeExceptions 引發,而不再只是默默記錄或抑制它們。 一個常見例子是
  • 在 Activity.onSaveInstanceState() 上存儲過多數據,導致 ActivityThread.StopInfo在您的應用面向 Android N 時引發 RuntimeException
  • 如果應用向 View 發佈 Runnable 任務,並且 View 未附加到窗口,系統會用 View 爲 Runnable 任務排隊;在 View 附加到窗口之前,Runnable 任務不會執行。 此行爲會修復以下錯誤:
    • 如果一項應用是從並非預期窗口 UI 線程的其他線程發佈到 View,則Runnable 可能會因此運行錯誤的線程。
    • 如果 Runnable 任務是從並非環路線程的其他線程發佈,則應用可能會曝光 Runnable 任務。
  • 如果 Android N 上一項有 DELETE_PACKAGES 權限的應用嘗試刪除一個軟件包,但另一項應用已經安裝了這個軟件包,則系統可能要求用戶確認。 在這種情況下,應用在調用 PackageInstaller.uninstall() 時的返回狀態應爲 STATUS_PENDING_USER_ACTION


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章