回顧 | Android Jetpack 重要更新

image

Android Jetpack 集合了一系列的開發(fā)庫,旨在幫助開發(fā)者更容易地創(chuàng)作高質(zhì)量的應(yīng)用,同時也更好地兼容老舊版本的 Android 系統(tǒng)。在正式發(fā)布 Jetpack 兩年后的今天,我們已經(jīng)看到大量的應(yīng)用開發(fā)開始采用 Jetpack 中的開發(fā)庫,這其中既包括大型開發(fā)團(tuán)隊的產(chǎn)品,也有那些剛起步的應(yīng)用。而這一切僅僅是開始,因為近期我們發(fā)布了一系列新的開發(fā)庫,以及過去一年我們對于現(xiàn)有開發(fā)庫的重要更新。

在今年的谷歌開發(fā)者大會上,我們也為大家介紹了 Jetpack 的重要更新,您也可以 點擊此處 到大會官網(wǎng)觀看相關(guān)視頻。

發(fā)布到 Alpha 版本的庫

Hilt — Jetpack 官方推薦的依賴注入開發(fā)庫

Hilt 是一個新的 Android 開發(fā)庫,它可以幫助應(yīng)用開發(fā)更容易地實現(xiàn) 依賴注入。Hilt 讓您只需考慮聲明和注入綁定中的重要部分,而不必?fù)?dān)心管理依賴注入的初始化和連接等部分。

Hilt 是基于 Dagger 開發(fā)的,也同樣受益于其編譯期錯誤診斷、改良的運行時性能以及良好的可擴(kuò)展性。Hilt 已經(jīng)集成了對 Jetpack 開發(fā)庫和 Android 系統(tǒng)類庫的支持。舉個例子,為了注入 ViewModel 參數(shù),可以使用 @ViewModelInject 注解 ViewModel 的構(gòu)造函數(shù),然后使用 @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()
}

請從我們 發(fā)布的博客文章 中了解更多關(guān)于 Hilt 以及其相關(guān)資源。

Paging 3 — 分頁加載顯示數(shù)據(jù)內(nèi)容

Paging 開發(fā)庫可以幫助分頁加載顯示數(shù)據(jù)內(nèi)容。我們發(fā)布了使用 Kotlin 的協(xié)程 重寫的 Paging 3。新版本添加了一些呼聲較高的新功能,比如分隔符、標(biāo)頭和頁腳,以及數(shù)據(jù)轉(zhuǎn)換。此外,新版本還添加了用來監(jiān)控列表加載狀態(tài)的一系列的 API,以及重試和刷新的方法等。

舉個例子,使用 Paging 3,我們可以通過繼承 PagingSource 類來定義數(shù)據(jù)源,并實現(xiàn) load 這個掛起函數(shù),該函數(shù)可以直接執(zhí)行其他的掛起函數(shù):

<!-- 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 的相關(guān)信息。

App Startup — 在應(yīng)用啟動時初始化組件

App Startup 開發(fā)庫提供了一種相當(dāng)直接且高效的方式,來幫助程序在啟動過程中初始化組件。不同于以往需要單獨為每個需要初始化的組件定義 ContentProvider,App Startup 可以利用一個共享的 ContentProvider 來同時定義多個組件的初始化操作,這樣可以有效加快應(yīng)用啟動速度。

下面的例子展示了如何利用 App Startup 來優(yōu)化 WorkManager 的初始化時間,底層的實現(xiàn)是 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()
    }
}

點擊 此處 獲取更多有關(guān) App Startup 的信息。

輸入法集成自動填充功能

Android 11 為軟鍵盤引入了一系列系統(tǒng) API 來顯示自動填充內(nèi)容,并且提示內(nèi)容可以來自其他應(yīng)用,比如密碼管理器。Jetpack 的 Autofill API 通過其 InlineSuggestionUi 類,讓鍵盤和自動填充服務(wù)可以更好地利用新特性。其中自動填充服務(wù)可以利用這個類創(chuàng)建更合適的提示內(nèi)容,而鍵盤可以利用這個類更好地定制自動填充的外觀。

△ 軟鍵盤顯示信用卡號碼自動填充內(nèi)容

利用 core-animation 和 SeekableAnimatedVectorDrawable 來輕松創(chuàng)建動畫

為了更輕松地實現(xiàn)和測試動畫,我們增加了兩個新的開發(fā)庫,分別是 androidx.core:core-animation 和 androidx.core:core-animation-testing。同時我們也引入了一個新的 API SeekableAnimatedVectorDrawable 作為 androidx.vectordrawable 開發(fā)庫的一部分。

core-animation 兼容所有自 Android 4.0 之后的新 Animator API,包括 pause (暫停)、resume (恢復(fù)) 和 seek (查找)。

