1. 程式人生 > >Android 7.0 Nougat(牛軋糖)---對開發者來說

Android 7.0 Nougat(牛軋糖)---對開發者來說

android 7.0出來了。讓你的app準備迎接最新的android版本吧,支援節省電量和記憶體,這樣新的系統行為。使用多視窗UI、直接恢復通知以及其他操作來擴充套件你的app。

android 7.0介紹了各種各樣的新功能給使用者和開發者, 本文重點介紹面向開發者的一些新功能。

確保檢查android 7.0的行為變化,瞭解有關平臺的變化可能會影響你的app。

如果要了解更多的關於使用者的新功能,請檢視www.android.com。

1.支援多視窗

在android 7.0中,我們介紹了在支援多視窗平臺上的一個多工處理的新功能。

現在,使用者可以一次在螢幕上開啟兩個應用。

在手機和平板上執行7.0,使用者可以並排執行兩個應用,或者一個應用位於另一個應用之上在分屏模式的時候。 使用者可以通過拖動兩個應用之間的分隔線來調整app大小。

在android TV上的裝置,app可以將自身置於畫中畫模式。當用戶瀏覽或者與其他app互動的時候,允許它們繼續顯示內容。

尤其是在平板上和大屏的裝置上,多視窗支援為你提供新的吸引使用者的方式。你甚至能夠讓你的應用進行拖放,使用者可以方便的把內容拖到你的應用,或者從中拖出內容,這是一個非常好的增強使用者體驗的方式。

它是簡單的為你的app新增多視窗支援,並配置它如何處理多視窗顯示。例如,你可以指定activity允許的最小尺寸,從而防止使用者將activity調整到該尺寸以下。你也可以在你的app中禁止多視窗顯示,確保系統將僅以全屏模式顯示你的app。

關於更多的資訊,請檢視Multi-Window Support的開發者文件。

2.通知功能的增強

在android 7.0我們重新設計了通知,讓它們更加容易和快速的被使用。以下是一些改變的地方。

(a)模板的更新,我們正在更新的通知模板,強調了英雄的頭像和化身。開發者將能夠利用新的模板,在程式碼中做最小的調整。

(b)訊息樣式的自定義,你能夠自定義很多和通知相關的使用者介面的標籤,使用MessagingStyle類。你可以配置訊息,會話標題,內容檢視。

(c)繫結通知,系統能夠把一組訊息放在一起,例如,按照主題訊息,顯示這個組。使用者可以適當地進行Dismiss或Archive等操作。如果你已實現Android Wear的通知,那麼你已經很熟悉此模式。

(d)直接回復

,對於實時通訊app,android系統支援內嵌的回覆,使用者可以直接快速響應一個短訊息或文字訊息,直接在通知介面。

(e)自定義檢視,兩個新的API讓你在通知中使用自定義檢視時可以充分利用系統裝飾元素,如通知標題和操作。

3.介紹JIT / AOT編譯

在android 7.0中,我們添加了Just in Time (JIT) 編譯器,對ART 進行程式碼分析,它能不斷的提高android app的執行效能。JIT編譯器對android執行元件當前的Ahead of Time (AOT) 編譯器進行了補充,有助於提升執行時效能,節省儲存空間,加快應用更新和系統更新速度。

配置編譯器讓ART管理AOT/JIT編譯每一個app根據實際使用,以及裝置上的條件。例如,ART保持著每一個app熱門方法的簡介,並且可以預編譯和快取這些方法以實現最佳效能。對於應用的其他部分,在實際使用之前不會進行編譯。

除了提高app的效能是關鍵部分。簡介編譯器幫助減少app的記憶體佔用,包括相關的二進位制檔案。這個功能對於降低裝置的記憶體是很重要的。

ART管理profile-guided編譯時,在最大程度上降低對裝置電池的影響。僅當裝置處於空閒狀態和充電時才進行編譯,節約時間和電量通過提前執行該工作。

4.快速的app安裝路徑

ART JIT編譯的一個最明顯的好處是提高app安裝和系統更新的速度。在android 6.0中即使是大型的app,也要求幾分鐘來優化安裝的,但是現在只需要幾秒鐘。系統更新也變的很快,自從它不需要優化了。

