Android5,6,7,8新特性

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 。一般情況下,我們不建議在主線程上執行網絡操作,因爲這些操作通常會出現可能導致 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 8.0(概念)

API級別:24
1.合併Chrome OS
據傳,谷歌或可合併Android與Chrome OS以使平臺更加統一。
2.多窗口模式
  多窗口模式能夠充分利用大屏手機、平板的屏幕空間。
3.OpenJDK替換Java API
  Android不再使用Java API是因爲官司敗訴過。OpenJDK能夠更簡單地創建通用代碼,從而改善Android的開發環境。
4.3D Touch功能
 實際上國產華爲已經有相關產品預先支持3D Touch功能了,而三星也將會提供相應的支持。
5.獨立升級
  如果真的可以實現的話,用戶就可以直接通過谷歌進行升級,完全避開第三方的限制,相信這是用戶及其渴望的。無需等待,可從官方直升最新版,但是怎樣解決兼容等問題是急需解決的問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章