Android Jetpack 集合了一系列的開發庫,旨在幫助開發者更容易地創作高質量的應用,同時也更好地兼容老舊版本的 Android 系統。在正式發布 Jetpack 兩年后的今天,我們已經看到大量的應用開發開始采用 Jetpack 中的開發庫,這其中既包括大型開發團隊的產品,也有那些剛起步的應用。而這一切僅僅是開始,因為近期我們發布了一系列新的開發庫,以及過去一年我們對于現有開發庫的重要更新。
在今年的谷歌開發者大會上,我們也為大家介紹了 Jetpack 的重要更新,您也可以 點擊此處 到大會官網觀看相關視頻。
發布到 Alpha 版本的庫
Hilt — Jetpack 官方推薦的依賴注入開發庫
Hilt 是一個新的 Android 開發庫,它可以幫助應用開發更容易地實現 依賴注入。Hilt 讓您只需考慮聲明和注入綁定中的重要部分,而不必擔心管理依賴注入的初始化和連接等部分。
Hilt 是基于 Dagger 開發的,也同樣受益于其編譯期錯誤診斷、改良的運行時性能以及良好的可擴展性。Hilt 已經集成了對 Jetpack 開發庫和 Android 系統類庫的支持。舉個例子,為了注入 ViewModel 參數,可以使用 @ViewModelInject 注解 ViewModel 的構造函數,然后使用 @AndroidEntryPoint 來注解 Fragment:
<!-- Copyright 2019 Google LLC.
SPDX-License-Identifier: Apache-2.0 -->
class SearchViewModel @ViewModelInject constructor(
private val repository: SearchRepository
): ViewModel() { … }
@AndroidEntryPoint
class SearchFragment : Fragment() {
val viewModel: SearchViewModel by viewModels()
}
請從我們 發布的博客文章 中了解更多關于 Hilt 以及其相關資源。
Paging 3 — 分頁加載顯示數據內容
Paging 開發庫可以幫助分頁加載顯示數據內容。我們發布了使用 Kotlin 的協程 重寫的 Paging 3。新版本添加了一些呼聲較高的新功能,比如分隔符、標頭和頁腳,以及數據轉換。此外,新版本還添加了用來監控列表加載狀態的一系列的 API,以及重試和刷新的方法等。
舉個例子,使用 Paging 3,我們可以通過繼承 PagingSource 類來定義數據源,并實現 load 這個掛起函數,該函數可以直接執行其他的掛起函數:
<!-- Copyright 2019 Google LLC.
SPDX-License-Identifier: Apache-2.0 -->
class MyPagingSource : PagingSource<Key, Value>() {
override suspend fun load(params: LoadParams<Key>): LoadResult<Key, Value> {
try {
val result = api.requestPage(params.key)
return Page(
data = result.items,
nextKey = result.nextKey
)
} catch(error: IOException) {
return Error(error)
}
}
}
點擊 此處 獲取更多 Paging 3 的相關信息。
App Startup — 在應用啟動時初始化組件
App Startup 開發庫提供了一種相當直接且高效的方式,來幫助程序在啟動過程中初始化組件。不同于以往需要單獨為每個需要初始化的組件定義 ContentProvider,App Startup 可以利用一個共享的 ContentProvider 來同時定義多個組件的初始化操作,這樣可以有效加快應用啟動速度。
下面的例子展示了如何利用 App Startup 來優化 WorkManager 的初始化時間,底層的實現是 App Startup 使用了一個共用的 ContentProvider,并代替了 WorkManager 自有的 ContentProvider:
<!-- Copyright 2019 Google LLC.
SPDX-License-Identifier: Apache-2.0 -->
// Initializes WorkManager.
class WorkManagerInitializer : Initializer<WorkManager> {
override fun create(context: Context): WorkManager {
val configuration = Configuration.Builder().build()
WorkManager.initialize(context, configuration)
return WorkManager.getInstance(context)
}
override fun dependencies(): List<Class<out Initializer<*>>> {
return emptyList()
}
}
點擊 此處 獲取更多有關 App Startup 的信息。
輸入法集成自動填充功能
Android 11 為軟鍵盤引入了一系列系統 API 來顯示自動填充內容,并且提示內容可以來自其他應用,比如密碼管理器。Jetpack 的 Autofill API 通過其 InlineSuggestionUi 類,讓鍵盤和自動填充服務可以更好地利用新特性。其中自動填充服務可以利用這個類創建更合適的提示內容,而鍵盤可以利用這個類更好地定制自動填充的外觀。
利用 core-animation 和 SeekableAnimatedVectorDrawable 來輕松創建動畫
為了更輕松地實現和測試動畫,我們增加了兩個新的開發庫,分別是 androidx.core:core-animation 和 androidx.core:core-animation-testing。同時我們也引入了一個新的 API SeekableAnimatedVectorDrawable 作為 androidx.vectordrawable 開發庫的一部分。
core-animation 兼容所有自 Android 4.0 之后的新 Animator API,包括 pause (暫停)、resume (恢復) 和 seek (查找)。
SeekableAnimatedVectorDrawable 基于 core-animation 開發,它是 AnimatedVectorDrawable (AVD) 可替代方案。它使用與 AVD 同樣的文件格式,并且新增了 seek (查找)、pause (暫停) 和 resume (恢復) 的功能。Seekable AVD 暫時不可以利用渲染線程,所以只有當急需該類新特性的時候才推薦使用。
利用 Android Studio 的數據庫檢查器來調試數據庫
有了 Android Studio 4.1 新增的 Database Inspector,數據庫調試變得十分簡單。這個工具可以在正在運行的應用中查看、檢索以及修改數據庫的內容。無論是使用 Room 還是直接使用 SQLite,您都可以通過菜單欄中的 View > Tool Windows > Database Inspector 開始調試數據庫。請通過我們的文章《期待已久的動態數據庫工具終于來了!》了解更多關于這個工具的內容以及如何使用它。
WindowManager — 更好地支持新的設備形態
WindowManager 是一個新加入到 Android Jetpack 中的開發庫,其旨在幫助開發者更好地支持新的屏幕類型,比如折疊屏、多分屏等。該庫為新老版本不同的 WindowManager 功能提供了一個統一的 API 接口。
初始的發布版本提供了對于市面上已有以及即將上市的不同可折疊設備的支持,開發者可以利用其適配所有不同類型的硬件配置。了解更多相關內容,請查閱 博客文章 和 示例工程。
MotionLayout — 為 Android 創建流暢的可交互動畫
MotionLayout API 在 ConstraintLayout 豐富功能的基礎上,可以幫助 Android 開發者開發復雜的動畫效果。使用 MotionLayout,開發者既可以輕松地在 ConstraintSets 之間設置過渡動畫,也可以方便地將動畫集成到常用的視圖組件中,比如 RecyclerView、ViewPager 等。Android Studio 4.0 還包含了一個可視化的動效編輯器,它可以用來創建和預覽基于 MotionLayout 的動畫。
對于已有開發庫的更新
Navigation 庫
Navigation 2.3 新增了對于 Dynamic Delivery 功能模塊 的支持,該功能可以讓用戶只下載需要的部分,從而大大降低應用的初始下載體積。另外,您可以像導航到基礎模塊一樣導航到動態功能模塊。除此之外,深層鏈接現在既支持檢索參數,也支持自定義的 action 和 mime 類型。
同時新增了一個可以 返回結果 的 API,通過它可以在 SavedStateHandle 中查詢和設置所有回退棧的入口。新增的 TestNavHostController 可以讓您訪問 Navigation 回退棧,并且在測試中設置當前的目的地。
WorkManager 庫
最新發布的 WorkManager 支持了那些需要長時間運行的 Worker 或者應被操作系統保持運行在前臺的服務。
為了讓 WorkManager 任務調試更簡單,我們新增了一個診斷 API。這個 API 可以讓開發者監控WorkManager 的內部狀態,并且在 logcat 中打印出該狀態的具體信息:
Recently completed work:
Id Class Name Job Id State Unique Name Tags
88e31476–50d5–4a3a-855a-7c158d61543e com.example.DiagnosticsWorker null SUCCEEDED com.example.DiagnosticsWorker
939d3d81–4a24–4920-ab6a-2a5b850f377b com.example.ToastWorker null SUCCEEDED com.example.ToastWorker
59ab8eb1–2645–446d-8811–1e7b887ab5bc com.example.ForegroundWorker null CANCELLED com.example.ForegroundWorker
7a6c23d2-a1f9–4477-af77–1f16b45cd765 com.example.ForegroundWorker 0 SUCCEEDED com.example.ForegroundWorker
Running work:
Id Class Name Job Id State Unique Name Tags
7c8bc01f-a60c-4b63-a6aa-2055d4d9d88e com.example.DiagnosticsWorker 4 RUNNING com.example.DiagnosticsWorker
△ WorkManager 診斷結果示例
為了幫助您避免在使用 WorkManager 時遇到一些常見錯誤,我們同時還新增了 Lint 規則來標識它們。另外還有一些 API 的更新,包括支持設置和觀察 Worker 的中間進度、一些對于當前 Worker 查詢 API 的優化、一些對于進行中的工作器的調度優化。
Benchmark 庫
Benchmark 庫發布的 alpha release: 1.1.0-alpha01 版本中集成了 CPU 性能剖析工具,該工具可以幫助開發者分析應用性能基準測試結果,并且可以在 Android Studio 中直接查看相關方法和抽樣的堆棧信息。我們同時還添加了對于內存分配的追蹤,以便于開發者可以優化內存分配和垃圾回收所消耗的時間。
權限庫 (Permissions)
為了更方便地管理權限,我們引入了一系列新的 ActivityResult API。這些 API 可以用 RequestPermission contract 來替換 requestPermissions,以簡化權限請求的開發。除此之外,這些 API 還為一些常見的 intent 提供了類型安全的 contract,比如 選取圖片 和提示用戶 打開一個文件。
游戲 SDK
今年初剛發布的 Android 游戲 SDK 如今也作為 Jetpack 的一部分在 Google Maven 倉庫上線。該 SDK 提供一個 幀同步 API 和 Android 性能調優器。請通過 官方文檔 獲取更多有關游戲 SDK 的內容。
CameraX 庫
由于 Android 設備的多樣性,市面上有太多的不同種類的相機硬件,而 CameraX 可以兼容市面上 90% 的設備。從二月份 CameraX 發布 Beta 版本 至今,我們一直致力于提升可靠性,以確保 API 在各種設備上都擁有更好的行為。我們的 CameraX 測試實驗室也在不斷地針對不同機型進行自動化測試,以最大程度地兼容市面上超過 4 億臺的設備。
在 最近的版本 中,CameraX 引入了對于 PreviewView 組件的優化。該組件如今可以更好地處理應用生命周期和 ViewPager。該組件底層會在支持的設備上自動使用 SurfaceView 以最大程度地獲取性能上的優化,這也幫助其使用更少的緩存以及更低電量的消耗。
要了解更多關于 CameraX 的內容,請參閱我們詳盡的 CameraX 文檔 和 示例工程,以及我們過去推送的文章《使用 PreviewView 來展示相機預覽》。
Security 庫
Jetpack 的 Security 庫為 基于文件加密抽象層的使用提供了安全簡便的方法,比如 EncryptedFile 和 EncryptedSharedPreferences。Jetpack 的 Security 開發庫利用 Android 的 Keystore,以提供基于硬件存儲空間和相關操作的安全。Jetpack 的 Security 開發庫 如今為 Android 6.0 以后的系統發布了 RC 版本(最新版本為 RC3),并且為 Android 5.0 以后的系統提供了 1.1.0 alpha 版本。
AppCompat 庫
AppCompat 庫提供了大量向前兼容的 UI 組件和系統功能,從 Material 主題到 Toolbar 等組件,再到深色主題。在 最新的發布 中,我們新增了 Lint 規則,這有利于開發者辨別哪些屬性來自于 AppCompat 以及哪些來自于系統框架,并保證您使用了正確的屬性。此外,我們還針對 AppCompat 中深色主題實現的穩定性進行了大量優化。
Webkit 庫
Jetpack 的 Webkit 開發庫在 1.2.0 版本(最新版為 1.4.0-rc01) 中新增了一個強制使用深色主題顯示內容的 API。使用這個 API 的時候,如果網站支持深色主題,WebView 會自動地使用深色主題渲染該站點。如果網站不支持深色主題,這個 API 會強制轉換其中的一些顏色。
Jetpack Compose — 全新的 Android UI 開發框架
Jetpack Compose 是全新的現代 Android UI 開發框架,目前發布了開發者預覽第二版。新版本添加了許多新功能,包括視圖組件的互通性、更多的 Material UI 組件、支持深色主題、新的 UI 測試和動畫 API、對于 ConstraintLayout 的支持、優化狀態管理、集成可觀察的數據流和 RTL 支持。Android Studio 預覽現在是可交互的,并且還有很多編譯器方面的優化。 您可以查閱我們的 Alpha 版本發布文章、深入詳解 Jetpack Compose 之 優化 UI 構建 和 實現原理 等文章了解更多。
獲取更多的更新內容,請觀看視頻: Jetpack Compose 更新速遞,歡迎大家嘗鮮這些新的更新并積極 向我們反饋。
本文概括了 Jetpack 過去幾個月的更新。由于其包括了超過 90 個開發庫,我們知道想找到您所關心的內容并非易事。為了幫助開發者,我們 重新設計了 Jetpack 網站,并且在大量更新之余新增了一個便捷的 API 選取器,可以幫助開發者更快捷的找到 Jetpack 中合適的開發庫來解決問題。