5.休眠情況下…

android 6.0介紹休眠機制,通過推遲app的cpu和網路活動來實現省電目的的系統模式,當裝置空閒的時候,例如裝置放在桌上或抽屜裡時。

現在在android 7.0時,休眠機制又前進了一步,隨時隨地的節省電量。任何時候只要螢幕關閉了一段時間,並且裝置也沒有插電,休眠就會應用到這個app熟悉的CPU和網路限制的子集。這意味著使用者節省電量,當他們將裝置放入口袋裡的時候。

這裡寫圖片描述

當裝置在使用電池時,螢幕關閉片刻後,休眠模式限制網路訪問,同時延遲作業和同步。在維持著短暫的視窗期間,應用允許網路訪問,並執行延遲的作業/同步的作業。開啟螢幕或者將裝置插入電源會使裝置退出休眠模式。

當裝置再次靜止時,螢幕關閉且使用了電池一段時間。休眠模式應用整個cpu和網路限制在PowerManager.WakeLock, AlarmManager鬧鐘和GPS/Wi-Fi掃描。

無論裝置移動與否,將app在休眠模式的最佳適配是相同。所以,如果你已經更新了你的app,優雅的處理了休眠模式,則一切就緒。如果沒有,請看adapting your app to Doze文件。

6.Project Svelte:後臺優化

瘦身計劃在持續的優化,儘可能的減少系統和app對RAM的使用,在安卓裝置的生態系統的範圍內。在Android 7.0中,瘦身計劃注重優化app在後臺執行的方式。

後臺處理是大多數app的一個重要部分。處理得當,它能夠讓使用者感覺非常神奇,即時地、快速地和有感知力地。處理不得當,後臺處理會不必要地消耗記憶體(包括電量),同時影響其他app的系統性能。

從Android 5.0開始,JobScheduler已成為執行後臺工作的首選方式,其工作方式有利於使用者。app可以在安排工作的同時允許系統基於記憶體、電源和連線情況進行優化。 JobScheduler 可實現控制和簡潔性,我們想要所有的app都使用它。

另一個非常好的選擇是GCMNetworkManager,Google Play Services的一部分,提供類似工作排程,能夠很好的相容在舊的安卓版本。

我們持續擴充套件JobScheduler和GCMNetworkManager,滿足更多的使用者案例。例如,在Android 7.0中,你能夠立即安排後臺工作,基於可變化的內容提供程式。在同一時間,我們開始反對一些舊的模式,如降低系統性能,特別是低記憶體裝置。

在7.0中,我們移除掉來三個隱式廣播, CONNECTIVITY_ACTION(網路變化)、ACTION_NEW_PICTURE(相機、拍照、圖片)、and ACTION_NEW_VIDEO(ship)。因為這些廣播可能會一次性喚醒多個app的後臺程序,同時會耗盡記憶體和電池。如果你的app接收來這些廣播,請例如Android 7.0的優勢,遷移到JobScheduler上,用相關的API來代替。

想要了解更詳細的資訊,請看Background Optimizations文件。

7.SurfaceView

Android 7.0帶來了同步運動的類SurfaceView。提供了在某些情況下比TextureView更好的電池效能,當渲染視訊或者3D視訊時,app滾動和切換視訊位置是,使用SurfaceView比TextureView更省電量。

SurfaceView類在螢幕的影像合成上有更好的電池效率。因為它是複合的專用硬體,分離了app視窗內容。因此,它中間的複製比TextureView更少。

一個SurfceView物件的內容位置現在同步更新到app所包含的內容。這個變化的結果是:簡單的移動或者縮放一個視訊,如果用的是SurfaceView,將不會在view的邊上產生黑色的進度條。

從Android 7.0開始,我們強烈推薦,你要省電的話用SurfaceView代替TextureView。

8.Data Saver(資料保護)

在移動裝置的生命週期內,蜂窩資料計劃的成本通常超過裝置本身的成本。 對於更多使用者來說,蜂窩資料是一個昂貴的資源,是他們想要儲存。

