天天看點

個推解讀Android13,釋出《Android13适配指南》

8月16日,谷歌宣布Android13新系統的源代碼已經上傳到Android開源項目(AOSP)中,Android13正式釋出。自從2022年2月Android13第一個預覽版上線以來,曆經7個月的測試和優化,正式版本的Android13終于來了!Android13仍然聚焦個人隐私保護和安全,并提供了萬物互聯時代下大小屏适配、電池使用率優化等相關的技術開發能力。

個推服務開發者多年,一直密切關注和跟進行業發展趨勢。Android13正式版釋出後,我們使用模拟器進行了研究和适配測試。本文将從權限變更、系統優化、功能更新等方面來談談Android13新特性,以幫助開發者快速上手完成Android新系統的适配。

權限變更

通知欄消息一直是App和使用者溝通的有效管道。在Android13之前,App隻需要使用NotificationManager即可向終端使用者推送通知欄消息。Android13則引入了新的運作時通知權限: POST_NOTIFICATIONS 。對此,App開發者需要予以重點關注。

個推對該權限進行了測試,總結如下:

個推解讀Android13,釋出《Android13适配指南》

1.  首先看TargetSdk<33的情況。

如下圖,當App使用通知欄功能時,系統将自動彈出授權彈窗:

個推解讀Android13,釋出《Android13适配指南》

使用者點選“允許”,App可正常給使用者推送消息:

個推解讀Android13,釋出《Android13适配指南》

2.  再看TargetSdk == 33的情況。

開發者需要在AndroidManifest.xml中聲明 POST_NOTIFICATIONS 權限,還需要在使用通知欄推送功能時在代碼中申請運作時權限:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= "http://schemas.android.com/tools"  package= "com.gt.demo.mubai.push" >  <uses-permission android:name= "android.permission.POST_NOTIFICATIONS" /></manifest> requestPermissions(new String[]{“android.permission.POST_NOTIFICATIONS”})

以上是使用者點選“允許”App推送的情況。當然,使用者也有可能點選“不允許”。值得注意的是, 一旦被使用者拒絕授權,下次系統将不會再出現權限申請的彈窗。

如果App仍然要推送重要消息(比如重大版本更新)給使用者,則需要引導使用者前往設定界面打開通知權限。代碼如下:

private  void   jumpNotificationSetting () {  final  ApplicationInfo applicationInfo = getApplicationInfo();  try  { Intent intent =  new  Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction( "android.settings.APP_NOTIFICATION_SETTINGS" ); intent.putExtra( "app_package" , applicationInfo.packageName); intent.putExtra( "android.provider.extra.APP_PACKAGE" , applicationInfo.packageName); intent.putExtra( "app_uid" , applicationInfo.uid); startActivity(intent); }  catch  (Throwable t) { t.printStackTrace(); Intent intent =  new  Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction( "android.settings.APPLICATION_DETAILS_SETTINGS" ); intent.setData(Uri.fromParts( "package" , applicationInfo.packageName,  null )); startActivity(intent); }}

★ 溫馨提示:

如果App要确認使用者是否已啟用通知,可以調用NotificationManager.areNotificationsEnabled()進行判斷。

另外,除了“允許”和“不允許”兩種選擇外,使用者還可以 劃走權限申請對話框(User swipes away from dialog) ,即使用者未選擇授權(也未選擇不授權)。那麼下次App進行通知欄消息推送時,系統将再次彈出使用者授權彈窗。

Android13的通知權限變更将使終端使用者的體驗得到極大改善。使用者能夠自主選擇是否接受App推送的通知欄消息,減少被無效資訊頻繁打擾的情況。

個推以消息推送服務起家,也一直倡導綠色推送,強調在合适的時間、合适的地點、合适的場景把合适的内容推送給合适的人群,給終端使用者更好的體驗。

二、WiFi權限變更

Android13對WiFi權限的變更也是一大重點。在萬物互聯的當下,不同的智能家居/智能穿戴裝置多是通過WiFi互通互聯,是以這些類型的App開發者更要着重關注該部分内容。

在以往版本的Android系統下,如果App要使用WiFi相關功能,需要申請  ACCESS_FINE_LOCATION ,即位置權限,如下圖:

