1. 程式人生 > >Android5.0,6.0,7.0,8.0新特性整理

Android5.0,6.0,7.0,8.0新特性整理

背景

Android5.0(Android Lollipop)是谷歌公司2014年10月釋出的全新安卓系統,至今已經兩年多。然而由於國產手機對安卓ROM的深度定製或修改,以及手機廠商、晶片製造商、運營商之間錯綜複雜的關係,我們更新最新安卓版本往往需要1年左右時間的等待。2015年5月釋出了Android6.0(Android Marshmallow),2016年8月釋出了Android7.0(Android Nougat)。目前來說,用上6.0系統的手機都不太多,Android4.4和Android5.1版本佔比重較高。但是,隨著時間推移,手機陸續都會升級到更高的系統版本,所以,提前學習到各版本的新特性,把一下好的效果新增到程式碼中,並儘量做到向下相容,應用才能擁有更好的體驗,面對升級過後的系統才能從容不迫。

概述內容

從Android 5.0(Android Lollipop)開始,android迎來了扁平化時代,使用一種新的Material Design 設計風格,設計了全新的通知中心,開始支援多種裝置。在效能上,放棄了之前一直使用的Dalvik虛擬機器,改用ART模式,程式載入時間大幅提升。增加了Battery Saver模式來進行省電處理,以及全新的“最近應用程式”。

Android 6.0(Android Marshmallow)最大的亮點是為使用者提供了兩套相互獨立的解決方案,簡單的說,就是為每位使用者的每一個應用提供了兩套資料儲存方案。一套儲存工作資料,另一套儲存個人資訊。另外Android M系統層面加入指紋識別,還加入了執行時許可權,加入了App Standby(應用待機)、Doze(瞌睡)Exemptions(豁免)等模式來加強電源管理。

Android 7.0(Android Nougat),在效能處理有了巨大的提升,同時對檔案資料加密,更加安全。 添加了分屏多工,重新設計了通知,改進Doze休眠機制等。總而言之,Android N將更快,更高,更強。

Android 5.0新特性

Material Design

提起Android5.0,就不得不說Material Design,扁平化的設計理念。新的視覺語言,在基本元素的處理上,借鑑了傳統的印刷設計,字型版式、網格系統、空間、比例、配色、影象使用等這些基礎的平面設計規範。

之前的一些需要自定義的效果,現在都提供了系統級的支援,用起來更加方便了,而且android提供的效果看起來更加流暢。這裡篇幅較多,本著不重複造輪子的思想,筆者找了一片寫的很全面的Material Design的網站,圖文並茂,值得學習。

支援多種裝置

現在無論是智慧手機、平板電腦、膝上型電腦、智慧電視、汽車、智慧手錶甚至是各種家用電子產品,谷歌的Android系統已經可以在所有裝置的螢幕上出現。而這一概念與微軟不謀而合,之前微軟也宣佈將會把Windows 10打造成跨裝置跨平臺的統一系統,幫助自己走出困境。

全新通知中心設計

谷歌在Android Lollipop中加入了全新風格的通知系統。改進後的通知系統會優先顯示對使用者來說比較重要的資訊,而將不太緊急的內容隱藏起來。使用者只需要向下滑動就可以檢視全部的通知內容。

新的通知系統另外一個很酷的新功能是在鎖屏介面也可以直接檢視通知訊息了。不僅如此,使用者還可以直接在鎖屏的情況下就行回覆或進入應用。另外,如果在操作手機的過程中有電話進入,也不會進行全畫面切換,而是同樣以彈出通知的方式告知使用者。

支援64位ART虛擬機器

新系統不僅在視覺效果上帶來了巨大的變化,Android Lollipop還在內部的效能上進行了飛躍。首先,新系統放棄了之前一直使用的Dalvik虛擬機器,改用了ART模式,實現了真正的跨平臺編譯,在ARM、X86、MIPS等,無處不在。

ART 虛擬機器編譯器在記憶體佔用及應用程式載入時間上進行了大幅提升,谷歌承諾所有效能都會比原來提升一倍。另外,對64位的支援也讓ART虛擬機器如魚得水,開發者可以針對像ARM Cortex-A57這樣的64位架構核心開發應用程式。Android Lollipop支援更大的暫存器,支援新的指令集,提升了記憶體定址空間,未來Android智慧手機將支援4GB以上的記憶體。

Project Volta電池續航改進計劃