Android 7.0介紹了資料保護模式。一個新的系統服務,能夠幫助app減少蜂窩資料的使用。無論是在計費週期結束時的漫遊,還是少量的預付費資料包。資料保護給使用者控制哪個app使用蜂窩資料,同時讓開發者開啟Data Saver時,可以提供更多有效的服務。

這裡寫圖片描述

當一個使用者在設定裡面啟用了Data Saver,就可以在裝置上計算網路流量。系統封鎖了後臺資料的使用,同時在前臺的訊號app儘可能減少資料的使用,例如限制流的位元率,降低圖片質量,延遲預先的高速緩衝。使用者能設定一個特殊的app白名單,允許後臺計算流量使用,即使是Data Saver開啟的時候。

Android 7.0擴充套件了ConnectivityManager類,可以讓app檢索使用者的Data Saver首選項和監控首選項變更。所有的app應該檢查使用者是否開啟了Data Saver,盡力限制前臺和後臺資料的使用。

9.Vulkan API

Android 7.0集成了Vulkan,一個3D渲染的API。像OpenGL ES一樣,Vulkan 是 3D 圖形和渲染的一項開放標準,由 Khronos Group 維護。

Vulkan是被設計成最小化的驅動CPU的開銷,允許應用程式直接地控制CPU的操作。Vulkan也有更好的並行化,允許多個執行緒執行工作,如命令緩衝區構建一次。

Vulkan開發工具和依賴都在Android 7.0的NDK中,他們包括:

1.頭

2.驗證層(除錯庫)

3.SPIR-V著色編譯器

4.SPIR-V執行時著色器編譯庫

Vulkan只適合已啟用Vulkan硬體的裝置上的應用,如Nexus 5X,Nexus 6P,Nexus Player。我們和合作夥伴正在緊密合作,儘可能帶來更多的關於Vulkan的裝置。

關於更多資訊,請看API documentation。

10.快速設定Tile API

快速設定是一個很普遍地和簡單地顯示設定按鈕和一些其他行為的功能,直接從通知欄下拉。在android 7.0中,我們擴充套件了快速設定的範圍大小,讓它更富有適用性和方便性。

我們增加了更多的空間來新增快速設定的圖塊,使用者可以向左或者向右滑動,隨意翻閱來顯示它們。我們也可以讓使用者來控制哪些快速設定圖塊的顯示–使用者可以新增刪除這些圖塊,通過拖動和放下他們。

對於開發者來說,android 7.0也增加了一些新的API,讓你能夠定義自己的快速設定圖塊,給使用者能夠很容易的訪問他們的應用,通過這個圖塊來控制、操作它們。

快速設定圖塊保留了控制和行為,它們是急切的要求和頻繁的使用,應該不被使用快捷鍵來執行app。

一旦你定義了你的圖塊,你可以讓他們顯示給使用者看,可通過拖放將圖塊新增到快速設定。

關於更多的建立一個app圖塊的資訊,請看Tile文件。

這裡寫圖片描述

11.號碼攔截

android 7.0平臺上現在已經支援號碼攔截了,提供了一個framework的API,讓服務提供者維護一個號碼攔截的列表。預設的是SM這個app,這個自帶的app能夠往號碼攔截列表中讀寫資料。這個列表不能夠被其他app訪問。

通過使號碼遮蔽成為平臺的標準功能,android提供了一致的做法,在廣泛的裝置上讓app支援號碼攔截。app能夠利用以下的這些好處:

1.能夠攔截電話,也能夠攔截簡訊

2.通過Backup & Restore(備份和還原)功能可以跨重置和裝置上保留遮蔽的號碼

3.多個應用可以使用相同的遮蔽號碼列表

此外,通過自帶app的整合,意味著這個app可以讀取遮蔽號碼列表在android的裝置和平臺上,服務商遮蔽掉他們,以阻止不需要的來電和簡訊,如 VOIP 端點或轉接電話。

關於更多的資訊,請看BlockedNumberContract文件。

12.Call Screening(呼叫過濾)

android 7.0 允許預設的手機應用程式來過濾來電。這個電話app做到這些是實現了新的CallScreeningService,允許手機app執行一個打電話的動作,基於一個到來的電話Call.Details,像這樣:

