Android Jetpack 更新一覽

image

作者 / Florina Muntenescu, Android Developer Advocate

Android Jetpack 是一套庫、工具和指導(dǎo)規(guī)范,幫助開發(fā)者遵循最佳實踐,減少模板代碼,以及編寫在不同的 Android 版本和設(shè)備上運(yùn)行一致的代碼。今天,Google Play 上排名前 1,000 的應(yīng)用中有 84% 在使用 Jetpack。

下面讓我們一起看看 Jetpack 最新的更新情況,如果您已觀看 Jetpack 更新一覽 演講的話,本文會做進(jìn)一步的補(bǔ)充,請別錯過!

穩(wěn)定渠道更新一覽

CameraX

CameraX 庫為跨操作系統(tǒng)版本訪問攝像頭功能提供了統(tǒng)一的 API 界面,包括針對特定設(shè)備的兼容性修復(fù)和變通方案。該庫的一些最新改進(jìn)解決了常見的功能需求,包括支持調(diào)整曝光補(bǔ)償和訪問有關(guān)攝像頭狀態(tài)和功能的更詳細(xì)信息。此外,現(xiàn)在可以在攝像頭運(yùn)行時通過 Camera2Interop 改變攝像頭設(shè)置,如 FPS 范圍。該庫還帶來了對最新設(shè)備和操作系統(tǒng)功能的支持,包括高動態(tài)范圍 (HDR) 預(yù)覽、變焦率控制,以及對 Android 勿擾模式的支持。但也許最重要的是,CameraX 庫在持續(xù)解決性能問題,使圖像捕捉和初始化速度更快,特別是在舊設(shè)備上。

Hilt

Hilt 是 Jetpack 推薦的建立在 Dagger 之上的依賴注入解決方案。作為向穩(wěn)定版過渡的一部分,Hilt 的 ViewModel 支持已經(jīng)上升到核心 Hilt Android API,SavedStateHandle 已經(jīng)被添加為 ViewModelComponent 中的默認(rèn)依賴。此外,Hilt 現(xiàn)在已經(jīng)與 Navigation 和 Compose 集成: 您可以獲得一個注釋的 Hilt ViewModel,其作用范圍是目的地或?qū)Ш綀D本身。開發(fā)者已經(jīng)開始在他們的應(yīng)用中使用 Hilt,請通過 這篇博文 看看他們?nèi)〉昧四男┙?jīng)驗。

Paging 3.0

Paging 庫讓您可以加載和顯示小塊的數(shù)據(jù)以改善網(wǎng)絡(luò)和系統(tǒng)資源的消耗。這個版本的特點(diǎn)是使用 Kotlin 完全重寫,對協(xié)程和 Flow 有一流的支持,用 RxJava 和 Guava 原語進(jìn)行異步加載,并對存儲庫和表現(xiàn)層進(jìn)行了全面改進(jìn)。

與 Paging 2 相比,3.0 版本在可用性方面有了很大的改進(jìn),重寫時就考慮到了部分和分階段遷移的問題,以便開發(fā)者可以按照自己的計劃進(jìn)行過渡。請查看 Paging 3.0 文檔Paging 3.0 codelab,以了解更多細(xì)節(jié)并上手實踐。

ConstraintLayout 和 MotionLayout

ConstraintLayout (Jetpack 中用于設(shè)計布局的靈活系統(tǒng)) 和 MotionLayout (管理運(yùn)動和 widget 動畫的 API) 現(xiàn)在已經(jīng)發(fā)布了穩(wěn)定版。MotionLayout 現(xiàn)在支持可折疊設(shè)備、圖像濾鏡和動效。請 觀看這場 Google I/O 演講 了解更多關(guān)于設(shè)計工具的新內(nèi)容。

Security Crypto

Security Crypto 庫讓您可以安全、輕松地加密文件和 SharedPreferences。如果您想要加密 SharedPreferences,請用適當(dāng)?shù)拿荑€和方案創(chuàng)建一個 EncryptedSharedPreferences 對象,然后像標(biāo)準(zhǔn) SharedPreferences 對象一樣使用它即可。

