安卓11適配攻略搶先看!

引言

近期,Google 發佈了 Android 11的平臺穩定版本。Android 11 將在確保用戶隱私安全的前提下,更好地讓用戶暢享最新科技。android

下圖是 Android 11 發佈總體流程的時間線:
image安全

個推深耕開發者領域,一直緊跟行業發展趨勢,對Android 11的有關更新展開了深刻研究。本文將從分區存儲、應用包可見性、權限變化和新功能四個方面來談談 Android 11 新特性,以幫助開發者更快速、更便捷地上手適配Android新系統。
imageapp

做者| 個推高級安卓開發工程師 一七性能

正文

分區存儲

Android 10以前,外部存儲區的內容主要以兩種形式存在,一種是由應用的包名命名,歸屬於特定應用目錄下的內容,另外一種是存儲在公共存儲區域的內容。優化

在Android 10 中,Google首次引入了分區存儲,將公共區域劃分紅了不一樣的集合,而且在媒體文件和其餘文檔之間創建了清楚的分割。通過劃分以後應用不能夠隨意訪問外部存儲區中的文件,而只能訪問媒體文件。若是想訪問包含更多細節數據的其餘文檔,應用專門向用戶申請有關文檔的訪問權限。
imagespa

分區存儲是須要以 Android 10 爲目標平臺的,系統默認強制執行。若是在 AndroidManifest 中添加了 requestLegacyExternalStorage=true 標誌,就能夠不受此限制。可是當 target API 更新爲 30 後,系統會忽略該配置。blog

若是有數據須要遷移,能夠在 AndroidManifest 中將 preserveLegacyExternalStorage 屬性設爲 true ,當用戶升級到以 Android 11 爲目標平臺時,這個配置就會生效。具體而言,這個配置在用戶從新安裝該應用前都是有效的。
image遊戲

針對以 Android 11 爲目標平臺的應用 (targetSdkVersion = 30) ,WRITEEXTENRNALSTORAGE 和 WRITEMEDIASTORAGE 再也不提供其餘任何訪問權限 。進程

某些應用的核心功能可能須要訪問大量的文件,例如文件管理操做、備份和恢復操做等等,此時就須要申請 MANAGEEXTERNALSTORAGE 權限。咱們能夠經過使用 ACTIONMANAGEALLFILESACCESS_PERMISSION intent 操做將用戶引導至一個系統設置頁面,讓用戶爲應用授予全部文件的管理權限。開發

應用包可見性

在 Android 11 以前,咱們能夠經過 PackageManager.getInstalledPackages(0) 獲取其餘全部應用的包名等信息。
image

Android 11 爲了增長安全性,更好地保護用戶的隱私,對應用包的可見性作出了一些改動。

當 targetSdkVersion 爲 30 時,若是咱們用getPackageInfo(「another.app」,0) 獲取其餘應用包信息時 ,會出現 NameNotFoundException 的異常。

咱們能夠在 AndroidMainfest 中添加 <queries>來適配特定的使用場景:(該配置至關因而添加應用白名單)

  1. 已知想獲取的包名:

image

  1. 查詢一組具備特定用途的應用或與其交互:

image

  1. 對於一些特殊應用,想要獲取全部包名信息:

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>

權限變化

image
在 Android 11 中,系統爲用戶的私人數據提供了更多可供選擇的受權方式,應用也加大了後臺對位置的訪問權限限制。

對應攝像頭、位置信息和麥克風這幾個數據類型,用戶能夠授予一次性的臨時訪問權限。

只要是在Android 11 上,該限制都會生效,以下圖:
image

這個一次性權限的生效週期指的是:

  1. 應用 Activity 可見期間
  2. 應用轉爲後臺後的短期內
  3. 前臺服務存活期間
  4. 當用戶撤銷單次受權後,應用進程退出,再次打開以後須要對應用進行從新受權期間

位置權限

在Android10 以前,咱們經過ACCESSCOARRSELOCATION 或 ACCESSFINELOCATION(精確位置) 配置便可申請先後臺位置權限。

Android 11將位置權限分爲前臺和後臺兩種權限。前文說的主要是前臺權限,受權方式沒有變化。應用想要申請後臺權限,除了須要在清單文件中額外添加 ACCESSBACKGROUNDLOCATION 權限外,還須要應用主動引導用戶到指定頁面受權。
image

新功能

增長應用退出緣由功能

image

在Android 11以前,咱們想要了解應用退出的緣由以及狀態,都比較費勁。現 Android 11 引入了 方法:ActivityManager.getHistoricalProcessExitReasons() ,
可讓咱們清楚地瞭解到應用退出的緣由。

可變刷新率

應用和遊戲如今能夠爲其窗口設置首選幀率。大多數 Android 設備以 60Hz 的刷新率更新屏幕,可是某些設備支持多種刷新率,例如 90Hz 和 60Hz,並可在運行時切換。在這些設備上,系統會基於首選幀率來爲應用選擇最佳刷新率。
image

結語

以上主要介紹了Android 11 對分區存儲、應用包可見性和權限變化等模塊的更新介紹。Google 在力求讓用戶更加便捷地使用Android系統的基礎上,也但願用戶數據的隱私和安全性能在最大程度上受到保護。

個推致力於爲開發者提供好用的SDK。爲了提高SDK的穩定性、兼容性,個推也對Android 11 的新特性進行了深刻研究,並即將針對旗下產品推出全新的適配方案,以知足開發者不一樣的使用場景。此外,咱們但願能與更多開發者交流探索Android新技術,優化用戶體驗,一同打造更好的安卓開發生態圈。