Project Volta計劃增加了新工具可以讓開發者能夠更容易的找出為何自己的應用程式會對電量產生比較大的影響,同時確保在執行某型任務時將手機電量的影響降至最低。首先,Battery Historian可以列出手機電量消耗的詳細情況,幫助開發者識別電量消耗的原因或者是哪個硬體或任務對電池壽命的影響比較大;而Job Scheduler API則可以讓開發者更容易的選擇合適的時機觸發電量消耗比較高的任務,避免在低電量或未完成充電時更新應用程式。

上面是針對開發者的改進,而在使用者層面上,Android Lollipop增加了Battery Saver模式,這與三星和HTC上的超級省電模式有些類似。在低電量的時候系統會自動降低螢幕亮度、限制自動更換背景等功能。

全新的“最近應用程式”

除了介面風格設計的改變之外,新的最近應用介面還借鑑了Chrome瀏覽器的理念,採用單獨的標籤展示方式。更重要的是,谷歌已經向開發者開放了API,所以第三方開發人員可以利用這個改進為特定的應用增加全新的功能。

改進安全性

現在個人識別解鎖還是一個比較新鮮的智慧概念,當用戶的藍芽耳機連線到手機或平板電腦時,裝置可以基於當前的位置或使用者的聲音自動解鎖。比如當特定的智慧手錶出現在Android裝置的附近,那麼就會直接繞過鎖屏介面進行操作。而Android Lollipop也增加了這種針對特定特任識別解鎖的模式。換句話說,當裝置沒有檢測到附近有可用的信任裝置時,就會啟動安全模式防止未授權訪問。

另外,Android Lollipop還預設開啟了系統資料加密功能,並且通過SELinux執行應用程式,這就意味著對於惡意軟體來說,新系統變得更加安全。

不同資料獨立儲存

谷歌表示Android Lollipop將擁有一個全新的特性,讓使用者通過一臺裝置就可以搞定所有的工作和生活娛樂活動。該特性首先將各種資料獨立儲存,並且讓所有新資料的生成都有依據。

我們已經看到谷歌已經與三星加強了合作,包括三星的Knox安全系統同樣可以像Android Lollipop一樣將重要資料和其它資料分開儲存。另外谷歌還允許向三星以外的Android裝置提供支援。

改進搜尋

谷歌將新系統的搜尋功能重點放在了“重新發現”上,因此這意味著Google Search將會更好的意識到使用者正在做什麼。比如系統會根據使用者當前的位置自動過濾無關的搜尋結果。

另外,當用戶在進行應用搜索時,可以直接展示相似或部分提示,並且進入特定的應用程式而無需將內容全部輸入。

支援藍芽4.1、USB Audio、多人分享等其它特性

Android Lollipop還增加了多個新的API支援、藍芽4.1、USB Audio外接音響及多人分享等功能。其中多人分享功能可以在使用者手機丟失的情況下,使用其它Lollipop裝置登入賬戶,從雲端下載聯絡人、日曆等資料,並且不影響其它裝置的內容。

Android 6.0 新特性

動態許可權管理

Android 6.0引入了動態許可權管理,將標記為危險的許可權從安裝時許可權(Install Time Permission)模型移動到執行時許可權模型(Runtime Permissions):

安裝時許可權模型(Android5.1以及更早):使用者在應用安裝和更新時,對危險許可權授權。但是OEM和執行商預裝的應用將自動預授權。

執行時許可權(Android6.0及以後):使用者在應用執行時,對應用授予危險許可權。由應用決定何時去申請許可權(例如,在應用啟動時或者使用者訪問某個特性時),但必須容許使用者來授予或者拒絕應用對特定許可權組的訪問。OEM和運營商可以預裝應用,但是不能對許可權進行預授權。

執行時許可權提供給使用者關於應用所需許可權更多的相關上下文和可視性,這也讓開發者幫助使用者更好的理解:為什麼應用需要所請求的許可權,授權將有什麼樣的好處,拒絕將有何種不便。使用者可以通過設定中的選單來撤銷應用的許可權。

受影響的許可權

系統要求標記為危險(dangerous)的許可權使用執行時許可權模型。檢視危險許可權列表可以使用命令:adb shell pm list permissions -g -d 。

