Android Jetpack 作为 Android 开发的关键支柱,目前它已经包含了 100 多个库、工具和指南,可帮助开发人员获得最佳的开发实践、减少样板代码,并编写跨 Android 版本和设备的可兼容运行的代码。
Google Play 中的大多数 App 都使用 Jetpack 构建应用,如今「前 1000 个应用程序中有超过 90% 使用 Jetpack。」
下面我们将介绍 Jetpack 三个主要领域的更新:
- Architecture Libraries 和相关指引
- 应用程序的性能优化
- 用户界面 Libraries 和相关指引
一、 Architecture Libraries
Architecture libraries 和 Components 是用于确保 App 具备健壮、可测试和可维护的能力。
Data Persistence
Room是 Android 推荐的数据库工具,它在 SQLite 之上提供了一个抽象层,从而提高了平台的可用性和安全性。
在 Room 2.4 中,Kotlin Symbol Processing(KSP) 得到了更稳定的支持,在我们的 Kotlin 代码基准测试中,「KSP 的速度比 KAPT 提高了 2 倍」,Room 2.4 还添加了对枚举和 RxJava3 的内置支持,并完全支持 Kotlin 1.6。
「Room 2.5 开始使用 Kotlin 完成重写」,未来将于 Kotlin 相关的改进同步进行,同时仍与以 Java 编写的版本二进制兼容,「通过 room-paging 还可以内置对 Paging 3.0 的支持」,该 artifact 允许 Room 查询返回 PagingSource
对象。
此外,「开发人员现在可以直接执行 JOIN 查询,而无需定义额外的数据结构,因为 Room 现在支持使用多映射」。
@Query("SELECT * FROM Artist
JOIN Song ON Artist.artistName =
Song.songArtistName")
fun getArtistToSongs(): Map<Artist, List<Song>>
另外,通过对 AutoMigrations
的相关更新简化了数据库迁移,并增加了对其他注释和属性的支持,而 @Database
注释上的新 AutoMigration
属性可用于声明要从哪些版本开始自动迁移,当 Room 需要执行有关表和列修改的信息时,可以使用 @AutoMigration
注释来指定输入。
Database(
version = MyDb.LATEST_VERSION,
autoMigrations = {
@AutoMigration(from = 1, to = 2,
spec = MyDb.MyMigration.class),
@AutoMigration(from = 2, to = 3)
}
)
public abstract class MyDb
extends RoomDatabase {
...
DataStore
DataStore库是一个强大的数据存储解决方案,可解决历史上 SharedPreferences
的大部分问题。
如果希望更好地了解 DateStore
,可以查看 Modern Android Development Skills: DataStore 中的一系列视频和文章,其中包括有关库的使用情况指导,将其与依赖注入一起使用,并如何从 SharedPreference
迁移到 Proto DataStore
。
增量数据获取
Paging 库允许开发者按需加载和显示数据,以改进网络和系统资源的消耗,应用程序数据可以在 RecyclerViews
或 Compose
懒列表中按需加载。
「Paging 3.1 为 Rx 和 Guava 集成提供了支持,这为 Paging 对 Kotlin 协程的使用提供了 Java 替代方案」。
此版本还使用新的返回类型 LoadResult.Invalid
, 它改进了对无效竞争条件的处理,以处理无效或陈旧的数据。
使用新的 onPagesPresented
和 addOnPagesUpdatedListener
API 还改进了对空页面的无操作加载的处理。
❝
要了解有关 Paging 3 的更多信息,请查看 Paging Basics Codelab。
❞
在应用使用 Navigation
Navigation库是一个用于在 App 中进行导航的框架。
「Navigation 组件现在通过新的navigation-compose成到 Jetpack Compose 中,它允许可组合函数用作于 App 的目标」。
Multiple Back Stacks 功能同样得到改进,这使得 Navigation 更容易记住状态,NavigationUI
现在会自动保存和恢复弹出目标的状态,「这意味着开发人员可以支持多个返回堆栈,而无需更改任何代码」。
NavHostFragment
增强了对大屏幕支持,在 AbstractListDetailFragment
中提供了双窗格布局的预构建, 此 Fragment 使用 SlidingPaneLayout
来管理列表窗格(由子类管理)和使用 NavHostFragment
的详细信息窗格。
所有 Navigation 工件都已在 Kotlin 中重写,并使用泛型改进了类的可空性 - 例如 NavType
子类。
二、 应用性能优化
使用性能库可以构建高性能 App 并确定优化目标以保持性能的高效,从而获得更好的用户体验。
改善启动时间
App 启动速度会对用户体验产生关键影响,尤其是在安装后立即使用应用程序的时候,所以为了改善首次启动的体验,我们创建了Baseline Profiles。
❝
Baseline Profiles 允许应用和库向 Android 运行时提供有关代码路径使用情况的metadata,它使用这些 metadata 来确定提前编译的优先级。
❞
「配置文件数据最终会汇总并作为 baseline.prof
文件放入应用程序的 APK 中,然后在安装时使用该文件对应用程序及其静态链接库代码进行部分预编译」,这可以让 App 加载速度更快,并减少用户首次与应用程序交互时的丢帧。
目前我们已经开始在 Google 中使用 Baseline Profiles,采用 Baseline Profiles 后,Play Store 应用在其搜索结果页面上的初始页面呈现时间减少了 40%, Baseline Profiles 也已添加到现在各个流行的库中,例如 Fragments
和 Compose
,它可以帮助 App 获取更好的用户体验。
❝
如果要创建自己的基线配置文件,需要使用Macrobenchmark。
❞
检测应用
Macrobenchmark 通过将 Jetpack 的基准测试覆盖范围扩展到更复杂的用例,包括应用启动和集成 UI 操作(例如滚动 RecyclerView 或运行动画),从而帮助开发人员更好地了解应用性能,Macrobenchmark 也可用于生成 Baseline Profiles。
❝
目前 Macrobenchmark 已经更新包括提高了测试速度,并具有几个新的实验功能。
❞
同时,它现在还支持使用 TraceSectionMetric
进行基于自定义跟踪的时序测量,这允许开发人员对特定代码部分进行基准测试,此外 AudioUnderrunMetric
现在可以检测音频缓冲区欠载,以帮助了解音频卡顿。
BaselineProfileRule
生成配置文件可以帮助运行时的优化,BaselineProfileRule
的工作方式与其他宏基准测试类似,在这些基准测试中,开发者将用户操作表示为 lambda 中的代码。
在下面的示例中,编译器应提前优化的冷启动:从 launcher 到 activity。
@ExperimentalBaselineProfilesApi
@RunWith(AndroidJUnit4::class)
class BaselineProfileGenerator {
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun startup() = baselineProfileRule.collectBaselineProfile(
packageName = "com.example.app"
) {
pressHome()
// This block defines the app's critical user journey. Here we are
// interested in optimizing for app startup, but you can also navigate
// and scroll through your most important UI.
startActivityAndWait()
}
}
❝
有关使用 Macrobenchmark 生成和使用 Baseline Profiles 的更多详细信息和完整指南,请查看 Android 开发人员网站上的 指南。
❞
避免 UI 卡顿 / Jank
新的JankStats库可帮助开发者跟踪和分析应用 UI 中的性能问题,包括有关丢弃的渲染帧的报告:“jank”。
JankStats 构建在现有的 Android 平台 API(FrameMetrics)之上,但可以使用兼容到 API 级别 16。
该库还提供了超出平台内置功能的其他功能:「帮助查明丢帧原因的方法、在报告中提供额外 UI 状态上下文以及可用于上传数据进行分析的报告回调」。
下面详细介绍一下 JankStats 的三个主要方面:
-
「识别 Jank:」 库使用内部方法来确定何时发生 jank,并使用该信息知发布 jank 报告,以便开发人员获得有关这些问题的信息帮助分析和修复问题。
-
「提供 UI 上下文:」 为了使 jank 报告更加有用,库还提供了一种机制来帮助跟踪 UI 和用户的当前状态。每当记录报告时都会提供此信息,以便开发人员不仅可以了解问题发生的时间,还可以了解用户当时正在做什么。这有助于识别应用程序中可以解决的问题区域,其中一些状态是由各种 Jetpack 库自动提供,但也鼓励开发人员提供自己的应用程序特定状态。
-
「报告结果:」 在每一帧中,JankStats 客户端都会通过侦听器收到有关该帧的信息的通知,包括该帧完成所用的时间、是否被视为卡顿以及该帧期间的 UI 上下文。
日志记录
Tracing 库通过 将跟踪事件写入系统缓冲区来启用应用程序性能分析,Tracing 1.1 支持在 API 级别 14 的非调试版本中进行分析,类似于在 API 级别 29 中添加的 <profileable>
清单标记。
三、 用户界面库和指南
我们对 UI 库进行了一些更改,以更好地支持大屏幕兼容、折叠和表情符号相关适配。
Jetpack Compose
Jetpack Compose 是 Android 用于构建原生 UI 的现代工具包,今天已达到 1.2 测试版,它添加了多项功能以支持更高级的用例,包括支持可下载字体、惰性布局和嵌套滚动互操作性。
❝
有关 Jetpack Compose 的更新可见:https://android-developers.googleblog.com/2022/05/whats-new-in-jetpack-compose.html 。
❞
了解窗口状态
新的WindowManager库通过提供一个支持 API14 的通用 API 界面,帮助开发人员调整他们的应用以支持多窗口环境和新的设备外形。
❝
初始版本针对可折叠设备用例,包括查询影响内容应如何显示的物理属性。
❞
Jetpack 的 SlidingPaneLayout
组件已更新为使用 WindowManager
的智能布局 API 来实现,从而避免将内容放置在被遮挡的区域,例如跨物理铰链。
拖放
新的DragAndDrop库支持接受来自其应用程序内部和外部的拖放数据,从而有助于新的外形尺寸和窗口模式下的用户
AppCompat
AppCompat 1.4 集成了 Emoji2 库,为 API 14 及更高级别的 AppCompat 支持的所有基于文本的视图带来了对新表情符号的默认支持。
Custom locale selection 现在是 API 14 的支持,该功能支持手动跨应用启动的区域设置的持久性,并通过服务元数据标志支持自动持久性,只需要告诉库同步加载语言环境并根据需要重新创建任何正在运行的 Activity。
❝
在 API33 及更高级别上,持久性由平台管理无需额外开销。
❞
四、其他关键更新
注解
Annotation 库公开了元数据,可帮助工具和其他开发人员更好地理解应用的代码。它提供了大家熟悉的注释,如 @NonNull
与 lint 检查配对,以提高代码的正确性和可用性。
Annotation 正在迁移到 Kotlin,因此现在使用 Kotlin 的开发人员将看到更合适的注解目标,包括 @file
。
添加了几个高度请求的 Annotation 以及相应的 lint 检查,这包括有关方法或函数覆盖的注释,以及@DeprecatedSinceApi
注释,它提供了 @RequiresApi
的推论并阻止使用超出特定 API 级别。
Github
现在 GitHub 中有100 多个项目 使用了基于 GitHub 的标准工作流程,以下模块可供开发人员贡献:
- Activity
- AppCompat
- Biometric
- Collection
- Compose Compiler
- Compose Runtime
- Core
- DataStore
- Fragment
- Lifecycle
- Navigation
- Paging
- Room
- WorkManager
❝
查看相关页面 可以了解有关我们如何处理拉取请求以及开始使用 Jetpack 库构建的更多信息。
❞
以上是对过去几个月 Jetpack 的所有变化的简要介绍,有关每个 Jetpack 库的更多详细信息,请查看 AndroidX 发行说明,使用 API 选择器快速查找相关库,并观看Google I/O 讲座 以了解更多亮点。
网友评论