1.拒絕來電

2.不允許來電到通話記錄

3.不向使用者顯示來電通知

關於更多資訊,請檢視CallScreeningService文件。

13.Multi-locale Support, More Languages(多區域、語言支援)

android 7.0能夠讓使用者在設定裡面選擇multiple locales,能夠更好的支援雙語言的用例。app能夠使用一個新的API,獲取使用者選擇的區域,然後為多區域設定使用者提供更成熟的使用者體驗–如顯示多語言的搜尋結果,不會以使用者知道的語言翻譯網頁。

隨著多區域的支援,android 7.0也擴充套件了使用者可用的語言範圍。它支援超過25中常用的語言變體,如英語、西班牙語、法語和阿拉伯語。它還支援超過100種新語言。

app能夠得到一個區域設定的列表,使用者通過呼叫LocaleList.GetDefault()方法。 為支援擴充套件的區域設定數量,android 7.0正在改變解決資原始檔的方式。確保你能夠測試核實你的app如你期望的那樣執行,用新的資源解析邏輯。

學習新的資源解決的行為,有一些訓練測試,請看Multilingual Support。

14.New Emojis(新表情)

android 7.0添加了表情和表情符號相關的功能,包括換膚和支援變數選擇符。如果你的app支援表情, 跟著參考資料,瞭解表情功能帶來的好處。

1.在插入之前,檢查裝置是否包含表情符號。如果要檢查系統字型中有哪些表情,可以用hasGlyph(String)方法。

2.檢查表情符號是否支援變數選擇符。變量表情符號允許你顯示某些表情的顏色單一或者是黑白色。一個移動裝置,app應該顯示彩色的表情比黑白的好點。然而,如果你的app在文字中加入了表情,那它應該使用黑白變數。為了確定表情是否有變化,使用一個變數選擇器。對於這個變數完整的字串列表,閱覽表情變數序列章節,請看Unicode documentation on variations文件。

3.檢查表情符號是否支援換膚。android 7.0允許使用者按照他們的喜好修改表情符號的膚色。鍵盤app應該提供視覺顯示,有多個膚色可供使用者選擇。如果要確定系統有哪些表情符號膚色可以修改的話,可以使用 hasGlyph(String)方法。你要確定哪些表情符號使用膚色,請看Unicode documentation文件。

15.ICU4J APIs in Android

android 7.0現在提供了ICUJ API的子集,在android framework的 android.icu 包下。遷移到它是很容易的。最主要的是改變 com.java.icu 名稱空間為 android.icu 。如果你在你的app中已經使用了ICU4J捆綁包,切換到android framework中的android.icu的API,可以減少你apk包的大小。

關於更多的ICU4J APIs,請看 ICU4J Support。

16.WebView

1.Chrome + WebView, Together

從android 7.0和Chrome瀏覽器版本51開始,你裝置中的Chrome apk將被提供和渲染給android系統的WebViews來使用。到目前為止,這個方式改善了系統記憶體的使用,也減少了保持WebView的頻頻寬度的要求。(作為獨立的WebView apk將不再更新,只要保留Chrome瀏覽器就行)

在開發者選項WebView implementation中,你可以選擇WebView的提供商。你可以使用任何一款相容的Chrome瀏覽器版本 (Dev, Beta or Stable),安裝在你的裝置上,或者用實現WebView的獨立WebView apk。

2.Multiprocess(多程序)
從android 7.0和Chrome瀏覽器版本51開始,WebView將執行web內容在一個分離的沙盒執行緒中,當開發者啟用“Multiprocess WebView”選項時。

我們正在尋找資料在相容性和執行時的效能,能夠在未來的android版本上執行多程序的WebView。在這個版本上,迴歸啟動時間,總的記憶體使用,軟體預計渲染的效能。

如果在多程序模式中發生了意想不到的問題,我們想聽到這些。如果有問題,請在Chromium bug tracker上面和WebView團隊溝通。

3.Javascript run before page load