Android6.0並不改變正常許可權的行為。正常許可權指的是所有非危險(non-dangerous)許可權,包括normal,system和signature 許可權。正常許可權風險較低,用於容許應用以最小風險來訪問隔離的應用級別的特性。在Android5.1和早期版本中,系統在安裝時自動將正常許可權授予請求的應用,並不提示使用者

請求許可權

執行時許可權模型適用於所有應用,包括預裝應用。應用軟體的要求包括:

執行時許可權模型必須在所有執行Android6.0的裝置上是一致的。這通過CTS來實施。

應用必須在執行時提示使用者進行授權。

帶有危險許可權的預裝應用,必須符合API level 23,必須維護Android6.0的AOSP許可權模型(例如,應用安裝的UI流程不應該脫離AOSP的packageInstaller的實現;使用者可以撤銷預裝應用的危險許可權;等等)。

無介面的應用必須使用Activity來申請許可權,或者與其他有相應許可權的應用共享UID。

許可權遷移

在裝置從Android5.x升級到Android6.0之後,授予應用的許可權仍然有效。但是使用者可以在任何時候撤銷這些許可權。

指紋識別(Fingerprint Support)

說到指紋識別,很多使用者都會覺得現在的中高階安卓手機都支援,但事實上這些安卓手機的指紋識別都是各個廠商自行開發的並沒有系統底層的支援。Android 6.0則在系統層面加入指紋識別,能提供原生指紋識別API,這不但降低了廠商開發指紋識別模組的成本,最重要的是原生指紋識別將會大大提升安卓手機的指紋識別支付安全性。

Android M加強了軟體間的關聯,谷歌在現場展示了一個例子,比如你的手機郵箱裡收到一封郵件,內文裡有以個Twitter連結,使用者點選該連結可以直接跳轉到Twitter應用,而不再是網頁。

Chrome App Links這個就相當於在Web中使用Scheme來進行App的跳轉功能一樣,只不過這裡Chrome預設就支援了,使用者只需要搜尋相關的關鍵詞,就可以直接顯示App,然後通過App Link直接啟動App。這個東西對使用者來說應該是一件非常好、方便的事情,但由於國內這些瀏覽器的問題,不知道能否會相容這個功能。

Android pay

Android支付統一標準。新的M系統中集成了Android Pay。其特性在於簡潔、安全、可選性。Android Pay是一個開放性平臺,使用者可以選擇谷歌的服務或者使用銀行的APP來使用它,Android Pay支援4.4以後系統裝置,谷歌宣佈Android Pay已經與美國三大運營商700多家商店達成合作,支付功能可以使用指紋來進行支付。

電源管理

Android6.0引入了下列特性來延長電池使用時間:

App Standby(應用待機): 系統可以將未使用的應用置為AppStandby模式,臨時限制這些應用的網路訪問,延遲同步和後臺job

Doze(瞌睡): 如果使用者在某個時間期限內未主動使用裝置(螢幕關閉、裝置靜止),平臺將進入深度睡眠狀態。因為該特性要求平臺檢測靜止狀態,因此只有那些在Sensor HAL中實現了顯式移動檢測API的裝置中才有效。

Exemptions(豁免): 預裝在裝置上的系統應用和雲訊息服務,預設通常被豁免。應用開發者可以要求其應用使用這種設定。使用者也可以在設定中來豁免某些應用。

App Standby

對於不常用的應用的,AppStandby通過延遲後臺網路活動和任務來延長電池壽命。 
生命週期

  • 檢測:當裝置不在充電時,且在某個特定時鐘期限內和亮屏時長中,使用者沒有直接或者間接啟動該應用。間接啟動指的是:前臺應用訪問另外某個應用的service。
  • App Standy模式中:平臺限制應用一天內最多訪問一次網路,延遲其同步和其他後臺任務。
  • 退出:當應用被啟用,或者裝置充電時,平臺將該應用移出App Standby狀態。

活動的應用不受AppStandby的影響。活動的含義是:

程序處於前臺(Activity 或者前臺服務,或者由另外一個Activity 或前臺服務所使用),例如 notification listener,輔助服務,live 牆紙,等等。

供使用者檢視的通知,可以是鎖屏通知或者通知圖示。

使用者顯式啟動的應用。

Doze

支援Doze功能的要求:

裝置在Sensor HAL實現了significant motion detector (SMD) APIs 。

裝置有某個雲訊息服務,如 Google Cloud Messaging (GCM)。這使得裝置可以知道何時從Doze中喚醒。