SeekableAnimatedVectorDrawable 基于 core-animation 開發(fā),它是 AnimatedVectorDrawable (AVD) 可替代方案。它使用與 AVD 同樣的文件格式,并且新增了 seek (查找)、pause (暫停) 和 resume (恢復(fù)) 的功能。Seekable AVD 暫時不可以利用渲染線程,所以只有當(dāng)急需該類新特性的時候才推薦使用。

利用 Android Studio 的數(shù)據(jù)庫檢查器來調(diào)試數(shù)據(jù)庫

△ 在 Android Studio 中使用數(shù)據(jù)庫檢查器

有了 Android Studio 4.1 新增的 Database Inspector,數(shù)據(jù)庫調(diào)試變得十分簡單。這個工具可以在正在運行的應(yīng)用中查看、檢索以及修改數(shù)據(jù)庫的內(nèi)容。無論是使用 Room 還是直接使用 SQLite,您都可以通過菜單欄中的 View > Tool Windows > Database Inspector 開始調(diào)試數(shù)據(jù)庫。請通過我們的文章《期待已久的動態(tài)數(shù)據(jù)庫工具終于來了!》了解更多關(guān)于這個工具的內(nèi)容以及如何使用它。

WindowManager — 更好地支持新的設(shè)備形態(tài)

WindowManager 是一個新加入到 Android Jetpack 中的開發(fā)庫,其旨在幫助開發(fā)者更好地支持新的屏幕類型,比如折疊屏、多分屏等。該庫為新老版本不同的 WindowManager 功能提供了一個統(tǒng)一的 API 接口。

初始的發(fā)布版本提供了對于市面上已有以及即將上市的不同可折疊設(shè)備的支持,開發(fā)者可以利用其適配所有不同類型的硬件配置。了解更多相關(guān)內(nèi)容,請查閱 博客文章示例工程

MotionLayout — 為 Android 創(chuàng)建流暢的可交互動畫

MotionLayout API 在 ConstraintLayout 豐富功能的基礎(chǔ)上,可以幫助 Android 開發(fā)者開發(fā)復(fù)雜的動畫效果。使用 MotionLayout,開發(fā)者既可以輕松地在 ConstraintSets 之間設(shè)置過渡動畫,也可以方便地將動畫集成到常用的視圖組件中,比如 RecyclerView、ViewPager 等。Android Studio 4.0 還包含了一個可視化的動效編輯器,它可以用來創(chuàng)建和預(yù)覽基于 MotionLayout 的動畫。

△ 在動效編輯器中創(chuàng)建、編輯和預(yù)覽 MotionLayout 動畫

對于已有開發(fā)庫的更新

Navigation 庫

Navigation 2.3 新增了對于 Dynamic Delivery 功能模塊 的支持,該功能可以讓用戶只下載需要的部分,從而大大降低應(yīng)用的初始下載體積。另外,您可以像導(dǎo)航到基礎(chǔ)模塊一樣導(dǎo)航到動態(tài)功能模塊。除此之外,深層鏈接現(xiàn)在既支持檢索參數(shù),也支持自定義的 action 和 mime 類型。

同時新增了一個可以 返回結(jié)果 的 API,通過它可以在 SavedStateHandle 中查詢和設(shè)置所有回退棧的入口。新增的 TestNavHostController 可以讓您訪問 Navigation 回退棧,并且在測試中設(shè)置當(dāng)前的目的地。

WorkManager 庫

最新發(fā)布的 WorkManager 支持了那些需要長時間運行的 Worker 或者應(yīng)被操作系統(tǒng)保持運行在前臺的服務(wù)。

為了讓 WorkManager 任務(wù)調(diào)試更簡單,我們新增了一個診斷 API。這個 API 可以讓開發(fā)者監(jiān)控WorkManager 的內(nèi)部狀態(tài),并且在 logcat 中打印出該狀態(tài)的具體信息:

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 診斷結(jié)果示例

為了幫助您避免在使用 WorkManager 時遇到一些常見錯誤,我們同時還新增了 Lint 規(guī)則來標(biāo)識它們。另外還有一些 API 的更新,包括支持設(shè)置和觀察 Worker 的中間進(jìn)度、一些對于當(dāng)前 Worker 查詢 API 的優(yōu)化、一些對于進(jìn)行中的工作器的調(diào)度優(yōu)化。

Benchmark 庫

△ 在 Android Studio 中查看抽樣的堆棧信息

Benchmark 庫發(fā)布的 alpha release: 1.1.0-alpha01 版本中集成了 CPU 性能剖析工具,該工具可以幫助開發(fā)者分析應(yīng)用性能基準(zhǔn)測試結(jié)果,并且可以在 Android Studio 中直接查看相關(guān)方法和抽樣的堆棧信息。我們同時還添加了對于內(nèi)存分配的追蹤,以便于開發(fā)者可以優(yōu)化內(nèi)存分配和垃圾回收所消耗的時間。

權(quán)限庫 (Permissions)