在android7.0上執行一個app,javascript的context將會被重置,當一個新的頁面載入時。一般地,context通過第一個頁面的載入攜帶到一個新的WebView例項。

開發者可以通過在javascript上注入javascript,在頁面已經載入後,應該執行該指令碼。

4.Geolocation on insecure origins(在不安全的來源定位)

在android7.0上執行一個app,定位的API只允許在安全的來源,這個方案的設計是為了保護使用者的隱私資訊,當他們使用不安全的連線時。

5.Testing with WebView Beta

WebView定期更新,所以我們推薦你測試下app使用了WebView Beta版的相容性,在android 7.0上測試WebView的釋放版本,下載安裝Chrome的開發版和Chrome的Beta版,選擇它作為WebView的實現,在開發者選擇的描述下面。請在Chromium bug tracker 上面報告問題,我們將修復問題,並且釋出一個新的WebView版本。

17.OpenGL™ ES 3.2 API

android 7.0添加了新的framework API來支援OpenGL ES 3.2,包括:

1.除了EXT_texture_sRGB_decode之外,擴充套件了所有的 Android Extension Pack。

2.針對 HDR 的浮點幀緩衝和延遲著色。

3.BaseVertex 繪圖呼叫可實現更好的批處理和流媒體服務。

4.強大的緩衝區訪問控制可減少 WebGL 開銷。

OpenGL ES 3.2的API和GLES32一起被提供。當使用 OpenGL ES 3.2時,一定要在清單檔案中宣告< uses-feature >標籤和android:glEsVersion屬性。

關於OpenGL ES的更多資訊,包括裝置在執行時檢查是否支援OpenGL ES,請看OpenGL ES API guide文件。

18.Android TV Recording(Android TV 錄製)

android 7.0增加了新錄製API,可以錄製和重播從android TV輸入服務獲取的內容。構建在現有時移 API 之上,TV輸入服務能夠控制渠道資料被錄製,怎樣讓會議記錄被儲存,通過錄制內容可以管理使用者之間的互動。

更多資訊,請看Android TV Recording APIs。

19.Android for Work

在執行android 7.0時,android的工作添加了新的功能和API。下面是一些重要的內容–完整的改變列表,請看Android for Work Updates。

1.Work profile security challenge(工作資料的安全挑戰)

面向 N SDK 的個人資料所有者可以為在工作資料中執行的app指定單獨的安全性挑戰。當用戶試圖開啟任何一個app,這個工作挑戰將被展示。成功地完成安全挑戰,解鎖工作檔案,並破解它,如果是需要的話。對於資料的所有者,ACTION_SET_NEW_PASSWORD 提示使用者設定一個工作挑戰,ACTION_SET_NEW_PARENT_PROFILE_PASSWORD 提示使用者設定一個裝置鎖。

資料所有者針對工作挑戰設定特別的密碼,通過使用 setPasswordQuality(),setPasswordMinimumLength()和相關的方法。(例如:PIN 必須多長,或者是否可以使用指紋解鎖個人資料)。資料所有者也可以設定裝置所,用過使用DevicePolicyManager 例項,返回它並呼叫 getParentProfileInstance()方法。此外,資料所有者可以針對工作挑戰設定自定義憑據螢幕,通過使用setOrganizationColor() 和 setOrganizationName()方法。

2.Turn off work(關閉工作)

在一個有工作概況的裝置上,使用者能夠開關這個工作模式。當工作模式關閉的時候,管理使用者的功能臨時關閉,禁用工作資料app,後臺同步,通知。它包括資料所有者的應用程式。當關閉工作模式時,系統顯示永久狀態圖示,以提醒使用者他們無法啟動工作應用。啟動器指示這個工作app和元件無法訪問。

20.Always on VPN(總是開啟VPN)

裝置的所有者和個人資料的所有者,要確定工作的app總是連線到指定的VPN,在裝置boot的時候,系統自動開始啟用該VPN。

新的DevicePolicyManager方法有setAlwaysOnVpnPackage()getAlwaysOnVpnPackage()

因為VPN服務能夠直接繫結系統,而不和app互動,VPN客戶端需要針對 Always on VPN處理新的進入點。和以前一樣,服務能夠指定系統,通過intent-filter的action匹配android.net.VpnService