生命週期
  • 檢測:當未在充電時,且當裝置靜止且滅屏了一段時間。
  • Doze期間:平臺嘗試讓系統處於休眠狀態,週期性地進入在一個維持視窗恢復正常操作,然後進入更長的休眠狀態。在休眠狀態: 
    禁止網路訪問 
    忽略 wakelock 
    延遲鬧鐘,除了鬧鈴 和使用setAndAllowWhileIdle()設定的鬧鐘,以榮喜日曆等應用顯示事件提醒 
    停止WIFI掃描 
    同步和後臺任務被推遲到下一個維護視窗。 
    接收簡訊和MMS訊息的應用位於一個臨時白名單,這樣他們可以完成其工作。
  • 退出: 
    使用者互動 
    裝置移動 
    亮屏 
    鬧鈴
整合Doze
  1. 確認裝置支援 SENSOR_TYPE_SIGNIFICANT_MOTION .
  2. 確認裝置安裝了一種雲訊息服務。
  3. 在配置檔案overlay/frameworks/base/core/res/res/values/config.xml中,修改:bool name=”config_enableAutoPowerModes”>true
  4. 檢查裝應用和服務: 
    Use the new power-saving optimization guidelines. For details, see Testing and optimizing applications. 
    OR,Are exempted from Doze and App Standby. For details, see Exempting applications.
  5. 確認必要的服務從Doze中豁免。

Exemptions

你可以在設定中,手動將某些應用從Doze和AppStandby中排除。

儲存

在之前,安卓系統雖然可以支援TF卡擴充套件,但TF卡擴充套件的容量只能當成外接儲存。雖然使用者可以把照片、音樂等內容放進去,但App不能安裝到其中。在安卓6.0中,當首次插入TF卡的時候,系統會詢問會將TF卡作為外接還是內建儲存。如果選擇作為內建儲存,系統則會對TF卡格式化並加密——注意,這會丟失資料!然後,TF卡的容量就和裝置的內建儲存融合了。

一般來說,裝置的內建儲存速度會比TF卡快上不少,穩定性也更高,因此如果不是容量特別緊張,並不建議把TF當成內建儲存植入。同時,市面上支援TF卡擴充套件的安卓裝置也越來越少,安卓6.0的這個新特性也許會遭到冷遇。

Android 7.0 新特性

Android7.0提供新功能以提升效能、生產效率和安全性。

關於Android N的效能改進,Android N建立了先進的圖形處理Vulkan系統,能少的減少對CPU的佔用。與此同時,Android N加入了JIT編譯器,安裝程式快了75%,所佔空間減少了50%。

在安全性上,Android N加入了全新安全效能,其中包括基於檔案的資料加密。谷歌移動版Chrome能識別惡意網站。

Android N可以進行無縫更新,與Chromebook一樣,使用者將不再需要下載安裝,也不再需要進行重啟。

在效率提升上,Android N可以自動關閉使用者較長時間未使用的應用程式。在通知上新增了直接回復功能,並支援一鍵全部清除功能

分屏多工

進入後臺多工管理頁面,然後按住其中一個卡片,然後向上拖動至頂部即可開啟分屏多工,支援上下分欄和左右分欄,允許拖動中間的分割線調整兩個APP所佔的比例。

全新下拉快捷開關頁

在Android 7.0中,下拉開啟通知欄頂部即可顯示5個使用者常用的快捷開關,支援單擊開關以及長按進入對應設定。如果繼續下拉通知欄即可顯示全部快捷開關,此外在快捷開關頁右下角也會顯示一個“編輯”按鈕,點選之後即可自定義新增/刪除快捷開關,或拖動進行排序。

新通知訊息

通知訊息快捷回覆

加入了全新的API,支援第三方應用通知的快捷操作和回覆,例如來電會以橫幅方式在螢幕頂部出現,提供接聽/結束通話兩個按鈕;資訊/社交類應用通知,還可以直接開啟鍵盤,在輸入欄裡進行快捷回覆。

通知訊息歸攏

Android7.0會將同一應用的多條通知提示訊息歸攏為一項,點選該項即可展開此前的全部通知,允許使用者對每個通知執行單獨操作。

夜間模式