個推解讀Android13,釋出《Android13适配指南》

圖檔來源于Android13官網

為了避免App過度索權,更好地保護終端使用者隐私, Android13 将WiFi權限從位置權限中分離了出來 ,引入了新的運作時權限: NEARBY_WIFI_DEVICES 。

如果App僅需要使用WiFi相關的API,并不需要使用getScanResults()、startScan()等與位置相關的API,那麼建議App開發者切換到新的NEARBY_WIFI_DEVICES權限。

新的WiFi權限運作機制:

個推解讀Android13,釋出《Android13适配指南》

圖檔來源于Android13官網

權限使用和适配:

開發者需要注意的是,如果你的應用(targetSdk == 33) 已經聲明不會根據 WiFi資訊推導裝置的實體位置資訊 ,那就不再需要聲明 ACCESS_FINE_LOCATION 權限。

另外,如果應用 在Android13上隻使用WiFi API而不使用位置資訊 ,那開發者可以在AndroidManifest.xml中增加NEARBY_WIFI_DEVICES權限,并将usesPermissionFlags屬性設為neverForLocation,給ACCESS_FINE_LOCATION權限增加maxSdkVersion="32"的限制,代碼如下:

<manifest ...>  <uses-permission android:name= "android.permission.NEARBY_WIFI_DEVICES"   android:usesPermissionFlags= "neverForLocation" />  <uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION"  android:maxSdkVersion= "32"  /> </manifest>

三、更細分的媒體權限

除了通知權限和WiFi權限的更新外,Android13對本地資料通路權限也做了進一步細化。

Android13将READ_EXTERNAL_STORAGE和 WRITE_EXTERNAL_STORAGE權限細分為: READ_MEDIA_IMAGES 、 READ_MEDIA_VIDEO和 READ_MEDIA_AUDIO ,如下圖:

個推解讀Android13,釋出《Android13适配指南》

圖檔來源于Android13官網

個推使用android.permission.READ.MEDIA_IMAGES,對新權限進行了測試:

個推解讀Android13,釋出《Android13适配指南》

我們發現,單獨請求READ_MEDIA_IMAGES、單獨請求 READ_MEDIA_VIDEO和同時請求READ_MEDIA_IMAGES& READ_MEDIA_VIDEO,系統均将 隻顯示一個授權彈窗 。

另外, 如果App(targetSdk == 33)已經申請了讀的權限,那App同時也就有了寫的權限 ,無需再額外聲明 WRITE_EXTERNAL_STORAGE權限,代碼如下:

<manifest ...>  <uses-permission android:name= "android.permission.READ_MEDIA_IMAGES"  />   <uses-permission android:name= "android.permission.READ_MEDIA_AUDIO"  />   <uses-permission android:name= "android.permission.READ_MEDIA_VIDEO"  />   <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE"  android:maxSdkVersion= "32"  /> </manifest>

四、精确的鬧鐘權限

為了節省系統資源,Android12引入了 SCHEDULE_EXACT_ALARM 權限進行“鬧鐘和提醒”功能的授權管理。Android13則又引入了新的鬧鐘權限 USE_EXACT_ALARM 。

和Android12的SCHEDULE_EXACT_ALARM權限不同,如果App已經申請使用了USE_EXACT_ALARM新權限,那麼使用者是不能在設定頁面裡關閉授權的。

對于日程管理、時間管理等類型的App來講,Android13引入的USE_EXACT_ALARM權限能夠帶來一定便利。相比Android12的SCHEDULE_EXACT_ALARM權限,使用新權限的應用将不再需要頻繁打擾使用者進行授權,能夠更高效地為使用者提供鬧鐘、日程提醒等服務。

不過,為了防止新權限被濫用,GooglePlay設定了嚴格的上架稽核機制。 開發者要注意,一旦使用了USE_EXACT_ALARM權限,App在上架GooglePlay時将會被平台嚴格審查。 除非App屬于鬧鐘、計時器、月曆等類型的應用或者在已被列入到應用市場的白名單裡,否則GooglePlay将不會允許使用該權限的應用上架。

