<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          來了,Android 12 適配簡介!

          共 5734字,需瀏覽 12分鐘

           ·

          2021-10-20 08:50

          ?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è)置 TargetSdkVersion31, 可以根據(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è)置 postSplashScreenThemewindowSplashScreenAnimatedIcon, 其他字段可選.如:

          <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)階指北》出版!

          ? 『BATcoder』做了多年安卓還沒編譯過源碼?一個(gè)視頻帶你玩轉(zhuǎn)!

          ? 『BATcoder』我去!安裝Ubuntu還有坑?

          ? 重生!進(jìn)階三部曲第一部《Android進(jìn)階之光》第2版 出版!

          為了防止失聯(lián),歡迎關(guān)注我的小號

          ??微信改了推送機(jī)制,真愛請星標(biāo)本公號??

          瀏覽 124
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  69福利网 | 午夜青娱乐盛世 | 亚洲福利一区 | 欧美精品久久 | 秋霞影音 |