Android7.0中重新加入了夜間深色主題模式,該功能依然需要在系統調諧器中開啟,從頂部下劃開啟快捷設定頁,然後長按其中的設定圖示,齒輪旋轉10秒鐘左右即可提示已開啟系統調諧器,之後使用者在設定中即可找到“系統調諧器”設定項。點開其中的“色彩和外觀”,即可找到夜間模式,開啟後即可使用全域性的深色主題模式,同時亮度和色彩也會進行一定的調整,該功能可以基於時間或地理位置自動開啟。另外,系統調諧器中也提供了RGB紅綠藍三色調節滑動條,允許使用者手動精細調節,例如減少藍色或增加紅色以提供類似護眼模式的效果。

流量保護模式

新增的流量保護模式不僅可以禁止應用在後臺使用流量,還會進一步減少該應用在前臺時的流量使用。推測其有可能使用了類似Chrome瀏覽器的資料壓縮技術。此外,谷歌還擴充套件了ConnectivityManager API的能力,使得應用可以檢測系統是否開啟了流量保護模式,或者檢測自己是否在白名單中。Android7.0允許使用者單獨針對每個應用,選擇是否開啟資料保護模式。

全新設定樣式

Android7.0啟用了全新的設定樣式,首先每個分類下各個子項之間的分割線消失了,只保留分類之間的分割線。全新的設定選單還提供了一個綠色的頂欄,允許使用者通過後方的下拉箭頭,快速設定勿擾模式等。除了勿擾模式外,頂欄選單還可以顯示諸多其他的設定狀態,例如資料流量的使用情況,自動亮度是否開啟等。谷歌也在安卓7.0的設定中加入了漢堡選單,在二級設定介面中的左上角,你就會看到這個漢堡選單,點選後即可看到所有設定項,方便使用者快速跳轉。

改進的Doze休眠機制

谷歌在Android7.0中對Doze休眠機制做了進一步的優化,在此前的Android6.0中,Doze深度休眠機制對於改善安卓的續航提供了巨大的作用。而在Android67.0中,谷歌對Doze進行了更多的優化,休眠機制的使用規則和場景有所擴充套件,例如只要手動在後臺刪掉應用卡片,關屏後該應用就會被很快深度休眠。

系統級電話黑名單功能

Android7.0將電話攔截功能變成了一個系統級功能。其它應用可以呼叫這個攔截名單,但只有個別應用可以寫入,包括撥號應用、預設的簡訊應用等。被攔截號碼將不會出現在來電記錄中,也不會出現通知。另外使用者也可以通過賬戶體系備份和恢復這個攔截名單,以便快速匯入其它裝置或賬號。

選單鍵快速應用切換

雙擊選單鍵,就能自動切換到上一個應用。此外,如果你不停地點選選單鍵的話,就會在所有應用中不間斷地輪換,應用視窗會自動放大,頂部還會出現倒計時條,停止點選且倒計時結束後,當前應用會自動放大並返回到前臺。

對於開發的影響

各個新版本的Android系統除了提供了諸多新特性和功能外,還對系統和API行為做出了各種變更。以下重點介紹您應該瞭解並在開發應用時加以考慮的一些主要變更。(其中某些變更與上面提到的新特性有重複的地方,姑且聽之)

Android 5.0行為變更

API級別:21

1. Android Runtime(ART)

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

您的應用使用 Java 原生介面 (JNI) 執行 C/C++ 程式碼。
您使用生成非標準程式碼的開發工具(例如,一些程式碼混淆工具)。
您使用與壓縮垃圾回收不相容的技術 

2. 聲音和振動

如果您當前使用 Ringtone、MediaPlayer 或 Vibrator 類向通知中新增聲音和振動,則移除此程式碼,以便系統可以在“優先”模式中正確顯示通知。取而代之的是,使用 Notification.Builder 方法新增聲音和振動。

將裝置設為 RINGER_MODE_SILENT 可使裝置進入新的優先模式。如果您將裝置設為 RINGER_MODE_NORMAL 或 RINGER_MODE_VIBRATE,則裝置將退出優先模式。

以前,Android 使用 STREAM_MUSIC 作為主流式傳輸來控制平板電腦裝置上的音量。在 Android 5.0 中,手機和平板電腦裝置的主音量流式傳輸現已合併,由 STREAM_RING 或 STREAM_NOTIFICATION 進行控制。

3. 鎖定螢幕可見性

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

如果通知不包含個人資訊,或者您想允許媒體播放控制元件顯示在通知上,則呼叫 setVisibility() 方法並將通知的可見性級別設為 VISIBILITY_PUBLIC。

