來了,Android 12 適配簡介!
?BATcoder技術(shù)群,讓一部分人先進(jìn)大廠
大家好,我是劉望舒,騰訊TVP,著有三本業(yè)內(nèi)知名暢銷書,連續(xù)四年蟬聯(lián)電子工業(yè)出版社年度優(yōu)秀作者,百度百科收錄的高級技術(shù)專家。
前華為架構(gòu)師,現(xiàn)大廠技術(shù)總監(jiān)。
想要加入?BATcoder技術(shù)群,公號回復(fù)BAT?即可。
作者:37手游安卓團(tuán)隊(duì)?,鏈接:https://juejin.cn/post/7014491424112508936
大家好,我叫八兩,來自37手游安卓團(tuán)隊(duì)。前不久,9月21號,谷歌更新了 Android 12 Beta5 版本的說明,Beta5 也會(huì)是 Android 12 正式版本前的最后一個(gè) Beta 測試版本。恰巧9月27號,有幸參加金標(biāo)聯(lián)盟的第一次線下活動(dòng),也聊到了Android 12 的適配。
那么 Android 12 到底會(huì)給我們帶來什么樣的改變,作為一名從業(yè)者,我們又該分配多少資源以及如何去對我們的產(chǎn)品進(jìn)行適配呢。
適配
通常我們說的適配,嚴(yán)格來講分成兩個(gè)階段。第一部分是通配性問題, 即使我不對我的項(xiàng)目進(jìn)行任何修改,不修改 TargetSdkVersion 也需要進(jìn)行關(guān)注, 個(gè)人喜歡把它叫通配性問題。第二部分則是全面適配問題, 即 TargetSdkVersion 等于31才需要去關(guān)注的問題. 這里主要和大家講講通配性問題。如果大家需要遷移到 Android 12, 設(shè)置 TargetSdkVersion 成 31, 可以根據(jù)自身產(chǎn)品使用的東西并參考 官方文檔 來進(jìn)行遷移。
通配性問題
通配性問題,咱的定義是,無論你使用哪個(gè)版本的 TargetSdkVersion, 只要跑在 Android 12 上,你都需要關(guān)注。這里個(gè)人節(jié)選了幾個(gè)比較重要的,一起來看看吧.
Splash Screen
Android 12 增加了系統(tǒng)默認(rèn)的 APP 啟動(dòng)頁,該 APP 啟動(dòng)頁會(huì)使用APP定義的主題和ICON生成。這可能對很多開發(fā)者來說是一個(gè)比較大的困惱,如果不做任何適配,產(chǎn)生的結(jié)果可能如下:
如果你原本使用
android:windowBackground實(shí)現(xiàn)了啟動(dòng)頁,你的實(shí)現(xiàn)會(huì)被默認(rèn)的啟動(dòng)頁樣式替換。如果你使用了一個(gè)額外的 Activity 作為啟動(dòng)頁,則會(huì)先彈出系統(tǒng)默認(rèn)啟動(dòng)頁,再彈出你實(shí)現(xiàn)的啟動(dòng)頁,用戶有幸可以享受兩次閃屏了。
目前谷歌的適配方案只提供了設(shè)置主題的方式,至于原本使用額外 Activity 作為啟動(dòng)頁的方式,谷歌爸爸和藹的和我們說,你可以選擇不管或者去掉 Activity并使用設(shè)置主題方式來兼容. 具體方法如下:
設(shè)置 compileSdkVersion 和引入庫
build.gradle
android?{
???compileSdkVersion?31
???...
}
dependencies?{
???...
???implementation?'androidx.core:core-splashscreen:1.0.0-alpha01'
}
創(chuàng)建閃屏主題,繼承Theme.SplashScreen, 設(shè)置 postSplashScreenTheme 和windowSplashScreenAnimatedIcon, 其他字段可選.如:
<style?name="Theme.App.Starting"?parent="Theme.SplashScreen">
???//?Set?the?splash?screen?background,?animated?icon,?and?animation?duration.
???<item?name="windowSplashScreenBackground">@color/...item>
???//?Use?windowSplashScreenAnimatedIcon?to?add?either?a?drawable?or?an
???//?animated?drawable.?One?of?these?is?required.
???<item?name="windowSplashScreenAnimatedIcon">@drawable/...item>
???<item?name="windowSplashScreenAnimationDuration">200item>??#?Required?for
????????????????????????????????????????????????????????????????#?animated?icons
???//?Set?the?theme?of?the?Activity?that?directly?follows?your?splash?screen.
???<item?name="postSplashScreenTheme">@style/Theme.Appitem>??#?Required.
style>
Manifest 使用對應(yīng)的主題
???"@style/Theme.App.Starting">
????
????????"@style/Theme.App.Starting">
...
代碼中,在setContentView前調(diào)用 installSplashScreen, 以 Java 為:
public?class?SplashScreenSampleActivity?extends?Activity?{
????@Override
????protected?void?onCreate(Bundle?savedInstanceState)?{
?????????super.onCreate(savedInstanceState);
?????????//?Handle?the?splash?screen?transition.
?????????SplashScreen?splashScreen?=?SplashScreen.installSplashScreen(this);
?????????setContentView(R.layout.main_activity);
????}
}
installSplashScreen 會(huì)返回閃屏對象,其本身也可以進(jìn)行一些屬性設(shè)置, 至此,如上就是谷歌推薦的 SplashScreen 的適配方法
OverScroll 滾動(dòng)動(dòng)畫增加
Android 12 修改了 OverScroll 的效果動(dòng)畫,從原來的拉到底部顯示藍(lán)光,修改成了拉到變形彈彈彈的動(dòng)畫。如下圖
如果你需要特別處理 OverScroll 的動(dòng)畫或者動(dòng)作,谷歌增加了float getDistance() 和 float onPullDistance(float deltaDistance, float displacement)兩個(gè) API 來處理 OverScroll 行為, 需要在onTouchEvent 中使用如上兩個(gè) API,再自定義對應(yīng)行為.
如果你不喜歡這個(gè)動(dòng)畫的話,你也可以通過 xml 中設(shè)置 android:overScrollMode="never" 或者使用代碼設(shè)置 recyclerview.setOverScrollMode(View.OVER_SCROLL_NEVER); 來屏蔽默認(rèn)的滾動(dòng)動(dòng)畫。
引入限制域概念(官方翻譯: 限制性應(yīng)用待機(jī)模式存儲(chǔ)分區(qū))
Android 12 引入了 APP 限制域, 限制域不但會(huì)定義應(yīng)用的優(yōu)先級(是否容易被系統(tǒng)殺死),處于低限制域的應(yīng)用還會(huì)被限制一些比較消耗系統(tǒng)資源的行為。而限制域優(yōu)先級的劃分,很大程度上取決于你應(yīng)用的使用頻率以及當(dāng)前是否在被前臺(tái)使用。
想獲取 APP 當(dāng)前的限制域可以使用 getAppStandbyBucket 方法得到,示范:
if(Build.VERSION.SDK_INT?>=?Build.VERSION_CODES.P)?{
????UsageStatsManager?manager?=?(UsageStatsManager)?getSystemService(USAGE_STATS_SERVICE);
????if(manager?!=?null)?manager.getAppStandbyBucket();
}
如果需要測試 APP 在嚴(yán)格限制域的表現(xiàn),谷歌也提供了相對應(yīng)的命令來進(jìn)行模擬:
adb?shell?am?set-standby-bucket?PACKAGE_NAME?restricted
這個(gè)只需要做充分的測試即可,畢竟你也做不了什么,避免被限制的方法很簡單,讓用戶停在你的APP界面以及更經(jīng)常的使用你的 APP, 這應(yīng)該是所有應(yīng)用開發(fā)者一直在研究的問題吧。
Display.getRealSize() & Display.getRealMetrics()廢棄
繼 Android 11 廢棄了 Display.getSize() 和 Display.getMetrics()后,Android 12 上進(jìn)一步廢棄了 Display.getRealMetrics() 和Display.getRealSize()。現(xiàn)在推薦使用 WindowMetrics, 并且谷歌提供了一個(gè)兼容到 Android 4.0 的 WindowManager 兼容庫。通常情況可以使用如下代碼代替以前計(jì)算屏幕寬高,:
if?(android.os.Build.VERSION.SDK_INT?>=?android.os.Build.VERSION_CODES.R)?{
?????metrics?=?activity.getWindowManager().getCurrentWindowMetrics();
?????int?width?=?metrics.getBounds().width();
?????int?height?=?metrics.getBounds().height();
?}
如果你的應(yīng)用還在使用如上 API, 趕緊替換掉吧。
非可信觸摸事件會(huì)被屏蔽
Android 12 開始,如果 APP 被其他UI遮擋覆蓋或者在APP上繪制了其他UI,用戶所有的觸摸(touch)事件不再會(huì)傳遞下來了,你的 APP 將無法響應(yīng)這些觸摸事件, 當(dāng)然APP被如下特殊情況的窗口遮擋, 觸摸事件可以正常傳遞:
1、不可見的窗口,窗口都不見了,也擋不住用戶去摸了。 2、完全透明的窗口,和上一條如出一轍,完全透明的衣服等于沒穿。(alpha 值是 0) 3、部分半透明窗口,遮不遮的住取決于透明度,目前版本最大 opacity 值 0.8 以下,依然可以傳遞觸摸事件。不過將來正式版本這個(gè)值可能被修改。 4、遮擋的 UI 本身由你的APP創(chuàng)建,且只在你的 APP 內(nèi)顯示交互時(shí). 5、遮擋你APP的是可信的遮擋UI,包括但不限于如下: 軟鍵盤或其他系統(tǒng)輸入 系統(tǒng)助手懸浮窗 使用了 TYPE_ACCESSIBILITY_OVERLAY 標(biāo)志的窗口 ...
這一條個(gè)人認(rèn)為,也是谷歌爸爸對現(xiàn)應(yīng)用動(dòng)不動(dòng)喜歡搞個(gè)系統(tǒng)級的懸浮窗的一種限制,對絕大多數(shù)應(yīng)用應(yīng)該影響不大。
除了上述問題外,還存在一些其他細(xì)節(jié)修改,就不一一贅述,感興趣的親們可以仔細(xì)閱讀 通配性問題谷歌文檔
適配優(yōu)先級
作為一個(gè)技術(shù),不聊 DeadLine 來談優(yōu)先級,簡直就是耍流氓。對于通配性問題,建議所有開發(fā)者在 Android 12 正式版本發(fā)布后第一時(shí)間進(jìn)行測試,來確認(rèn)是否會(huì)影響自家產(chǎn)品和業(yè)務(wù)。
對于全面更新適配 Android 12(TargetSdkVersion 升級到 31), 目前 Android 12 還在進(jìn)行 Beta5 測試,但尚未完成完全兼容測試(Compatibility Test Suite),按照以往的速度,快則個(gè)把月,慢則幾個(gè)月。Android 12 正式版本會(huì)與大家見面,而從發(fā)布到用戶真正能使用也需要一段時(shí)間。對于應(yīng)用開發(fā)者,在Android 12正式版本發(fā)布后的任何時(shí)候,都可以開始考慮進(jìn)行適配工作。等到各大國產(chǎn)廠商開始推送 Android 12 時(shí),再進(jìn)行適配,可能就被友商卷下去了。
而對于游戲開發(fā)者,聯(lián)運(yùn)渠道SDK本身適配也需要一段時(shí)間,考慮到絕大多數(shù)渠道目前還只要求TargetSdkVersion 26, 只上聯(lián)運(yùn)的話,會(huì)有非常充裕的適配時(shí)間,等各大聯(lián)運(yùn)渠道通知即可,估摸著2023年吧。如果發(fā)海外 GooglePlay, 通常新系統(tǒng)出來后半年內(nèi)需要進(jìn)行適配,之后再過小半年,GooglePlay 就要開始強(qiáng)制要求適配了,發(fā)海外 GooglePlay 也是越快適配越好的行情。如果貴司純靠買量投放與自有流量導(dǎo)入,那花一上午簡單在 Android 12 上測試一下功能,啥時(shí)候高興啥時(shí)候適配。
Android 12 已知問題
最后,聊聊谷歌目前 Android 12 的幾個(gè)高頻已知問題,如果你遇上了,不要慌,谷歌已經(jīng)知道有這些問題了,反正你不需要去糾結(jié)。大概率(看谷歌心情)正式版本會(huì)被修復(fù)的。
通過 設(shè)置->賬戶密碼添加賬戶時(shí),系統(tǒng)會(huì)黑屏. 下滑通知欄,有時(shí)通知欄無法正常顯示通知.190269314 鎖屏?xí)r有時(shí)無法正常顯示通知189173895 連著 USB 調(diào)試時(shí),使用谷歌地圖或者視頻播放軟件,Android 系統(tǒng)會(huì)崩潰.189515336 使用虛擬鍵盤時(shí),如果有通知進(jìn)來,虛擬鍵盤會(huì)被自動(dòng)最小化,且劃掉通知前,無法正常使用鍵盤.193920125
如果想詳細(xì)了解 Android 12 的已知問題,請參閱 https://developer.android.com/about/versions/12/top-issues
總結(jié)
總體來說,對絕大多數(shù)產(chǎn)品, Android 12 的更新并不會(huì)像 Android 11 與 Android 10 復(fù)雜,且目前 Android 12 正式版本還未推出,部分內(nèi)容各大手機(jī)硬件廠商也在與谷歌商討,所以,對于絕大多數(shù)應(yīng)用開發(fā)者,我的建議是,Android 12 發(fā)布后,針對文章提到的點(diǎn)進(jìn)行一次兼容性測試就可以了。
·················END················· 推薦閱讀
? 耗時(shí)2年,Android進(jìn)階三部曲第三部《Android進(jìn)階指北》出版!
為了防止失聯(lián),歡迎關(guān)注我的小號
??微信改了推送機(jī)制,真愛請星標(biāo)本公號??
