回顧 | Android Jetpack 重要更新

image

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 中使用數據庫檢查器

有了 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 的動畫。

△ 在動效編輯器中創建、編輯和預覽 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 庫

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

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 庫為 基于文件加密抽象層的使用提供了安全簡便的方法,比如 EncryptedFileEncryptedSharedPreferences。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 中合適的開發庫來解決問題。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,415評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,104評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,884評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,647評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,130評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,366評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,887評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,737評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,174評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,586評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,827評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,608評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,914評論 2 372

推薦閱讀更多精彩內容