随着我國對App使用者個人權益保護力度的不斷加大,相信後續國内的手機廠商和應用市場也将跟進建立相應的審查機制,增強對使用者權益的保護。建議App開發者持續關注相關動态,及時做好适配工作。

五、背景的傳感器權限

如今生物資訊安全也是大衆關注的焦點。為了更好地保護終端使用者的個人生物資訊,Android13增加了新的背景傳感器權限。

App在背景運作時,如果需要擷取心率、體溫、血氧飽和度等傳感器資訊,将不僅需要向使用者申請現有的BODY_SENSORS權限,還必須聲明新的 BODY_SENSORS_BACKGROUND 權限。

綜上可以看到,Android13對個人隐私保護的重視和加強。除了權限變更方面,Android13還進行了系統優化、元件更新,以進一步提升系統的安全性和友好性。

系統優化

一、更安全的系統元件

IntentFilter

在之前版本的Android系統中,開發者隻需将android:exported設為true就可以跨應用顯式啟動Activity和Service,即使intent-filter中的action或者type不比對,也能夠啟動。

為避免上述漏洞,Android 13增強了intent-filter的比對過濾邏輯。 在接收方的targetSdk == 33的情況下,如果intent-filter比對命中,無論發送方的targetSdk版本如何,intent都将生效。

★ 溫馨提示:

以下幾種情況不需要遵循intent-filter的比對過濾邏輯:

  • 元件沒有聲明
  • 同一個App裡的intent
  • 系統或Root程序發出的intent

BroadcastReceiver

以往的Android系統下,應用動态注冊的BroadcastReceiver廣播接收器會接收到任何應用發送的廣播(除非該接收器使用了應用簽名權限保護),這會使動态注冊的廣播接收器存在安全風險。

Android13要求, 應用動态注冊的廣播接收器必須以顯著的方式指出是否允許其他應用通路 ,即其他應用是否可以向其發送廣播。否則,在動态注冊時系統将抛出安全異常(SecurityException)。

目前該增強措施并非預設生效,開發者需啟用 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED相容性架構,并在動态注冊廣播時指定是否接受其他應用的廣播:

context.registerReceiver( receiver ,  intentFilter ,  RECEIVER_EXPORTED ) context .registerReceiver( receiver ,  intentFilter ,  RECEIVER_NOT_EXPORTED )

★ 溫馨提示:

系統廣播不受RECEIVER_NOT_EXPORTED影響。

二、前台服務(FGS)任務管理器

Android13還新增了前台服務(FGS)任務管理器功能。

如下圖,使用者可以在下拉的通知欄中直接關閉前台服務和應用程式:

此外,如果系統檢測到應用長時間運作某項前台服務 (在24小時的時間段内至少運作20小時) ,便會向使用者發送提醒通知,通知内容如下:

APP is running in the background for a long time. Tap to review.

值得注意的是,滿足以下任一條件的情況下,系統均将不會顯示該通知:

  • 已經發送過前台服務相關的通知,也就是說,使用者未關閉之前的提醒通知
  • 前台服務的類型為 FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK 或 FOREGROUND_SERVICE_TYPE_LOCATION

★ 溫馨提示:

如果系統針對某應用已經顯示過此通知,那至少在30天後系統才會再次顯示該通知。另外,系統級應用、安全應用(比如具有android.app.role.EMERGENCY 角色的應用)等運作的前台服務,将不會顯示在FGS任務管理器中。

三、通知權限

Android9引入了 應用待機存儲分區功能 ,根據應用的使用時間和頻率,将應用動态配置設定到五個不同優先級的存儲分區,然後對不同存儲分區的應用施加不同級别的應用資源限制。

如下, 存儲分區按照優先級從高到低排序,優先級越低對該分區内的App限制越多 :

  • 活躍:應用目前正在使用中,或者最近剛剛使用過。
  • 工作集:應用會定期使用。
  • 常用:應用會經常使用,但不會每天使用。
  • 極少使用:應用不經常使用。
  • 受限:應用會消耗大量的系統資源,或表現出不良行為(Android11引入)。

其中“受限”狀态的應用,将受到以下限制:

  • 無法啟動前台服務。
  • 現有的前台服務會從前台移除。
  • 不會觸發鬧鐘。
  • 不會執行Jobs。