val prefs: SharedPreferences = EncryptedSharedPreferences.create(
        context,
        "prefs_file_name",
        mainKey,
        prefKeyEncryptionScheme = AES256_SIV,
        prefValueEncryptionScheme = AES256_GCM,
)
// Use the resulting SharedPreferences object as usual.
prefs.edit()
    .putBoolean("show_completed", true)
    .apply()

Fragment

在過去的一年里,我們在 Fragment 庫上著力甚多,對其內(nèi)部實現(xiàn)進(jìn)行了清理并減少了未記錄的行為,使開發(fā)者更容易在他們的應(yīng)用中遵循最佳實踐,并編寫可靠的測試。這為該庫未來的改進(jìn)奠定了基礎(chǔ),比如支持 Navigation 中的多個后退棧,這可能需要投入一些工作,來做到 API 合約的嚴(yán)格執(zhí)行。具體來說,在更新庫之后,請仔細(xì)關(guān)注您的測試。您可以查看 Fragment 的 發(fā)布說明,了解需要注意的具體案例。

Fragment 最近的版本還引入了 ActivityResult 集成,使得從 fragment 中注冊 Activity 結(jié)果成為可能。Fragment 還添加了一個新的 FragmentOnAttachListener 接口,以取代不太靈活的 onAttachFragment 方法。在 FragmentFragmentActivity 中重寫這個方法的現(xiàn)有代碼仍然可以正常運(yùn)行,但我們已經(jīng)廢棄了 onAttachFragment,以防止新代碼意外采用不太靈活的做法。

// Obtain the fragment manager. May be a childFragmentManager,
// if in a fragment, to observe child attachment.
val fm = supportFragmentManager


val listener = FragmentOnAttachListener {
    fragmentManager, fragment ->
  // Respond to the fragment being attached.
}


fm.addFragmentOnAttachListener(listener)

Beta 渠道更新一覽

開發(fā)庫的功能一旦完成開發(fā),就會進(jìn)入 Beta 版本以保持穩(wěn)定。在這之后,只有發(fā)現(xiàn)重大問題或基于社區(qū)反饋才會對 API 進(jìn)行修改。

DataStore

DataStore 提供了穩(wěn)健的數(shù)據(jù)存儲解決方案,解決了 SharedPreferences 的缺陷,同時讓 API 接口保持簡單且高度可用。DataStore 帶來了對最佳實踐的支持,如 Kotlin 協(xié)程與 Flow 和 RxJava。DataStore 允許您通過 Preference DataStore 存儲鍵值對,或者通過 Proto DataStore 存儲 protobuff 格式的類型對象。您還可以 插入 自己的序列化解決方案,比如 Kotlin Serialization。

Alpha 渠道更新一覽

Alpha 版本的庫處于活躍的開發(fā)狀態(tài): API 可能會被添加、改變或刪除,但庫中的內(nèi)容是經(jīng)過測試的,一般來說具備高度的可用性。

AppSearch

AppSearch 是一個新的設(shè)備上搜索庫,提供高性能且功能豐富的全文搜索功能。與 SQLite 相比,AppSearch 支持多種語言,簡化了查詢結(jié)果的排序,對大型數(shù)據(jù)集的索引和搜索也有更低的延遲。

AppSearch 1.0.0-alpha01 帶來了 LocalStorage 支持,它允許您的應(yīng)用管理結(jié)構(gòu)化的數(shù)據(jù),稱為 "文檔",然后對其進(jìn)行查詢。您的應(yīng)用使用 "模式類型" 來定義結(jié)構(gòu)。例如,您可以將一個消息 (Message) 建模為一個模式類型,其中包括主題、正文和發(fā)件人等數(shù)據(jù)。

使用構(gòu)建器來創(chuàng)建模式類型的文件,然后將它們添加到存儲中。查詢 "body:fruit" 將檢索所有在消息正文中帶有 "fruit" 一詞的文檔。

