作者 / Florina Muntenescu, Android Developer Advocate
Android Jetpack 是一套库、工具和指导规范,帮助开发者遵循最佳实践,减少模板代码,以及编写在不同的 Android 版本和设备上运行一致的代码。今天,Google Play 上排名前 1,000 的应用中有 84% 在使用 Jetpack。
下面让我们一起看看 Jetpack 最新的更新情况,如果您已观看 Jetpack 更新一览 演讲的话,本文会做进一步的补充,请别错过!
稳定渠道更新一览
CameraX
CameraX 库为跨操作系统版本访问摄像头功能提供了统一的 API 界面,包括针对特定设备的兼容性修复和变通方案。该库的一些最新改进解决了常见的功能需求,包括支持调整曝光补偿和访问有关摄像头状态和功能的更详细信息。此外,现在可以在摄像头运行时通过 Camera2Interop 改变摄像头设置,如 FPS 范围。该库还带来了对最新设备和操作系统功能的支持,包括高动态范围 (HDR) 预览、变焦率控制,以及对 Android 勿扰模式的支持。但也许最重要的是,CameraX 库在持续解决性能问题,使图像捕捉和初始化速度更快,特别是在旧设备上。
Hilt
Hilt 是 Jetpack 推荐的建立在 Dagger 之上的依赖注入解决方案。作为向稳定版过渡的一部分,Hilt 的 ViewModel
支持已经上升到核心 Hilt Android API,SavedStateHandle
已经被添加为 ViewModelComponent
中的默认依赖。此外,Hilt 现在已经与 Navigation 和 Compose 集成: 您可以获得一个注释的 Hilt ViewModel,其作用范围是目的地或导航图本身。开发者已经开始在他们的应用中使用 Hilt,请通过 这篇博文 看看他们取得了哪些经验。
Paging 3.0
Paging 库让您可以加载和显示小块的数据以改善网络和系统资源的消耗。这个版本的特点是使用 Kotlin 完全重写,对协程和 Flow 有一流的支持,用 RxJava 和 Guava 原语进行异步加载,并对存储库和表现层进行了全面改进。
与 Paging 2 相比,3.0 版本在可用性方面有了很大的改进,重写时就考虑到了部分和分阶段迁移的问题,以便开发者可以按照自己的计划进行过渡。请查看 Paging 3.0 文档 和 Paging 3.0 codelab,以了解更多细节并上手实践。
ConstraintLayout 和 MotionLayout
ConstraintLayout (Jetpack 中用于设计布局的灵活系统) 和 MotionLayout (管理运动和 widget 动画的 API) 现在已经发布了稳定版。MotionLayout 现在支持可折叠设备、图像滤镜和动效。请 观看这场 Google I/O 演讲 了解更多关于设计工具的新内容。
Security Crypto
Security Crypto 库让您可以安全、轻松地加密文件和 SharedPreferences
。如果您想要加密 SharedPreferences
,请用适当的密钥和方案创建一个 EncryptedSharedPreferences
对象,然后像标准 SharedPreferences
对象一样使用它即可。
val prefs: SharedPreferences = EncryptedSharedPreferences.create(
context,
"prefs_file_name",
mainKey,
prefKeyEncryptionScheme = AES256_SIV,
prefValueEncryptionScheme = AES256_GCM,
)
// Use the resulting SharedPreferences object as usual.
prefs.edit()
.putBoolean("show_completed", true)
.apply()
Fragment
在过去的一年里,我们在 Fragment 库上着力甚多,对其内部实现进行了清理并减少了未记录的行为,使开发者更容易在他们的应用中遵循最佳实践,并编写可靠的测试。这为该库未来的改进奠定了基础,比如支持 Navigation 中的多个后退栈,这可能需要投入一些工作,来做到 API 合约的严格执行。具体来说,在更新库之后,请仔细关注您的测试。您可以查看 Fragment 的 发布说明,了解需要注意的具体案例。
Fragment 最近的版本还引入了 ActivityResult
集成,使得从 fragment 中注册 Activity
结果成为可能。Fragment 还添加了一个新的 FragmentOnAttachListener
接口,以取代不太灵活的 onAttachFragment
方法。在 Fragment
或 FragmentActivity
中重写这个方法的现有代码仍然可以正常运行,但我们已经废弃了 onAttachFragment
,以防止新代码意外采用不太灵活的做法。
// Obtain the fragment manager. May be a childFragmentManager,
// if in a fragment, to observe child attachment.
val fm = supportFragmentManager
val listener = FragmentOnAttachListener {
fragmentManager, fragment ->
// Respond to the fragment being attached.
}
fm.addFragmentOnAttachListener(listener)
Beta 渠道更新一览
开发库的功能一旦完成开发,就会进入 Beta 版本以保持稳定。在这之后,只有发现重大问题或基于社区反馈才会对 API 进行修改。
DataStore
DataStore 提供了稳健的数据存储解决方案,解决了 SharedPreferences 的缺陷,同时让 API 接口保持简单且高度可用。DataStore 带来了对最佳实践的支持,如 Kotlin 协程与 Flow 和 RxJava。DataStore 允许您通过 Preference DataStore 存储键值对,或者通过 Proto DataStore 存储 protobuff 格式的类型对象。您还可以 插入 自己的序列化解决方案,比如 Kotlin Serialization。
Alpha 渠道更新一览
Alpha 版本的库处于活跃的开发状态: API 可能会被添加、改变或删除,但库中的内容是经过测试的,一般来说具备高度的可用性。
AppSearch
AppSearch 是一个新的设备上搜索库,提供高性能且功能丰富的全文搜索功能。与 SQLite 相比,AppSearch 支持多种语言,简化了查询结果的排序,对大型数据集的索引和搜索也有更低的延迟。
AppSearch 1.0.0-alpha01 带来了 LocalStorage 支持,它允许您的应用管理结构化的数据,称为 "文档",然后对其进行查询。您的应用使用 "模式类型" 来定义结构。例如,您可以将一个消息 (Message) 建模为一个模式类型,其中包括主题、正文和发件人等数据。
使用构建器来创建模式类型的文件,然后将它们添加到存储中。查询 "body:fruit" 将检索所有在消息正文中带有 "fruit" 一词的文档。
在 Android S 中,AppSearch 还将提供 PlatformStorage,使得您可以与其他应用安全地共享您的应用里的数据,而且因为无需链接额外的原生库,您的应用的二进制尺寸也将更小。请注意目前在 Jetpack 中还不能使用 AppSearch,因为其尚未针对 Android S SDK 开发。
△ Android S 上的集中存储,用于整合到全设备搜索中
Room
Room 是我们推荐大家采用的数据持久层,在平台上提供更多的可用性和安全性。
Room 2.4.0-alpha 带来了对 自动迁移 的支持。当您的数据库模式发生变化时,您现在可以声明一个 @AutoMigration
,指出您想从哪个版本迁移到哪个版本,Room 就会为您生成迁移结果。对于更复杂的迁移,您仍然可以使用 Migration
类。
@Database(
- version = 1,
version = 2,
entities = { Doggos.class },
autoMigrations = {
@AutoMigration (from = 1, to = 2)
}
)
public abstract class DoggosDatabase extends RoomDatabase { }
Room 2.3.0 稳定版带来了对 Kotlin 符号处理 的实验性支持,在我们对 Kotlin 代码的基准测试中,其速度比 KAPT 提高了 2 倍,还带来了对枚举和 RxJava3 的内置支持。
Room 还引入了 QueryCallback 类,用于在执行 SQLite 语句时提供回调,以简化日志等任务。另外还加入了新的 @ProvidedTypeConverter
注释,让您在创建类型转换器时更加灵活。
WorkManager
WorkManager 库是 Android 推荐的安排可推迟的异步任务的方式,即使应用退出或设备重启也会运行。WorkManager 已经对任务调节的可靠性进行了改进,确保所有任务都被执行,并为特定的 Android OS 版本提供了各种解决方法。
WorkManager 的最新版本改进了 对多进程应用的支持,包括将工作请求调度统一到一个进程中的性能优势,以及在调度许多请求时限制数据库增长。
2.7 版现在处于 alpha 版本,针对 Android S SDK 开发,且适配平台新的前台限制。请观看 Android 上的有效后台任务 演讲了解更多细节。
Background Tasks Inspector 现已在 Android Studio Arctic Fox 中可用,在使用库的最新版本时您可以轻松查看和调试 WorkManager 作业:
△ Background Tasks Inspector
Navigation
Jetpack 的 Navigation 库是在应用中进行导航的框架,现在提供了对多个后退栈的支持,并简化了目的地位于相同深度的情况,如底部导航栏。
Macrobenchmark
Macrobenchmark 库将 Jetpack 的基准测试范围扩展到了应用启动和综合行为,如滚动性能。您可以远程使用该库来跟踪持续集成测试中的指标,或在本地配合 Android Studio 中的剖析结果来使用。请 观看 Google I/O 演讲 进一步了解相关细节。
对于那些想与 Google Assistant 更紧密集成的开发者来说,Google Shortcuts 库提供了一种方法,通过现有的 ShortcutInfo
类向 Google Assistant 和其他 Google 服务提供动作。
您可以通过 ShortcutManager 一次发送多达 15 个快捷方式,以显示在 Google Assistant 和其他服务中,使它们可用于语音和其他互动。
要实现这一点,您需要用一个 Intent
和一个能力绑定 (capability binding) 来定义一个快捷方式;这个绑定提供了语义上有意义的信息,这将帮助 Google 服务找出将其展示给用户的最佳方式。
// expose a "Cappuccino" action to Google Assistant and other services
ShortcutInfoCompat siCompat =
ShortcutInfoCompat.Builder(ctx, "id_cappuccino")
.setShortLabel("Cappuccino")
.setIntent(Intent(ctx, OrderCappuccino::class.java))
.addCapabilityBinding(
"actions.intent.ORDER_MENU_ITEM",
"menuItem.name",
asList("cappuccino")
)
.build()
ShortcutManagerCompat.pushDynamicShortcut(ctx, siCompat)
EmojiCompat
您的应用中所有用户生成的内容都包含