使用者也能夠設定Always on VPN客戶端,實現VPNService的方法,在設定裡操作Settings>More>Vpn。只有API 24才能在設定裡開啟這個選項。

21.Customized provisioning(自定義配置)

一個應用程式可以用公司顏色和圖示,來自定義配置檔案所有者和裝置所有者。
DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR 定義流程的顏色,DevicePolicyManager.EXTRA_PROVISIONING_LOGO_URI 定義流程的公司圖示。

22.Accessibility Enhancements(無障礙功能加強)

android 7.0 現在支援視覺設定,在一個新裝置啟動的歡迎介面,可以直接設定。對使用者來說,在裝置上可以很簡單的發現和配置無障礙功能,包括放大手勢,字型大小,顯示大小和對講系統。

隨著這些無障礙功能更為突出,在開啟這些功能後,你的使用者可能更喜歡你的app。確保在開啟無障礙功能下,測試過你的app。你可以在設定的Settings > Accessibility。

在android 7.0中,無障礙服務可以幫助有運動障礙的使用者觸控式螢幕幕。新的 API 允許使用人臉追蹤、眼球追蹤、點掃描等功能構建服務,以滿足這些使用者的需求。

關於更多的資訊,請看GestureDescription文件。

23.Direct Boot(直接啟動)

直接啟動改善來裝置的啟動時間,讓註冊的應用程式具有有限的功能,即使在機器意外重啟後。例如,當用戶睡覺的時候,一個加密裝置重啟,設備註冊來鬧鐘,簡訊,來電,在重啟後能正常通知使用者。這也意味著無障礙服務在重啟後可以立即使用。

在android 7.0中,直接啟動充分利用檔案加密技術,針對系統和應用資料啟用細粒度的加密策略。該系統使用一個加密裝置儲存選擇的系統資料和指定註冊的應用程式資料。在預設情況下,證書加密的儲存可用於所有其他系統資料,使用者資料,應用及應用資料。

在啟動時,系統在受限的模式下開始,並且只能訪問加密裝置的資料,不能訪問一般的應用和資料。如果你有想在此模式下執行的元件,你可以通過在清單檔案設定一個flag,來註冊它們。在重啟後,系統啟用註冊的其他資料是不能用的,直到使用者得到證書解密,並且鎖定螢幕。

關於更多資訊,請看 Direct Boot。

24.Key Attestation(金鑰認證)

android 7.0引入了金鑰認證,一個新的安全工具,可以幫助你確保金鑰儲存在裝置的硬體支援金鑰庫中,緊密的保護來應用程式的使用者的私人資訊。通過使用這個工具,從應用程式和駐留在安全硬體中的金鑰的互動中,你能夠獲取額外的信任,甚至root過的裝置也可以執行你的應用程式。如果你的應用程式使用從硬體支援的金鑰庫中的金鑰,你應該使用這個工具,尤其是你使用這個金鑰來核實你應用程式的私有資訊。

金鑰認證允許你核實RSA 或者 EC 金鑰是否被建立和儲存在裝置的硬體支援金鑰庫中,在裝置的可信執行環境下(TEE)。該工具也允許你使用關閉裝置服務,如你應用程式的後端伺服器,確定並有力地驗證金鑰對的使用和有效性。這個功能提供了一個額外的安全級別,來保護金鑰對,甚至某些人root了裝置,或者破解來安卓平臺的執行安全。

注意:只有一小部分裝置執行在android 7.0上支援硬體級別的金鑰認證,所有的其他裝置執行在android 7.0用軟體級別的金鑰認證代替。在你核實產品級別環境中的硬體支援金鑰庫的屬性時,你應該確保裝置支援硬體支援的金鑰庫。這樣做,你應該檢查證書鏈是否包含root證書,該證書是有Googleroot證書金鑰和attestationSecurityLevel元素下簽名的,key description資料結構設定了TrustedEnvironment 的安全級別。

關於更多資訊,請看 Key Attestation 文件。

25.Network Security Config(網路安全配置)