為了更方便地管理權(quán)限,我們引入了一系列新的 ActivityResult API。這些 API 可以用 RequestPermission contract 來替換 requestPermissions,以簡化權(quán)限請求的開發(fā)。除此之外,這些 API 還為一些常見的 intent 提供了類型安全的 contract,比如 選取圖片 和提示用戶 打開一個文件。

游戲 SDK

今年初剛發(fā)布的 Android 游戲 SDK 如今也作為 Jetpack 的一部分在 Google Maven 倉庫上線。該 SDK 提供一個 幀同步 API 和 Android 性能調(diào)優(yōu)器。請通過 官方文檔 獲取更多有關(guān)游戲 SDK 的內(nèi)容。

CameraX 庫

由于 Android 設(shè)備的多樣性,市面上有太多的不同種類的相機(jī)硬件,而 CameraX 可以兼容市面上 90% 的設(shè)備。從二月份 CameraX 發(fā)布 Beta 版本 至今,我們一直致力于提升可靠性,以確保 API 在各種設(shè)備上都擁有更好的行為。我們的 CameraX 測試實驗室也在不斷地針對不同機(jī)型進(jìn)行自動化測試,以最大程度地兼容市面上超過 4 億臺的設(shè)備。

最近的版本 中,CameraX 引入了對于 PreviewView 組件的優(yōu)化。該組件如今可以更好地處理應(yīng)用生命周期和 ViewPager。該組件底層會在支持的設(shè)備上自動使用 SurfaceView 以最大程度地獲取性能上的優(yōu)化,這也幫助其使用更少的緩存以及更低電量的消耗。

要了解更多關(guān)于 CameraX 的內(nèi)容,請參閱我們詳盡的 CameraX 文檔示例工程,以及我們過去推送的文章《使用 PreviewView 來展示相機(jī)預(yù)覽》。

Security 庫

Jetpack 的 Security 庫為 基于文件加密抽象層的使用提供了安全簡便的方法,比如 EncryptedFileEncryptedSharedPreferences。Jetpack 的 Security 開發(fā)庫利用 Android 的 Keystore,以提供基于硬件存儲空間和相關(guān)操作的安全。Jetpack 的 Security 開發(fā)庫 如今為 Android 6.0 以后的系統(tǒng)發(fā)布了 RC 版本(最新版本為 RC3),并且為 Android 5.0 以后的系統(tǒng)提供了 1.1.0 alpha 版本。

AppCompat 庫

AppCompat 庫提供了大量向前兼容的 UI 組件和系統(tǒng)功能,從 Material 主題到 Toolbar 等組件,再到深色主題。在 最新的發(fā)布 中,我們新增了 Lint 規(guī)則,這有利于開發(fā)者辨別哪些屬性來自于 AppCompat 以及哪些來自于系統(tǒng)框架,并保證您使用了正確的屬性。此外,我們還針對 AppCompat 中深色主題實現(xiàn)的穩(wěn)定性進(jìn)行了大量優(yōu)化。

Webkit 庫

Jetpack 的 Webkit 開發(fā)庫在 1.2.0 版本(最新版為 1.4.0-rc01) 中新增了一個強(qiáng)制使用深色主題顯示內(nèi)容的 API。使用這個 API 的時候,如果網(wǎng)站支持深色主題,WebView 會自動地使用深色主題渲染該站點。如果網(wǎng)站不支持深色主題,這個 API 會強(qiáng)制轉(zhuǎn)換其中的一些顏色。

Jetpack Compose — 全新的 Android UI 開發(fā)框架

Jetpack Compose 是全新的現(xiàn)代 Android UI 開發(fā)框架,目前發(fā)布了開發(fā)者預(yù)覽第二版。新版本添加了許多新功能,包括視圖組件的互通性、更多的 Material UI 組件、支持深色主題、新的 UI 測試和動畫 API、對于 ConstraintLayout 的支持、優(yōu)化狀態(tài)管理、集成可觀察的數(shù)據(jù)流和 RTL 支持。Android Studio 預(yù)覽現(xiàn)在是可交互的,并且還有很多編譯器方面的優(yōu)化。 您可以查閱我們的 Alpha 版本發(fā)布文章、深入詳解 Jetpack Compose 之 優(yōu)化 UI 構(gòu)建實現(xiàn)原理 等文章了解更多。

獲取更多的更新內(nèi)容,請觀看視頻: Jetpack Compose 更新速遞,歡迎大家嘗鮮這些新的更新并積極 向我們反饋

本文概括了 Jetpack 過去幾個月的更新。由于其包括了超過 90 個開發(fā)庫,我們知道想找到您所關(guān)心的內(nèi)容并非易事。為了幫助開發(fā)者,我們 重新設(shè)計了 Jetpack 網(wǎng)站,并且在大量更新之余新增了一個便捷的 API 選取器,可以幫助開發(fā)者更快捷的找到 Jetpack 中合適的開發(fā)庫來解決問題。

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

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

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