Android Jetpack 更新一览

2022-03-09 14:36:13 浏览数 (1)

作者 / 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 对象一样使用它即可。

代码语言:javascript复制
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,以防止新代码意外采用不太灵活的做法。

代码语言:javascript复制
// 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 类。

代码语言:javascript复制
@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 服务找出将其展示给用户的最佳方式。

代码语言:javascript复制
// 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

您的应用中所有用户生成的内容都包含

0 人点赞