1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Android12,你的適配開始了嗎

        共 6331字,需瀏覽 13分鐘

         ·

        2021-04-20 14:52

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

        1. 獲取 Android 12

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

        • 安裝 Android Studio 的最新預(yù)覽版 build。

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

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

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

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

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

        2. API 變更

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

        2.1 GIF 和 WebP 的原生 ImageDecoder 支持

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

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

        2.2 支持圓角

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

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

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

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

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

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

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

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


        3. 影響應(yīng)用的行為變更

        3.1 針對所有應(yīng)用的行為變更

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

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

        3.1.1 對 MAC 地址的限制

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

        相關(guān) API 會返回空值或占位值,具體取決于應(yīng)用的 Target SDK 版本:

        • 如果應(yīng)用以 Android 12 為目標(biāo)平臺,則該 API 會返回 null。

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

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

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

        3.1.2 應(yīng)用覆蓋控制

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

        3.1.3 應(yīng)用無法關(guān)閉系統(tǒng)對話框

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

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

        • 如果應(yīng)用以 Android 11(API 級別 30)或更低版本為目標(biāo)平臺,則系統(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 為目標(biāo)平臺的應(yīng)用

        3.2.1 更安全的導(dǎo)出組件

        包含 intent 過濾器的應(yīng)用組件必須顯式設(shè)置 android:exported 屬性,如 Activity、Service、Broadcast Receive。未設(shè)置該屬性的應(yīng)用無法安裝在 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 必須聲明可變性

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

        如需聲明特定 PendingIntent 對象是否可變,請分別使用 PendingIntent.FLAG_MUTABLEPendingIntent.FLAG_IMMUTABLE 標(biāo)志。如果你的應(yīng)用試圖在不設(shè)置任何可變標(biāo)志的情況下創(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ù)情況下,你的應(yīng)用應(yīng)創(chuàng)建不可變的 PendingIntent 對象,如以下代碼段所示。如果 PendingIntent 對象不可變,則應(yīng)用無法修改 intent 來調(diào)整調(diào)用 intent 的結(jié)果。

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

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

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

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

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

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

        3.2.3 前臺服務(wù)啟動限制

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

        4. 關(guān)于APP 適配

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

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

        compileSdkVersion = 27
        targetSdkVersion = 27

        由于當(dāng)前的目標(biāo)版本為27,小于 Android 12 的目標(biāo)版本,因此目前只需要關(guān)注所有應(yīng)用的行為變更,如MAC 地址的限制、禁止使用ACTION_CLOSE_SYSTEM_DIALOGSintent 操作。

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

        5. 參考資料

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


        寫在最后

               很多老鐵最近來問我,為什么不更新......實話說,我現(xiàn)在做的工作跟Android關(guān)系不大,但這并不意味著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
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            香蕉自拍视频 | youjizz国产精品 | 我要操在线 | 午夜羞羞视频在线观看 | 小早川ThePorn在线播放 | 后入美女逼 | 国产青青| 少妇高潮heyzo | 欧美老妇与禽交 | 性欧美猛交69 |