在 Android S 中,AppSearch 還將提供 PlatformStorage,使得您可以與其他應(yīng)用安全地共享您的應(yīng)用里的數(shù)據(jù),而且因為無需鏈接額外的原生庫,您的應(yīng)用的二進(jìn)制尺寸也將更小。請注意目前在 Jetpack 中還不能使用 AppSearch,因為其尚未針對 Android S SDK 開發(fā)。

△ Android S+ 上的集中存儲,用于整合到全設(shè)備搜索中

△ Android S+ 上的集中存儲,用于整合到全設(shè)備搜索中

Room

Room 是我們推薦大家采用的數(shù)據(jù)持久層,在平臺上提供更多的可用性和安全性。

Room 2.4.0-alpha 帶來了對 自動遷移 的支持。當(dāng)您的數(shù)據(jù)庫模式發(fā)生變化時,您現(xiàn)在可以聲明一個 @AutoMigration,指出您想從哪個版本遷移到哪個版本,Room 就會為您生成遷移結(jié)果。對于更復(fù)雜的遷移,您仍然可以使用 Migration 類。

@Database(
-   version = 1,
+   version = 2,
    entities = { Doggos.class },
+   autoMigrations = {
+         @AutoMigration (from = 1, to = 2)
+     }
  )
public abstract class DoggosDatabase extends RoomDatabase { }

Room 2.3.0 穩(wěn)定版帶來了對 Kotlin 符號處理 的實驗性支持,在我們對 Kotlin 代碼的基準(zhǔn)測試中,其速度比 KAPT 提高了 2 倍,還帶來了對枚舉和 RxJava3 的內(nèi)置支持。

Room 還引入了 QueryCallback 類,用于在執(zhí)行 SQLite 語句時提供回調(diào),以簡化日志等任務(wù)。另外還加入了新的 @ProvidedTypeConverter 注釋,讓您在創(chuàng)建類型轉(zhuǎn)換器時更加靈活。

WorkManager

WorkManager 庫是 Android 推薦的安排可推遲的異步任務(wù)的方式,即使應(yīng)用退出或設(shè)備重啟也會運(yùn)行。WorkManager 已經(jīng)對任務(wù)調(diào)節(jié)的可靠性進(jìn)行了改進(jìn),確保所有任務(wù)都被執(zhí)行,并為特定的 Android OS 版本提供了各種解決方法。

WorkManager 的最新版本改進(jìn)了 對多進(jìn)程應(yīng)用的支持,包括將工作請求調(diào)度統(tǒng)一到一個進(jìn)程中的性能優(yōu)勢,以及在調(diào)度許多請求時限制數(shù)據(jù)庫增長。

2.7 版現(xiàn)在處于 alpha 版本,針對 Android S SDK 開發(fā),且適配平臺新的前臺限制。請觀看 Android 上的有效后臺任務(wù) 演講了解更多細(xì)節(jié)。

Background Tasks Inspector 現(xiàn)已在 Android Studio Arctic Fox 中可用,在使用庫的最新版本時您可以輕松查看和調(diào)試 WorkManager 作業(yè):

△ Background Tasks Inspector

△ Background Tasks Inspector

Navigation

Jetpack 的 Navigation 庫是在應(yīng)用中進(jìn)行導(dǎo)航的框架,現(xiàn)在提供了對多個后退棧的支持,并簡化了目的地位于相同深度的情況,如底部導(dǎo)航欄。

Macrobenchmark

Macrobenchmark 庫將 Jetpack 的基準(zhǔn)測試范圍擴(kuò)展到了應(yīng)用啟動和綜合行為,如滾動性能。您可以遠(yuǎn)程使用該庫來跟蹤持續(xù)集成測試中的指標(biāo),或在本地配合 Android Studio 中的剖析結(jié)果來使用。請 觀看 Google I/O 演講 進(jìn)一步了解相關(guān)細(xì)節(jié)。

