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 库为 基于文件加密抽象层的使用提供了安全简便的方法,比如 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 中合适的开发库来解决问题。