<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>

          Android12,你的適配開始了嗎

          共 6331字,需瀏覽 13分鐘

           ·

          2021-04-20 14:52

          Android 12 開發(fā)者預覽版計劃從 2021 年 2 月開始啟動,到向 AOSP 和 OEM 提供最終的公開版本時結(jié)束,目前應該已經(jīng)到beta3階段了,看看官方里程碑時間軸,你的適配工作開始了嗎

          1. 獲取 Android 12

          獲取最新 Android 12 的方式有兩種,一為你已擁有安裝了 Android 11 的 Google Pixel 設備,或者 Android 模擬器。本文介紹的方式為如何通過模擬器設置 Android 12 的 SDK。

          • 安裝 Android Studio 的最新預覽版 build。

          • 在 Android Studio 中,依次點擊 Tools > SDK Manager。

          • SDK Tools 標簽頁中,選擇最新版 Android 模擬器,然后點擊 OK。如果尚未安裝最新版本,則此操作會安裝最新版本。

          • 在 Android Studio 中,依次點擊 Tools > AVD Manager,然后按照說明創(chuàng)建新的 Android 虛擬設備 (AVD)。

            請務必選擇 Pixel 3、Pixel 3a、Pixel 4、Pixel 4a 或 Pixel 5 設備定義以及 64 位 Android 12 模擬器系統(tǒng)映像。請注意,Android 12 不支持 32 位 Android 模擬器系統(tǒng)映像。如果您尚未安裝與您的設備定義匹配的 Android 12 系統(tǒng)映像,請點擊 Release Name 旁邊的 Download 下載該映像。

          • 在 AVD Manager 中返回虛擬設備列表,然后雙擊您的 Android 12 虛擬設備以啟動它。

          2. API 變更

          Android 12 面向開發(fā)者引入了一些出色的新功能和 API。以下幾部分內(nèi)容可幫助您了解適用于您的應用的功能并開始使用相關 API。

          2.1 GIF 和 WebP 的原生 ImageDecoder 支持

          在 Android 12 中,NDK ImageDecoderAPI 已進行了擴展,可以對 GIF 和 WebP 文件格式的圖片的所有幀和時間數(shù)據(jù)進行解碼。在 Android 11 中引入該 API 時,該 API 僅從這些格式的動畫中解碼第一張圖片。

          使用 ImageDecoder(而非第三方庫)可進一步縮減 APK 大小,并從未來與安全性和性能相關的更新中受益。

          2.2 支持圓角

          許多現(xiàn)代設備的屏幕采用圓角設計,這彰顯了簡潔時尚的風格,但也為應用開發(fā)者帶來一些額外的問題。要在這些設備上提供出色的用戶體驗,開發(fā)者需要將這些圓角納入考慮,調(diào)整圓角附近的界面元素,防止出現(xiàn)裁切的情況。

          為了解決這個問題,Android 12 引入了新的 API,便于您查詢圓角及其詳情。RoundedCorner 提供了圓角半徑、中心點等信息??梢酝ㄟ^ Display.getRoundedCorner() 來獲取每個圓角的詳盡信息,再也不用造輪子了。

          還可以調(diào)用 WindowInsets.getRoundedCorner() 來獲取基于應用邊界的圓角位置等信息。如此一來,你就可以根據(jù)需要靈活調(diào)整界面元素和內(nèi)容的位置。

          2.3 更易用的模糊、色彩濾鏡等特效

          在 Android 12 中,可以更輕松地將常用圖形效果應用于視圖和渲染結(jié)構(gòu)上??梢允褂?RenderEffect 將模糊、色彩濾鏡等特效應用于任何 RenderNode??梢詫⑦@些特效組合為連鎖特效 (即組成內(nèi)部和外部特效),也可以混用這些特效。還可以通過調(diào)用 View.setRenderEffect(RenderEffect) 將特效直接應用于視圖 (View,因為其基于 RenderNode)。

          view.setRenderEffect(RenderEffect.createBlurEffect(radiusX, radiusY, SHADER_TILE_MODE))

          有了這個功能,在模糊 ImageView 時,就不必進行獲取位圖數(shù)據(jù)、處理圖像、創(chuàng)建新 Bitmap,再將其設置回 ImageView 這些操作了。RenderEffect 利用了現(xiàn)有的渲染流水線,最大限度地減少了額外的計算量。

          還可以使用新的 Window.setBackgroundBlurRadius() API 為窗口背景創(chuàng)建霧面玻璃效果。這個 API 可以設置模糊半徑,以調(diào)整霧面密度和范圍,平臺只會對您的應用窗口邊框內(nèi)的背景內(nèi)容應用模糊效果。還可以使用 blurBehindRadius 來模糊窗口后面的所有內(nèi)容,從而為浮動窗口營造出深度效果。


          3. 影響應用的行為變更

          3.1 針對所有應用的行為變更

          以下行為變更將影響在 Android 12 上運行的所有應用,無論采用哪種 targetSdkVersion 都不例外。

          以下行為變更將影響在 Android 12 上運行的所有應用,無論采用哪種 targetSdkVersion 都不例外。

          3.1.1 對 MAC 地址的限制

          Android 12 進一步限制了所有非系統(tǒng)應用對設備的 MAC 地址的訪問。

          相關 API 會返回空值或占位值,具體取決于應用的 Target SDK 版本:

          • 如果應用以 Android 12 為目標平臺,則該 API 會返回 null。

          • 如果應用以 Android 11 或更低版本為目標平臺,則該 API 將返回硬編碼占位值:02:00:00:00:00:00

          開發(fā)者應使用 ConnectivityManager,而不是較低級別的 API,例如 NetworkInterface、getifaddrs(),開發(fā)者在其代碼中調(diào)用 NetworkInterface.getHardware-Address() 時,logcat 輸出會顯示:CompatibilityChangeReporter: Compat change id reported: 170188668;

          開發(fā)者可以使用名為 RETURN_NULL_HARDWARE_ADDRESS 的兼容性標志切換 NetworkInter-face.getHardwareAddress() 的行為在啟用時返回 null,或在停用時返回 02:00:00:00:00:00。

          3.1.2 應用覆蓋控制

          Android 的系統(tǒng)警告框允許一個應用在其他活動應用之上覆蓋顯示一個圖層,以幫助應用提醒用戶關注重要操作。不過由于這些窗口會中斷用戶操作,因此應用需要請求權(quán)限才能顯示這些內(nèi)容。在 Android 12 中,可以控制是否允許在自己的內(nèi)容上顯示這些覆蓋圖層。在聲明新權(quán)限后,你的應用可以調(diào)用 Window#setHideOverlayWindows(),以表明在你的應用窗口可見時應隱藏所有 TYPE_APPLICATION_OVERLAY 窗口,比如可以在交易確認流程等敏感界面中如此操作。

          3.1.3 應用無法關閉系統(tǒng)對話框

          為了加強用戶與應用和系統(tǒng)互動時的控制,從 Android 12 開始,棄用了 ACTION_CLOSE_SYSTEM_DIALOGS intent 操作。除了一些特殊情況之外,當應用嘗試調(diào)用包含此操作的 intent 時,系統(tǒng)會基于應用的目標 SDK 版本執(zhí)行以下操作之一:

          • 如果應用以 Android 12 為目標平臺,則會發(fā)生 SecurityException。

          • 如果應用以 Android 11(API 級別 30)或更低版本為目標平臺,則系統(tǒng)不會執(zhí)行 intent,并且 Logcat 中會顯示以下消息:

            E ActivityTaskManager Permission Denial: \
          android.intent.action.CLOSE_SYSTEM_DIALOGS broadcast from \
          com.package.name requires android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, \
          dropping broadcast.

          3.2 針對以 Android 12 為目標平臺的應用

          3.2.1 更安全的導出組件

          包含 intent 過濾器的應用組件必須顯式設置 android:exported 屬性,如 Activity、Service、Broadcast Receive。未設置該屬性的應用無法安裝在 Android 12 上。

          錯誤信息:

          Installation did not succeed.
          The application could not be installed: INSTALL_FAILED_VERIFICATION_FAILURE
          List of apks:
          [0] '.../build/outputs/apk/debug/app-debug.apk'
          Installation failed due to: 'null'

          正確示范:

          <service android:name="com.example.app.backgroundService"
          android:exported="false">
          <intent-filter>
          <action android:name="com.example.app.START_BACKGROUND" />
          </intent-filter>
          </service>

          3.2.2 待處理 intent 必須聲明可變性

          如果你的應用以 Android 12 為目標平臺,則必須為你的應用創(chuàng)建的每個 PendingIntent對象指定可變性。這項額外的要求可提高應用的安全性。

          如需聲明特定 PendingIntent 對象是否可變,請分別使用 PendingIntent.FLAG_MUTABLEPendingIntent.FLAG_IMMUTABLE 標志。如果你的應用試圖在不設置任何可變標志的情況下創(chuàng)建 PendingIntent 對象,系統(tǒng)會拋出 IllegalArgumentException,并在 Logcat 中顯示以下消息:

          PACKAGE_NAME: Targeting S+ (version 10000 and above) requires that one of \
          FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.

          Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if \
          some functionality depends on the PendingIntent being mutable, e.g. if \
          it needs to be used with inline replies or bubbles.

          盡可能創(chuàng)建不可變的待處理 intent

          在大多數(shù)情況下,你的應用應創(chuàng)建不可變的 PendingIntent 對象,如以下代碼段所示。如果 PendingIntent 對象不可變,則應用無法修改 intent 來調(diào)整調(diào)用 intent 的結(jié)果。

          PendingIntent pendingIntent = PendingIntent.getActivity(
          getApplicationContext(),
          REQUEST_CODE,
          intent,
          PendingIntent.FLAG_IMMUTABLE // flags
          );

          然而,某些應用需要創(chuàng)建可變的 PendingIntent 對象:

          • 通知中的直接回復操作需要變更與回復關聯(lián)的 PendingIntent 對象中的剪輯數(shù)據(jù)。

            通常,您可以通過將 FILL_IN_CLIP_DATA 作為標志傳遞給 fillIn()的方法請求此變更。

          • 如果您的應用使用 PendingIntent 將對話放在氣泡中,則 intent 應該可變,以便系統(tǒng)可以應用正確的標志,例如 FLAG_ACTIVITY_MULTIPLE_TASK 和 FLAG_ACTIVITY_NEW_DOCUMENT。

          如果您的應用創(chuàng)建了可變的 PendingIntent 對象,強烈建議您使用顯式 intent 并填寫 ComponentName。如此一來,每當另一個應用調(diào)用 PendingIntent 并將控制權(quán)傳回您的應用時,應用中的相同組件都會啟動。

          3.2.3 前臺服務啟動限制

          以 Android 12 為目標平臺的應用在后臺運行時無法再啟動前臺服務,但一些特殊情況除外。如果應用在后臺運行時嘗試啟動前臺服務,并且前臺服務不符合任何特殊情況,則系統(tǒng)會拋出IllegalStateException

          4. 關于APP 適配

          基于對 Android 12 的調(diào)研以及項目當前的環(huán)境配置,總結(jié)出項目可能面臨的一些適配問題

          我司 App 當前環(huán)境配置:

          compileSdkVersion = 27
          targetSdkVersion = 27

          由于當前的目標版本為27,小于 Android 12 的目標版本,因此目前只需要關注所有應用的行為變更,如MAC 地址的限制、禁止使用ACTION_CLOSE_SYSTEM_DIALOGSintent 操作。

          如果未來計劃升級目標版本至 31,則需關注以 Android 12 為目標平臺的改動,如清單文件中申明了intent-filterActivity、Service,必須設置android:exported,我們目前在 APP 啟動頁、短鏈喚起頁等使用了 intent 過濾器;以及在集成推送服務時,使用到的PendingIntent也需要適配,詳細可參考官方文檔。

          5. 參考資料

          https://developer.android.google.cn/about/versions/12/behavior-changes-12


          寫在最后

                 很多老鐵最近來問我,為什么不更新......實話說,我現(xiàn)在做的工作跟Android關系不大,但這并不意味著Android就業(yè)前景不好,大家都看在眼里,現(xiàn)在Android操作系統(tǒng)能力已經(jīng)與iOS不相上下甚至國內(nèi)優(yōu)秀廠商定制的系統(tǒng)功能已經(jīng)超過iOS。大家要做的就是不斷充實自己,多了解最新的技術(shù)動向,比如kotlin,現(xiàn)在如果還是只會Java,估計是不夠了。

                  哦,對了,有對AliOS車載開發(fā)感興趣的,直接私信我,site:武漢,有Android開發(fā)經(jīng)驗就行。



          瀏覽 155
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  免费看黄色一极片 | 亚洲黄色片 | 天天插夜夜操 | 国产精品九九九九九九 | 免费观看一级二级网站 |