Android Jetpack 作為 Android 開發的關鍵支柱,目前它已經包含了 100 多個庫、工具和指南,可幫助開發人員獲得最佳的開發實踐、減少樣闆代碼,并編寫跨 Android 版本和裝置的可相容運作的代碼。
Google Play 中的大多數 App 都使用 Jetpack 建構應用,如今前 1000 個應用程式中有超過 90% 使用 Jetpack。
下面我們将介紹 Jetpack 三個主要領域的更新:
- Architecture Libraries 和相關指引
- 應用程式的性能優化
- 使用者界面 Libraries 和相關指引
一、 Architecture Libraries
Architecture libraries 和 Components 是用于確定 App 具備健壯、可測試和可維護的能力。
Data Persistence
Room是 Android 推薦的資料庫工具,它在 SQLite 之上提供了一個抽象層,進而提高了平台的可用性和安全性。
在 Room 2.4 中,Kotlin Symbol Processing(KSP) 得到了更穩定的支援,在我們的 Kotlin 代碼基準測試中,KSP 的速度比 KAPT 提高了 2 倍,Room 2.4 還添加了對枚舉和 RxJava3 的内置支援,并完全支援 Kotlin 1.6。
Room 2.5 開始使用 Kotlin 完成重寫,未來将于 Kotlin 相關的改進同步進行,同時仍與以 Java 編寫的版本二進制相容,通過 room-paging 還可以内置對 Paging 3.0 的支援,該 artifact 允許 Room 查詢傳回
PagingSource
對象。
此外,開發人員現在可以直接執行 JOIN 查詢,而無需定義額外的資料結構,因為 Room 現在支援使用多映射。
@Query("SELECT * FROM Artist
JOIN Song ON Artist.artistName =
Song.songArtistName")
fun getArtistToSongs(): Map<Artist, List<Song>>
另外,通過對
AutoMigrations
的相關更新簡化了資料庫遷移,并增加了對其他注釋和屬性的支援,而
@Database
注釋上的新
AutoMigration
屬性可用于聲明要從哪些版本開始自動遷移,當 Room 需要執行有關表和列修改的資訊時,可以使用
@AutoMigration
注釋來指定輸入。
Database(
version = MyDb.LATEST_VERSION,
autoMigrations = {
@AutoMigration(from = 1, to = 2,
spec = MyDb.MyMigration.class),
@AutoMigration(from = 2, to = 3)
}
)
public abstract class MyDb
extends RoomDatabase {
...
DataStore
DataStore庫是一個強大的資料存儲解決方案,可解決曆史上
SharedPreferences
的大部分問題。
如果希望更好地了解
DateStore
,可以檢視 Modern Android Development Skills: DataStore 中的一系列視訊和文章,其中包括有關庫的使用情況指導,将其與依賴注入一起使用,并如何從
SharedPreference
遷移到 Proto
DataStore
。
增量資料擷取
Paging 庫允許開發者按需加載和顯示資料,以改進網絡和系統資源的消耗,應用程式資料可以在
RecyclerViews
或
Compose
懶清單中按需加載。
Paging 3.1 為 Rx 和 Guava 內建提供了支援,這為 Paging 對 Kotlin 協程的使用提供了 Java 替代方案。
此版本還使用新的傳回類型
LoadResult.Invalid
, 它改進了對無效競争條件的處理,以處理無效或陳舊的資料。
使用新的
onPagesPresented
和
addOnPagesUpdatedListener
API 還改進了對空頁面的無操作加載的處理。
要了解有關 Paging 3 的更多資訊,請檢視 Paging Basics Codelab。
在應用使用 Navigation
Navigation庫是一個用于在 App 中進行導航的架構。
Navigation 元件現在通過新的navigation-compose成到 Jetpack Compose 中,它允許可組合函數用作于 App 的目标。
Multiple Back Stacks 功能同樣得到改進,這使得 Navigation 更容易記住狀态,
NavigationUI
現在會自動儲存和恢複彈出目标的狀态,這意味着開發人員可以支援多個傳回堆棧,而無需更改任何代碼。
NavHostFragment
增強了對大螢幕支援,在
AbstractListDetailFragment
中提供了雙窗格布局的預建構, 此 Fragment 使用
SlidingPaneLayout
來管理清單窗格(由子類管理)和使用
NavHostFragment
的詳細資訊窗格。
所有 Navigation 工件都已在 Kotlin 中重寫,并使用泛型改進了類的可空性 - 例如
NavType
子類。
二、 應用性能優化
使用性能庫可以建構高性能 App 并确定優化目标以保持性能的高效,進而獲得更好的使用者體驗。
改善啟動時間
App 啟動速度會對使用者體驗産生關鍵影響,尤其是在安裝後立即使用應用程式的時候,是以為了改善首次啟動的體驗,我們建立了Baseline Profiles。
Baseline Profiles 允許應用和庫向 Android 運作時提供有關代碼路徑使用情況的metadata,它使用這些 metadata 來确定提前編譯的優先級。
配置檔案資料最終會彙總并作為
baseline.prof
檔案放入應用程式的 APK 中,然後在安裝時使用該檔案對應用程式及其靜态連結庫代碼進行部分預編譯,這可以讓 App 加載速度更快,并減少使用者首次與應用程式互動時的丢幀。
目前我們已經開始在 Google 中使用 Baseline Profiles,采用 Baseline Profiles 後,Play Store 應用在其搜尋結果頁面上的初始頁面呈現時間減少了 40%, Baseline Profiles 也已添加到現在各個流行的庫中,例如
Fragments
和
Compose
,它可以幫助 App 擷取更好的使用者體驗。
如果要建立自己的基線配置檔案,需要使用Macrobenchmark。
檢測應用
Macrobenchmark 通過将 Jetpack 的基準測試覆寫範圍擴充到更複雜的用例,包括應用啟動和內建 UI 操作(例如滾動 RecyclerView 或運作動畫),進而幫助開發人員更好地了解應用性能,Macrobenchmark 也可用于生成 Baseline Profiles。
目前 Macrobenchmark 已經更新包括提高了測試速度,并具有幾個新的實驗功能。
同時,它現在還支援使用
TraceSectionMetric
進行基于自定義跟蹤的時序測量,這允許開發人員對特定代碼部分進行基準測試,此外
AudioUnderrunMetric
現在可以檢測音頻緩沖區欠載,以幫助了解音頻卡頓。
BaselineProfileRule
生成配置檔案可以幫助運作時的優化,
BaselineProfileRule
的工作方式與其他宏基準測試類似,在這些基準測試中,開發者将使用者操作表示為 lambda 中的代碼。
在下面的示例中,編譯器應提前優化的冷啟動:從 launcher 到 activity。
@ExperimentalBaselineProfilesApi
@RunWith(AndroidJUnit4::class)
class BaselineProfileGenerator {
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun startup() = baselineProfileRule.collectBaselineProfile(
packageName = "com.example.app"
) {
pressHome()
// This block defines the app's critical user journey. Here we are
// interested in optimizing for app startup, but you can also navigate
// and scroll through your most important UI.
startActivityAndWait()
}
}
有關使用 Macrobenchmark 生成和使用 Baseline Profiles 的更多詳細資訊和完整指南,請檢視 Android 開發人員網站上的 指南。
避免 UI 卡頓 / Jank
新的JankStats庫可幫助開發者跟蹤和分析應用 UI 中的性能問題,包括有關丢棄的渲染幀的報告:“jank”。
JankStats 建構在現有的 Android 平台 API(FrameMetrics)之上,但可以使用相容到 API 級别 16。
該庫還提供了超出平台内置功能的其他功能:幫助查明丢幀原因的方法、在報告中提供額外 UI 狀态上下文以及可用于上傳資料進行分析的報告回調。
下面詳細介紹一下 JankStats 的三個主要方面:
- 識别 Jank: 庫使用内部方法來确定何時發生 jank,并使用該資訊知釋出 jank 報告,以便開發人員獲得有關這些問題的資訊幫助分析和修複問題。
- 提供 UI 上下文: 為了使 jank 報告更加有用,庫還提供了一種機制來幫助跟蹤 UI 和使用者的目前狀态。每當記錄報告時都會提供此資訊,以便開發人員不僅可以了解問題發生的時間,還可以了解使用者當時正在做什麼。這有助于識别應用程式中可以解決的問題區域,其中一些狀态是由各種 Jetpack 庫自動提供,但也鼓勵開發人員提供自己的應用程式特定狀态。
- 報告結果: 在每一幀中,JankStats 用戶端都會通過偵聽器收到有關該幀的資訊的通知,包括該幀完成所用的時間、是否被視為卡頓以及該幀期間的 UI 上下文。
日志記錄
Tracing 庫通過 将跟蹤事件寫入系統緩沖區來啟用應用程式性能分析,Tracing 1.1 支援在 API 級别 14 的非調試版本中進行分析,類似于在 API 級别 29 中添加的
<profileable>
清單标記。
三、 使用者界面庫和指南
我們對 UI 庫進行了一些更改,以更好地支援大螢幕相容、折疊和表情符号相關适配。
Jetpack Compose
Jetpack Compose 是 Android 用于建構原生 UI 的現代工具包,今天已達到 1.2 測試版,它添加了多項功能以支援更進階的用例,包括支援可下載下傳字型、惰性布局和嵌套滾動互操作性。
有關 Jetpack Compose 的更新可見:android-developers.googleblog.com/2022/05/wha… 。
了解視窗狀态
新的WindowManager庫通過提供一個支援 API14 的通用 API 界面,幫助開發人員調整他們的應用以支援多視窗環境和新的裝置外形。
初始版本針對可折疊裝置用例,包括查詢影響内容應如何顯示的實體屬性。
Jetpack 的
SlidingPaneLayout
元件已更新為使用
WindowManager
的智能布局 API 來實作,進而避免将内容放置在被遮擋的區域,例如跨實體鉸鍊。
拖放
新的DragAndDrop庫支援接受來自其應用程式内部和外部的拖放資料,進而有助于新的外形尺寸和視窗模式下的使用者體驗,目前它支援到 API 24。
AppCompat
AppCompat 1.4 內建了 Emoji2 庫,為 API 14 及更進階别的 AppCompat 支援的所有基于文本的視圖帶來了對新表情符号的預設支援。
Custom locale selection 現在是 API 14 的支援,該功能支援手動跨應用啟動的區域設定的持久性,并通過服務中繼資料标志支援自動持久性,隻需要告訴庫同步加載語言環境并根據需要重新建立任何正在運作的 Activity。
在 API33 及更進階别上,持久性由平台管理無需額外開銷。
四、其他關鍵更新
注解
Annotation 庫公開了中繼資料,可幫助工具和其他開發人員更好地了解應用的代碼。它提供了大家熟悉的注釋,如
@NonNull
與 lint 檢查配對,以提高代碼的正确性和可用性。
Annotation 正在遷移到 Kotlin,是以現在使用 Kotlin 的開發人員将看到更合适的注解目标,包括
@file
。
添加了幾個高度請求的 Annotation 以及相應的 lint 檢查,這包括有關方法或函數覆寫的注釋,以及
@DeprecatedSinceApi
注釋,它提供了
@RequiresApi
的推論并阻止使用超出特定 API 級别。
Github
現在 GitHub 中有100 多個項目 使用了基于 GitHub 的标準工作流程,以下子產品可供開發人員貢獻:
- Activity
- AppCompat
- Biometric
- Collection
- Compose Compiler
- Compose Runtime
- Core
- DataStore
- Fragment
- Lifecycle
- Navigation
- Paging
- Room
- WorkManager