在android 7.0中,應用程式能夠安全地自定義他們的安全連線行為,而不需要程式碼修改,通過使用Network Security Config,而不是使用傳統的易出錯的程式設計API。(例如: X509TrustManager)

支援一下功能:

1.自定義信任點。 讓一個應用程式自定義哪個官方證書(CA)是信任的安全連線。例如,信任特定的自簽署的證書,或者限制公共的官方證書。

2.僅除錯覆蓋。 讓開發者安全的除錯一個安全的連線,而不會增加安裝基礎的風險。

3.明文流量選擇退出。讓應用可以防止自身意外使用明文流量。

4.證書固定。這是一項高階功能,讓應用可以針對安全連線限制哪些伺服器金鑰受信任。

關於更多資訊,請看 Network Security Config文件。

26.Default Trusted Certificate Authority(預設信任的證書機構)

預設情況下,在android 7.0上的應用程式只信任系統提供的證書,而不再信任使用者新增的證書機構。。 如果在android 7.0上的app希望信任使用者新增的CA,則應使用Network Security Config 指定信任使用者CA。

27.APK Signature Scheme v2(apk簽名方案v2)

android 7.0引入了v2的apk簽名方案,一個新的app簽名方案,它提供了更快的app安裝時間和更多針對未授權 APK 檔案更改的保護。預設情況下,android studio 2.2和android gradle 外掛2.2,他們都能使用v2和傳統的簽名方式來簽名你的應用程式。

雖然我們推薦使用v2的apk簽名方案,這個新方案不是強制的。當使用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
      }
    }
  }

警告: 如果你使用v2來簽名你的應用程式,並對應用進一步修改,則app簽名將無效。因為這個原因,請在使用v2簽名之前,使用zipalign工具,而不是之後使用。

關於更多資訊,請閱讀介紹如何在 Android Studio 中籤名一個app,以及如何使用 Android Gradle 外掛來為簽名app配置build檔案。

28.Scoped Directory Access(作用域的目標訪問)

在android 7.0中,app能夠使用新的API來要求訪問指定的額外的儲存目錄,包括可移動媒體上的目錄,如 SD 卡。這個新的API大大地簡化了應用程式怎樣去訪問標準的外部儲存目錄,比如相簿目錄。照片app使用這些API,而不用READ_EXTERNAL_STORAGE,授權訪問所有的儲存目錄,或者儲存訪問框架,讓使用者可以導航到該目錄。

此外,這個新的API簡化了使用者授權訪問外部儲存的步驟。當你使用這個新的API時,系統使用一個簡單的許可權UI,清楚詳細地介紹app正在請求訪問的目錄的資訊。

關於更多資訊,請看Scoped Directory Access文件。

29.Keyboard Shortcuts Helper(鍵盤快捷鍵幫助)

在android 7.0中,使用者可以按下Meta + 觸發鍵盤快捷鍵螢幕,顯示系統和獲得焦點的app所有可用的快捷鍵。系統會自動從app選單中檢索出快捷鍵,如果快捷鍵存在的話。你也能夠提供你自己調整的快捷鍵列表,你可以通過重寫onProvideKeyboardShortcuts() 來做到這些。

注意: Meta 鍵現在不是所有的鍵盤上都有,在蘋果公司的鍵盤上,它是Command 鍵;在Windows鍵盤上,它是Windows 鍵;在 Pixel C和 Chrome OS 鍵盤上,它是Search 鍵。

你可以在應用程式的任何地方觸發鍵盤快捷鍵幫助,在相關Activity中呼叫requestShowKeyboardShortcuts()方法。

30.Custom Pointer API(自定義指標API)

android 7.0引入了自定義指標API,讓你可以自定指標外觀,可見度,行為。這個功能是很有用的,當用戶使用滑鼠或者觸控板和UI物件進行互動的時候。預設的指標使用一個標準的圖示。該API也包括一些高階功能,如改變指標的顯示圖示,在滑鼠或者觸控板移動的時候。

為了設定指標的圖示,重寫View類的 onResolvePointerIcon()方法。該方法使用PointerIcon物件繪製出圖示,來對應於一個特定的事件運動。