4. 浮動通知

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

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

  • 使用者的 Activity 處於全屏模式中(應用使用 fullScreenIntent)

  • 通知具有較高的優先順序並使用鈴聲或振動

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

5. getRecentTasks()

為提升使用者隱私的安全性,現已棄用 ActivityManager.getRecentTasks() 方法。對於向後相容性,此方法仍會返回它的一小部分資料,包括呼叫應用自己的任務和可能的一些其他非敏感任務(如首頁)。如果您的應用使用此方法檢索它自己的任務,則改用 getAppTasks() 檢索該資訊。

6. 繫結到服務

Context.bindService() 方法現在需要顯式 Intent,如果提供隱式 intent,將引發異常。為確保應用的安全性,請使用顯式 intent 啟動或繫結 Service,且不要為服務宣告 intent 過濾器。

7. webview

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

如果您的應用是面向 API 級別 21 或更高級別:

預設情況下,系統會阻止混合內容和第三方 Cookie。要允許混合內容和第三方 Cookie,請分別使用 setMixedContentMode() 和 setAcceptThirdPartyCookies() 方法。

系統現在可以智慧地選擇要繪製的 HTML 文件部分。這個新的預設行為有助於減少記憶體佔用和提升效能。如果您要一次渲染整個文件,可通過呼叫 enableSlowWholeDocumentDraw() 停用此優化。

如果您的應用是面向低於 21 的 API 級別:系統允許混合內容和第三方 Cookie,並始終一次渲染整個文件。

Android 6.0行為變更

API級別:23

1. 執行時許可權

對於以 Android 6.0(API 級別 23)或更高版本為目標平臺的應用,請務必在執行時檢查和請求許可權。要確定您的應用是否已被授予許可權,請呼叫新增的 checkSelfPermission() 方法。要請求許可權,請呼叫新增的 requestPermissions() 方法。即使您的應用並不以 Android 6.0(API 級別 23)為目標平臺,您也應該在新許可權模式下測試您的應用。

2. 取消支援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'
   }
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

3. BoringSSL

Android 正在從使用 OpenSSL 庫轉向使用 BoringSSL 庫。如果您要在應用中使用 Android NDK,請勿連結到並非 NDK API 組成部分的加密庫,如 libcrypto.so 和 libssl.so。這些庫並非公共 API,可能會在不同版本和裝置上毫無徵兆地發生變化或出現故障。此外,您還可能讓自己暴露在安全漏洞的風險之下。請改為修改原生程式碼,以通過 JNI 呼叫 Java 加密 API,或靜態連結到您選擇的加密庫。

4. 通知

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

adb shell dumpsys notification 命令不再列印輸出您的通知文字。請改用 adb shell dumpsys notification --noredact 命令列印輸出 notification 物件中的文字。

5. 音訊管理器變更

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

6. 相機服務變更

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

根據客戶端應用程序的“優先順序”授予對相機子系統資源的訪問權,包括開啟和配置相機裝置。帶有對使用者可見 Activity 或前臺Activity 的應用程序一般會被授予較高的優先順序,從而使相機資源的獲取和使用更加可靠;

當高優先順序的應用嘗試使用相機時,系統可能會“驅逐”正在使用相機客戶端的低優先順序應用。在已棄用的 Camera API 中,這會導致系統為被驅逐的客戶端呼叫 onError()。在 Camera2 API 中,這會導致系統為被驅逐的客戶端呼叫onDisconnected();

在配備相應相機硬體的裝置上,不同的應用程序可同時獨立開啟和使用不同的相機裝置。但現在,如果在多程序用例中同時訪問相機會造成任何開啟的相機裝置的效能或能力嚴重下降,相機服務會檢測到這種情況並禁止同時訪問。即使並沒有其他應用直接嘗試訪問同一相機裝置,此變更也可能導致低優先順序客戶端被“驅逐”。

更改當前使用者會導致之前使用者帳戶擁有的應用內活動相機客戶端被驅逐。對相機的訪問僅限於訪問當前裝置使用者擁有的使用者個人資料。舉例來說,這意味著,當用戶切換到其他帳戶後,“來賓”帳戶實際上無法讓使用相機子系統的程序保持執行狀態

Android 7.0行為變更

API級別:24

1. 電池和記憶體

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

2. 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 來適應內容提供程式變化。

3. 系統許可權更改

