Android Jetpack 更新一览

image

作者 / 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 方法。在 FragmentFragmentActivity 中重写这个方法的现有代码仍然可以正常运行,但我们已经废弃了 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+ 上的集中存储,用于整合到全设备搜索中

△ 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

△ 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

您的应用中所有用户生成的内容都包含 🎉,而支持现代表情符号是使您的应用 ✨ 的关键!EmojiCompat 库在 API 19 和更高版本中支持现代表情符号,它已经转移到新的构件 :emoji2:emoji2,取代了以前的 :emoji:emoji 构件。新的 emoji2 库用 AppStartup 库增加了 🪄 自动配置功能 (您不需要添加任何代码 💻 来显示 🐼 ) !

AppCompat 从 AppCompat 1.4 开始增加了 emoji2。如果您的应用使用 AppCompat,用户将能看到现代的表情符号 ⭐,无需进一步配置。没有使用 AppCompat 的应用,可以添加 :emoji2:emoji2-views。对于自定义 TextViews,可以使用 :emoji2:emoji2-views-helpers 中的实用方法,或通过继承 AppCompat 视图来支持现代表情符号。

Jetpack Compose

Jetpack Compose 是用于在 Android 上构建原生 UI 的现代工具包,简化并加速了 Android 上的 UI 开发。Jetpack Compose 目前处于 Beta 版本,并计划 在 7 月份发布稳定版。本文提到的许多库,以及您可能已经在使用的其他库,都专门推出了与 Jetpack Compose 集成的功能。包括 Activity、ViewModel、Navigation 和 Hilt,所有这些库都可以帮助您在应用中更顺利地使用 Compose。请 观看 Google I/O 演讲 进一步了解相关细节。

不同设备类型

Jetpack 让您可以更轻松地针对不同形态的设备进行开发,包括可折叠设备、大屏幕设备和 Wear 设备。我们为大屏幕设备开发引入了新的规范,同时改进了 WindowManagerSlidingPaneLayout 等 Jetpack 库。请阅读 这篇博文 了解详情。

总结

以上便是 Jetpack 新内容的概览。请阅读 AndroidX 的 版本说明,以便了解每个库的所有更新细节,以及观看 Google I/O 演讲 了解其中一些库的详细信息。

如果您有任何反馈或问题,欢迎 向我们提交。您的问题有可能出现在下一期的 FAQ 中并获得解答。感谢您的支持!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容