31.Sustained Performance API(持續性的API)

長期執行的app的效能可能波動的比較明顯,因為系統會阻止系統晶片下裝置元件的溫度限制。這個波動顯示的目的是開發者建立了一個高效能,長期執行的app。

為了解決這些侷限性,android 7.0支援了持續的效能模式,啟用OEMs 提供關於長期執行應用的裝置效能能力的提示。開發者能夠使用這些提示來預測的大部分裝置效能水平,以調整長期應用。

開發者可以在Nexus 6P裝置上嘗試這些API。為了使用這些功能,設定持續的效能視窗標誌,你想要執行持續的效能模式。設定這個標誌位使用Window.setSustainedPerformanceMode() 方法。當視窗丟失焦點時,系統會自動禁用該模式。

32.VR Support(VR支援)

android 7.0增加了新的VR模式的平臺支援和優化,讓開發者可以構建一個高質量的VR體驗給使用者。有大規模的效能增強,包括VR app可以訪問特有的cpu核心。在你的app內部,你可以獲得智慧頭部跟蹤和立體聲通知的功能。更重要的是,android 7.0提供了非常低的圖形延遲。

關於在android 7.0構建一個完整的VR app,請看Google VR SDK for Android文件。

33.Print Service Enhancements(列印服務增強)

在android 7.0 中,列印服務開發者可以公開個人印表機和列印作業的一些資訊。

當列出個人印表機列表,一個列印服務現在能夠設定兩種每臺印表機圖示。

1.你可以通過呼叫setIconResourceId()方法來設定源於資源 ID 的圖示

2.你能夠顯示一個圖示從網路上,通過setHasCustomPrinterIcon()方法,設定一個回調當圖示被請求的時候,通過onRequestCustomPrinterIcon()方法。

此外,你能夠提供每臺印表機的行動,顯示額外的資訊,通過 setInfoIntent()方法。

你可以用一個進度顯示印表機工作的狀態,可以分別通過 setProgress() 和 setStatus()方法來通知列印工作。

34.Frame Metrics API

畫面計算API允許app監視UI渲染效能。API提供了一個功能,暴露Pub/Sub流 API轉換成一幀的時間,在app的當前視窗。這個資料的返回與使用 adb shell dumpsys gfxinfo framestats命令的顯示是一樣的,但不限定於在過去的 120 幀內。

你能夠使用幀計算API來測試UI效能的互動級別,而不需要usb連線。該API允許收集細粒度的資料,呼叫 adb shell dumpsys gfxinfo 命令。細粒度可能因為系統需要採集app特別互動的資料;系統不需要採集關於完整應用效能的全域性概要,或者清除任何全域性狀態。你可以使用這個功能來針對app的真實使用案例收集效能資料和捕捉迴歸UI效能。

為了監視一個視窗,實現OnFrameMetricsAvailableListener.onFrameMetricsAvailable() 回撥方法,並在窗口裡面註冊它。

該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。

35.Virtual Files(虛擬檔案)

在以前的android版本,使用者能夠使用Storage Access Framework 來允許使用者從他們的雲端儲存帳戶中選擇檔案,如: Google Drive。但是,沒有方法來表示檔案,通用一個直接的位元組碼來表示,每個檔案都被要求提供一個輸入流。

android 7.0在Storage Access Framework裡面增加來虛擬檔案的概念。虛擬檔案功能允許你的DocumentsProvider返回一個文件的Uri,可以通過意圖的 ACTION_VIEW 來使用,即使他們不能直接用位元組碼錶示。android 7.0也允許你對使用者檔案提供備份,虛擬,或者其他的。

應用程式得到虛擬文件的URI,首先,你要建立一個Intent來開啟檔案選擇器。由於app不能夠直接開啟虛擬文件,通過使用openInputStream() 方法。你的app不能夠接收任何虛擬檔案,如果你包含CATEGORY_OPENABLE屬性的話。

最後,使用者要做一個選擇,系統會呼叫 onActivityResult() 方法。你的app能夠檢索到虛擬檔案的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);
      }
  }

關於訪問使用者檔案的更多資訊,請看 Storage Access Frameworks guide文件。