在Android9應用待機存儲分區功能的基礎上,Android13對電池資源政策進行了優化,以延長裝置的電池續航時間,提升終端使用者的體驗。

首先,Android13新增了以下規則, 符合相應規則的應用将進入到“受限”存儲分區 (裝置處于關閉狀态的時間不會計入互動限制):

  • 使用者已經8天沒有與應用互動。
  • 應用在1天内調用過多的廣播或者綁定服務。
  • 應用在1天内消耗了大量的電池電量,門檻值取決于裝置。

其次,Android13還對“受限”存儲分區的應用增加了限制措施:

  • 應用将不收受到BOOT_COMPLETED、LOCKED_BOOT_COMPLETED廣播

四、對non-SDK接口限制的更新

Android 13對一些non-SDK接口進行了限制(并針對部分限制提供了替代方案)。開發者需要明确App在更新時是否使用了受限的non-SDK接口。

Android13中受限的non-SDK接口參考:

Landroid/app/Activity;->setDisablePreviewScreenshots(Z)V  # Use setRecentsScreenshotEnabled() instead. Landroid/os/PowerManager;->isLightDeviceIdleMode()Z  # Use isDeviceLightIdleMode() instead. Landroid/os/Process;->setArgV0(Ljava/lang/String;)V  # In general, do not try to change the process name. If you must change the process name (for instance, for debugging), you can use pthread_setname_np() instead, though be aware that doing this might confuse the system. Landroid/view/accessibility/AccessibilityInteractionClient;->clearCache(I)V  # Use android.accessibilityservice.AccessibilityService#clearCache() instead.

功能更新

使用者體驗的提升也一直是Android系統更新的重點。Android13主要針對剪切闆、大小屏适配、UI展示等進行了功能更新。

一、剪切闆

首先來看剪貼闆。相信大家都使用過剪貼闆,它能夠快速複制頁面上的内容,友善我們進行内容編輯和修改。

但是一直以來,剪切闆功能存在這樣一個隐患,即剪切闆複制的内容中可能存在敏感資訊。為了更好地保障剪切闆中的隐私内容(比如手機号碼、郵箱、賬号密碼等)不被洩露,Android13對剪切闆功能進行了更新。

如下圖,Android13剪切闆功能的使用分2步:

  • 确認内容已成功複制。
  • 提供所複制内容的預覽。
個推解讀Android13,釋出《Android13适配指南》

此外,Android13還提供了 脫敏功能,使使用者能夠對剪切闆中的敏感資訊進行隐藏 ,實作了便利性和安全性兼得。

個推解讀Android13,釋出《Android13适配指南》

二、更好地支援平闆和大螢幕

平闆電腦、車載大屏、智能電視屏等的廣泛應用,使使用者的終端場景越來越多樣化。如何給不同終端的使用者始終美觀和流暢的體驗?Android13對此提供了更好的支援,對大屏上的系統UI以及分屏展示等進行了更新。

如下圖,在大螢幕上, Android13 支援不同的功能子產品同屏展示 ,使得大螢幕的優勢能夠充分被利用。

個推解讀Android13,釋出《Android13适配指南》

Android13系統下,使用者可以将“快速設定”版塊和“通知欄”版塊置于同屏當中。

三、Jetpack WindowManager

另外, Android13 還支援使用者在大螢幕中一次顯示多個Activity ,以充分利用大屏的顯示空間。

開發者可通過建立XML配置檔案或進行Jetpack WindowManager API調用來确定App實作多個Activity同屏顯示(比如并排或堆疊)的具體方式。

個推解讀Android13,釋出《Android13适配指南》

比如,以分割任務視窗(splite task window)的形式實作單個螢幕内展示兩個Activity。

四、更好的相容性支援

對于尚未适配大螢幕的App,Android13也提供了更加友好和穩定的相容支援,讓這些App在預設情況下也能有舒适美觀的UI展示,不會影響到終端使用者的體驗,如下圖:

個推解讀Android13,釋出《Android13适配指南》

通過近兩年的Android系統更新可以看到,Google不再對安卓系統進行大刀闊斧的改動,而是在使用者體驗、隐私保護、系統安全、元件優化等方面下足了功夫。