對于那些想與 Google Assistant 更緊密集成的開發(fā)者來說,Google Shortcuts 庫提供了一種方法,通過現(xiàn)有的 ShortcutInfo 類向 Google Assistant 和其他 Google 服務(wù)提供動作。

您可以通過 ShortcutManager 一次發(fā)送多達(dá) 15 個快捷方式,以顯示在 Google Assistant 和其他服務(wù)中,使它們可用于語音和其他互動。

要實現(xiàn)這一點(diǎn),您需要用一個 Intent 和一個能力綁定 (capability binding) 來定義一個快捷方式;這個綁定提供了語義上有意義的信息,這將幫助 Google 服務(wù)找出將其展示給用戶的最佳方式。

// expose a "Cappuccino" action to Google Assistant and other services
ShortcutInfoCompat siCompat =
  ShortcutInfoCompat.Builder(ctx, "id_cappuccino")
    .setShortLabel("Cappuccino")
    .setIntent(Intent(ctx, OrderCappuccino::class.java))
    .addCapabilityBinding(
        "actions.intent.ORDER_MENU_ITEM",
        "menuItem.name",
        asList("cappuccino")
    )
    .build()


ShortcutManagerCompat.pushDynamicShortcut(ctx, siCompat)

EmojiCompat

您的應(yīng)用中所有用戶生成的內(nèi)容都包含 ??,而支持現(xiàn)代表情符號是使您的應(yīng)用 ? 的關(guān)鍵!EmojiCompat 庫在 API 19 和更高版本中支持現(xiàn)代表情符號,它已經(jīng)轉(zhuǎn)移到新的構(gòu)件 :emoji2:emoji2,取代了以前的 :emoji:emoji 構(gòu)件。新的 emoji2 庫用 AppStartup 庫增加了 ?? 自動配置功能 (您不需要添加任何代碼 ?? 來顯示 ?? ) !

AppCompat 從 AppCompat 1.4 開始增加了 emoji2。如果您的應(yīng)用使用 AppCompat,用戶將能看到現(xiàn)代的表情符號 ?,無需進(jìn)一步配置。沒有使用 AppCompat 的應(yīng)用,可以添加 :emoji2:emoji2-views。對于自定義 TextViews,可以使用 :emoji2:emoji2-views-helpers 中的實用方法,或通過繼承 AppCompat 視圖來支持現(xiàn)代表情符號。

Jetpack Compose

Jetpack Compose 是用于在 Android 上構(gòu)建原生 UI 的現(xiàn)代工具包,簡化并加速了 Android 上的 UI 開發(fā)。Jetpack Compose 目前處于 Beta 版本,并計劃 在 7 月份發(fā)布穩(wěn)定版。本文提到的許多庫,以及您可能已經(jīng)在使用的其他庫,都專門推出了與 Jetpack Compose 集成的功能。包括 Activity、ViewModel、Navigation 和 Hilt,所有這些庫都可以幫助您在應(yīng)用中更順利地使用 Compose。請 觀看 Google I/O 演講 進(jìn)一步了解相關(guān)細(xì)節(jié)。

不同設(shè)備類型

Jetpack 讓您可以更輕松地針對不同形態(tài)的設(shè)備進(jìn)行開發(fā),包括可折疊設(shè)備、大屏幕設(shè)備和 Wear 設(shè)備。我們?yōu)榇笃聊辉O(shè)備開發(fā)引入了新的規(guī)范,同時改進(jìn)了 WindowManagerSlidingPaneLayout 等 Jetpack 庫。請閱讀 這篇博文 了解詳情。

總結(jié)

以上便是 Jetpack 新內(nèi)容的概覽。請閱讀 AndroidX 的 版本說明,以便了解每個庫的所有更新細(xì)節(jié),以及觀看 Google I/O 演講 了解其中一些庫的詳細(xì)信息。

如果您有任何反饋或問題,歡迎 向我們提交。您的問題有可能出現(xiàn)在下一期的 FAQ 中并獲得解答。感謝您的支持!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容