為了提高私有檔案的安全性,面向 Android 7.0 或更高版本的應用私有目錄被限制訪問 (0700)。此設定可防止私有檔案的元資料洩漏,如它們的大小或存在性。此許可權更改有多重副作用:

1.私有檔案的檔案許可權不應再由所有者放寬,為使用 MODE_WORLD_READABLE 和/或 MODE_WORLD_WRITEABLE 而進行的此類嘗試將觸發 SecurityException。 
注:迄今為止,這種限制尚不能完全執行。應用仍可能使用原生 API 或 File API 來修改它們的私有目錄許可權。但是,我們強烈反對放寬私有目錄的許可權。

2.傳遞軟體包網域外的 file:// URI 可能給接收器留下無法訪問的路徑。因此,嘗試傳遞 file:// URI 會觸發 FileUriExposedException。分享私有檔案內容的推薦方法是使用 FileProvider。

3.DownloadManager 不再按檔名分享私人儲存的檔案。舊版應用在訪問 COLUMN_LOCAL_FILENAME 時可能出現無法訪問的路徑。面向 Android 7.0 或更高版本的應用在嘗試訪問 COLUMN_LOCAL_FILENAME 時會觸發 SecurityException。通過使用DownloadManager.Request.setDestinationInExternalFilesDir()DownloadManager.Request.setDestinationInExternalPublicDir() 將下載位置設定為公共位置的舊版應用仍可以訪問 COLUMN_LOCAL_FILENAME 中的路徑,但是我們強烈反對使用這種方法。對於由 DownloadManager 公開的檔案,首選的訪問方式是使用ContentResolver.openFileDescriptor() 。

4. 在應用件共享檔案

對於面向 Android 7.0 的應用,Android 框架執行的 StrictMode API 政策禁止在您的應用外部公開 file:// URI。如果一項包含檔案 URI 的 intent 離開您的應用,則應用出現故障,並出現 FileUriExposedException 異常。

要在應用間共享檔案,您應傳送一項 content:// URI,並授予 URI 臨時訪問許可權。進行此授權的最簡單方式是使用 FileProvider 類。

5. 螢幕縮放

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

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

如果是面向 API 級別 23 或更低版本系統的應用,系統會自動終止其所有後臺程序。這意味著如果使用者切換離開此類應用,轉而開啟 Settings 螢幕並更改 Display size 設定,則系統會像處理記憶體不足的情況一樣終止該應用。如果應用具有任何前臺程序,則系統會如處理執行時更改中所述將配置變更通知給這些程序,就像對待裝置螢幕方向變更一樣。

如果是面向 Android 7.0 的應用,則其所有程序(前臺和後臺)都會收到有關配置變更的通知,如處理執行時更改中所述。

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

1.在螢幕寬度為 sw320dp 的裝置上測試您的應用,並確保其充分執行。

2.當裝置配置發生變更時,更新任何與密度相關的快取資訊,例如快取點陣圖或從網路載入的資源。當應用從暫停狀態恢復執行時,檢查配置變更。 
注:如果您要快取與配置相關的資料,則最好也包括相關元資料,例如該資料對應的螢幕尺寸或畫素密度。儲存這些元資料便於您在配置變更後決定是否需要重新整理快取資料。

3.避免用畫素單位指定尺寸,因為畫素不會隨螢幕密度縮放。應改為使用與密度無關畫素 (dp) 單位指定尺寸。

6. 檢查你的應用是否使用私有庫

為幫助您識別載入私有庫的問題,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
  • 1
  • 2
  • 1
  • 2

這些 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)
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

如果您的應用使用動態連結到私有平臺 API 的第三方庫,您可能也會看到上述 logcat 輸出。利用 Android 7.0DK 中的 readelf 工具,您可以通過執行以下命令生成給定 .so 檔案的所有動態連結的共享庫列表: 
aarch64-linux-android-readelf -dW libMyLibrary.so

7. 其他重要說明

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

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

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

⑵Android 7.0 上的應用應能夠妥善處理配置變更,並且在後續啟動時不會出現崩潰現象。您可以通過更改字型大小 (Setting >Display > Font size) 並隨後從最近使用記錄中恢復執行應用,來驗證應用行為。

⑶由於之前的 Android 版本中的一項錯誤,系統未能將對主執行緒上的一個 TCP 套接字的寫入操作舉報為違反嚴格模式。Android 7.0 修復了此錯誤。呈現出這種行為的應用現在會引發 android.os.NetworkOnMainThreadException