前言
8月16日,谷歌宣布Android13新系統的源代碼已經上傳到Android開源項目(AOSP)中,Android13正式發布。自從2022年2月Android13第一個預覽版上線以來,歷經7個月的測試和優化,正式版本的Android13終于來了!Android13仍然聚焦個人隱私保護和安全,并提供了萬物互聯時代下大小屏適配、電池利用率優化等相關的技術開發能力。感興趣的開發者可以登錄官網下載源碼測試學習
個推服務開發者多年,一直密切關注和跟進行業發展趨勢。Android13正式版發布后,我們使用模擬器進行了研究和適配測試。本文將從權限變更、系統優化、功能更新等方面來談談Android13新特性,以幫助開發者快速上手完成Android新系統的適配。
權限變更
一、通知權限
通知欄消息一直是App和用戶溝通的有效渠道。在Android13之前,App只需要使用NotificationManager即可向終端用戶推送通知欄消息。Android13則引入了新的運行時通知權限:POST_NOTIFICATIONS。對此,App開發者需要予以重點關注。
個推對該權限進行了測試,總結如下:
1. 首先看TargetSdk< 33的情況。
如下圖,當App使用通知欄功能時,系統將自動彈出授權彈窗:
用戶點擊"允許",App可正常給用戶推送消息:
2. 再看TargetSdk == 33的情況。
開發者需要在AndroidManifest.xml中聲明POST_NOTIFICATIONS權限,還需要在使用通知欄推送功能時在代碼中申請運行時權限:
requestPermissions(new String[]{"android.permission.POST_NOTIFICATIONS"})
以上是用戶點擊"允許"App推送的情況。當然,用戶也有可能點擊"不允許"。值得注意的是,一旦被用戶拒絕授權,下次系統將不會再出現權限申請的彈窗。
如果App仍然要推送重要消息(比如重大版本更新)給用戶,則需要引導用戶前往設置界面打開通知權限。代碼如下:
privatevoidjumpNotificationSetting() { 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進行通知欄消息推送時,系統將再次彈出用戶授權彈窗。
二、WiFi權限變更
Android13對WiFi權限的變更也是一大重點。在萬物互聯的當下,不同的智能家居/智能穿戴設備多是通過WiFi互通互聯,因此這些類型的App開發者更要著重關注該部分內容。
在以往版本的Android系統下,如果App要使用WiFi相關功能,需要申請 ACCESS_FINE_LOCATION,即位置權限,如下圖:
▲圖片來源于Android13官網
為了避免App過度索權,更好地保護終端用戶隱私,Android13將WiFi權限從位置權限中分離了出來,引入了新的運行時權限:NEARBY_WIFI_DEVICES。
如果App僅需要使用WiFi相關的API,并不需要使用getScanResults()、startScan()等與位置相關的API,那么建議App開發者切換到新的NEARBY_WIFI_DEVICES權限。
新的WiFi權限運行機制:
▲圖片來源于Android13官網
權限使用和適配:
開發者需要注意的是,如果你的應用(targetSdk == 33)已經聲明不會根據 WiFi信息推導設備的物理位置信息,那就不再需要聲明 ACCESS_FINE_LOCATION 權限。
另外,如果應用在Android13上只使用WiFi API而不使用位置信息,那開發者可以在AndroidManifest.xml中增加NEARBY_WIFI_DEVICES權限,并將usesPermissionFlags屬性設為neverForLocation,給ACCESS_FINE_LOCATION權限增加maxSdkVersion="32"的限制,代碼如下:
三、更細分的媒體權限
除了通知權限和WiFi權限的更新外,Android13對本地數據訪問權限也做了進一步細化。
Android13將READ_EXTERNAL_STORAGE和 WRITE_EXTERNAL_STORAGE權限細分為:READ_MEDIA_IMAGES、 READ_MEDIA_VIDEO和 READ_MEDIA_AUDIO,如下圖:
▲圖片來源于Android13官網
個推使用android.permission.READ.MEDIA_IMAGES,對新權限進行了測試:
我們發現,單獨請求READ_MEDIA_IMAGES、單獨請求 READ_MEDIA_VIDEO和同時請求READ_MEDIA_IMAGES& READ_MEDIA_VIDEO,系統均將只顯示一個授權彈窗。
另外,如果App(targetSdk == 33)已經申請了讀的權限,那App同時也就有了寫的權限,無需再額外聲明 WRITE_EXTERNAL_STORAGE權限,代碼如下:
四、精確的鬧鐘權限
為了節省系統資源,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將不會允許使用該權限的應用上架。
五、后臺的傳感器權限
如今生物信息安全也是大眾關注的焦點。為了更好地保護終端用戶的個人生物信息,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對此提供了更好的支持,對大屏上的系統UI以及分屏展示等進行了更新。
如下圖,在大屏幕上,Android13支持不同的功能模塊同屏展示,使得大屏幕的優勢能夠充分被利用。
▲Android13系統下,用戶可以將"快速設置"版塊和"通知欄"版塊置于同屏當中。
三、Jetpack WindowManager
另外,Android13還支持用戶在大屏幕中一次顯示多個Activity,以充分利用大屏的顯示空間。
開發者可通過創建XML配置文件或進行Jetpack WindowManager API調用來確定App實現多個Activity同屏顯示(比如并排或堆疊)的具體方式。
▲比如,以分割任務窗口(splite task window)的形式實現單個屏幕內展示兩個Activity。
四、更好的兼容性支持
對于尚未適配大屏幕的App,Android13也提供了更加友好和穩定的兼容支持,讓這些App在默認情況下也能有舒適美觀的UI展示,不會影響到終端用戶的體驗,如下圖:
▲圖片來源于Android13官網
總結
通過近兩年的Android系統更新可以看到,Google不再對安卓系統進行大刀闊斧的改動,而是在用戶體驗、隱私保護、系統安全、組件優化等方面下足了功夫。
更多Android13的更新要點,開發者可進入Android13官網做進一步了解
如果您還想就新系統適配以及安卓開發等內容進行更深入的交流,歡迎添加@個推技術支持,和我們聯系。后續,個推還將持續關注安卓系統和行業發展動態,和開發者們一起交流移動開發技術,共建移動互聯網新生態。