Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

架构组件版本说明

本页提供有关架构组件版本的信息,其中包括已知问题、限制和一般建议。请先查看相应的说明,然后再使用架构组件。

您的反馈至关重要。请使用问题跟踪器报告问题,以便我们可以将您的反馈整合到最终版本中。

2018 年 12 月 6 日

Paging

发布了 Paging 2.1.0-rc01,该版本与 2.1.0-beta01 相比没有变化。

发布了 Navigation 1.0.0-alpha08。此版本包含重要的 API 更改,请参阅下面的“重要更改”部分。

新功能

  • 当目标标签与 NavigationUI 方法一起使用时,现在系统会自动将 android:label 中的 {argName} 实例替换为正确的参数 b/80267266
  • Navigation 现在依赖于 Support Library 28.0.0 b/120293333

重要更改

  • OnNavigatedListener 已重命名为 OnDestinationChangedListener b/118670572
  • OnDestinationChangedListener 现在也传递参数 Bundle aosp/837142
  • 已移除 app:clearTaskapp:launchDocument 属性及其关联的方法。使用 app:popUpTo 与图表的根目录从返回栈中移除所有目标。 b/119628354
  • ActivityNavigator.Extras 现在使用 Builder 模式,并添加了设置任何 Intent.FLAG_ACTIVITY_ 标记的功能 aosp/828140
  • NavController.onHandleDeepLink 已重命名为 handleDeepLink aosp/836063
  • 许多不适合子类化的类和方法(如 NavOptionsNavInflaterNavDeepLinkBuilderAppBarConfiguration)已设为 final aosp/835681
  • 已移除弃用的 NavHostFragment.setGraph() 方法 aosp/835684
  • 已移除弃用的 NavigationUI.navigateUp(DrawerLayout, NavController) 方法。 aosp/835684
  • Fragment 创建工作已移至 FragmentNavigator,从而可以更轻松地将 Fragment 创建工作委托给 FragmentFactoryb/119054429
  • NavGraphNavigator 的构造函数不再接受 Context aosp/835340
  • NavigatorProvider 现在是一个类,而不是一个接口。由 getNavigatorProvider() 返回的 NavigatorProvider 没有改变其功能。aosp/830660
  • 已移除 NavDestination.navigate(),改为在 Navigator 上调用 navigate()aosp/830663
  • Navigator 进行了重大重构,不再需要 OnNavigatorNavigatedListener,而是让 navigate 返回已导航到的 NavDestination
  • Navigator 实例不能再向 NavController 发送弹出事件。应考虑使用 OnBackPressedCallback 来拦截按下返回按钮的操作并调用 navController.popBackStack()aosp/833716

问题修复

  • 当目标是 <navigation> 元素时,popUpTo 现在可以一致地工作 b/116831650
  • 修复了在使用嵌套图表时导致出现 IllegalArgumentException 的一些错误 b/118713731 b/113611083 b/113346925 b/113305559
  • <activity> 目标的 dataPattern 属性现在将通过调用 toString() 来填充非字符串参数中的参数 b/120161365

Safe Args

  • Safe Args 支持可序列化对象,包括枚举值。枚举类型可以使用不带类名的枚举文字来设置默认值(例如 app:defaultValue="READ"b/111316353
  • Safe Args 支持所有受支持类型的数组 b/111487504
  • Safe Args 现在会忽略资源目录的子文件夹 b/117893516
  • Safe Args 会视情况添加 @Override 注解 b/117145301

2018 年 12 月 5 日

WorkManager

发布了 WorkManager 1.0.0-alpha12。此版本包含一些重要的 API 更改,请参阅下面的“重要 API 更改”部分。此版本很可能会作为我们的第一个测试版发布。alpha12 还包含大量的文档更新。

API 更改

  • 一个新软件工件 (work-rxjava2) 引入了 RxWorker。这是一个需要 Single<Payload>ListenableWorker
  • 由于即将弃用 Firebase JobDispatcher,因此已停止提供对它的支持。这意味着,当我们进入测试阶段时,work-firebase 软件工件将不再更新。我们将考虑在未来添加它的替代品。
  • Payload 组合到了 Result 中。Result 现在是一个“密封的类”,它有三个具体实现,您可以通过 Result.success()(或 Result.success(Data))、Result.failure()(或 Result.failure(Data))和 Result.retry() 获取这些实现。您的 ListenableFuture 现在的结果是 Result 而不是 PayloadWorker 没有用于输出 Data 的 getter 和 setter 方法。这是一项重要的更改。
  • 添加了 Constraints.Builder.setTriggerContentMaxDelay(long, TimeUnit)Constraints.Builder.setTriggerContentUpdateDelay(long, TimeUnit) 以及相应变体,以便更好地支持触发速度较慢的内容 URI。b/119919774
  • 添加了 WorkRequest.Builder.setBackoffCriteria(BackoffPolicy, Duration) 变体。此方法需要 API 26。
  • 添加了 Operation.await()ListenableFuture.await() Kotlin 扩展方法。
  • Operation.getException() 已重命名为 Operation.getThrowable()这是一项重要的更改。
  • ContentUriTriggers 类以及引用它的方法不再可供公共使用。这是一项重要的更改。
  • WorkManagerWorkContinuationOneTimeWorkRequest 中移除了 varargs 方法的剩余部分以简化 API。要解决任何编译问题,您可以使用 Arrays.asList(...) 封装现有的 varargs。我们仍然会包含每个方法的单参数版本。这是一项重要的更改。
  • 移除了 WorkContinuation.combine(OneTimeWorkRequest, *) 变体。它们之前呈现的 API 令人困惑,而现有的 combine 方法更容易理解。这是一项重要的更改。

问题修复

  • 现在,在恢复已终止的进程(任务已执行)时,版本低于 Marshmallow 的实现更加可靠。
  • 通过 observeForever 观察的 LiveData 会通过 WorkManager 进行跟踪。这是 Room 库修复的向后移植。b/74477406
  • 如果序列化对象超过其大小上限,Data.Builder.build() 现在会抛出异常。之前这种情况只发生在后台线程(您无法正确处理这种问题)。
  • 进一步区分了“停止”操作和“取消”操作,getWorkInfoById() 将在 ListenableWorker.onStopped() 期间返回具有 CANCELLED StateWorkInfo
  • ListenableWorker 中将 null Result 视为失败。b/120362353
  • 对运行 API 24 且有时抛出 IllegalArgumentException 的 Shield Tablets 进行了推测性修复。b/119484416

重要 API 更改

  • 由于即将弃用 Firebase JobDispatcher,因此已停止提供对它的支持。这意味着,当我们进入测试阶段时,work-firebase 软件工件将不再更新。我们将考虑在未来添加它的替代品。
  • Payload 组合到了 Result 中。Result 现在是一个“密封的类”,它有三个具体实现,您可以通过 Result.success()(或 Result.success(Data))、Result.failure()(或 Result.failure(Data))和 Result.retry() 获取这些实现。您的 ListenableFuture 现在的结果是 Result 而不是 PayloadWorker 没有用于输出 Data 的 getter 和 setter 方法。
  • 添加了 Operation.await()ListenableFuture.await() Kotlin 扩展方法。
  • Operation.getException() 已重命名为 Operation.getThrowable()
  • ContentUriTriggers 类以及引用它的方法不再可供公共使用。
  • WorkManagerWorkContinuationOneTimeWorkRequest 中移除了 varargs 方法的剩余部分以简化 API。要解决任何编译问题,您可以使用 Arrays.asList(...) 封装现有的 varargs。我们仍然会包含每个方法的单参数版本。
  • 移除了 WorkContinuation.combine(OneTimeWorkRequest, *) 变体。它们之前呈现的 API 令人困惑,而现有的 combine 方法更容易理解。

2018 年 12 月 4 日

Room

发布了 Room 2.1.0-alpha03,该版本支持协程,并修复了几个问题。

API 更改

  • @Fts3/@Fts4 中的 FTS tokenizer 现在接受字符串而不是枚举。这允许 Room 使用自定义分词器。内置分词器仍在 FtsOptions 中定义为字符串常量。b/119234881

新功能

  • 协程:DAO 方法现在可以是暂停函数。为了在 Room 中支持暂停函数,发布了一个新的软件工件,即 room-coroutinesb/69474692
  • 带有 @Insert@Delete@Update 注解的 DAO 方法现在支持 ListenableFuture 作为返回类型。b/119418331

问题修复

  • 修复了 Room 错误地尝试在 @EntityignoredColumns 属性中查找包含列的构造函数的问题。b/119830714
  • 修复了 Room 在其生成的实现中不将 DAO 方法参数标记为最终参数的问题。b/118015483
  • 修复了在报告包含特殊符号的查询出现错误时 Room 的处理器会崩溃的问题。b/119520136
  • 修复了 Room 拒绝其他各种 Collection 实现作为 IN 表达式的参数的问题。b/119884035
  • 修复了当永久观察导致 Room 不再发出新数据时从 Room 返回的 LiveData 会进行垃圾回收的错误。b/74477406
  • 更新了 RoomDatabase 的闭锁以减少锁争用。b/117900450

2018 年 11 月 8 日

WorkManager

发布了 WorkManager 1.0.0-alpha11。此版本包含多项更改,它们将使 API 在 beta 版本中变得稳定。此版本包含重要的 API 更改;请参阅下面的“重要 API 更改”部分。

API 更改

  • work-runtime-ktx 引入了一个新的 CoroutineWorker
  • WorkStatus 已重命名为 WorkInfo。所有对应的 getStatus 方法变体都已重命名为对应的 getWorkInfo 变体。这是一项重要的更改。
  • ListenableWorker.onStopped() 不再具有表示 WorkRequest 是否已取消的布尔值参数。 WorkManager 不再做出这种区分。这是一项重要的更改。
  • androidx.work.test 软件包已重命名为 androidx.work.testing 软件包。这是一项重要的更改。
  • Constraints 的 setter 不再是公共 API 的一部分。这是一项重要的更改。
  • WorkerParameters.getTriggeredContentUris()WorkerParameters.getTriggeredContentAuthorities() 之前会返回数组。现在,这些方法会返回集合。这是一项重要的更改。
  • ListenableWorker.onStartWork() 已重命名为 ListenableWorker.startWork()这是一项重要的更改。
  • WorkStatus 的构造函数不再是公共 API 的一部分。这是一项重要的更改。
  • Configuration.getMaxJobSchedulerID()Configuration.getMinJobSchedulerID() 已分别重命名为 Configuration.getMinJobSchedulerId()Configuration.getMaxJobSchedulerId()这是一项重要的更改。
  • 向公共 API 添加了大量的 @NonNull 注解,以改进 API 的工效设计。
  • 添加了 WorkManager.enqueueUniqueWork() API 以将唯一的 OneTimeWorkRequest 加入队列,而不必创建 WorkContinuation
  • WorkManager 上的 enqueuecancel 方法的所有变体现在都会返回一个新的 Operation 类型。这是一项重要的更改。
  • enqueue 的所有变体都不再接受 WorkRequest 的 varargs。这是一项重要的更改。请改用集合。您可以使用 Arrays.asList() 修改现有代码。我们这样做是为了缩减 API 表面和方法计数。
  • 在每个进程中尝试多次 initialize WorkManager 现在会导致出现 IllegalStateException这是一项重要的更改。

问题修复

  • work-runtime-ktx 软件工件中的 WorkRequest.Builder 现在使用 ListenableWorker。修复 b/117666259
  • 确保 PeriodicWork 的下次运行时间是将来的时间。修复 b/118204399
  • 移除了在应用启动时使用 WorkManager 所产生的潜在磁盘 I/O。修复 b/117796731
  • 修复了 WorkConstraintsTracker 中的竞争条件。修复 android-workmanager/issues/56

重要 API 更改

  • WorkStatus 已重命名为 WorkInfo。所有对应的 getStatus 方法变体都已重命名为对应的 getWorkInfo 变体。
  • ListenableWorker.onStopped() 不再具有表示 WorkRequest 是否已取消的布尔值参数。 WorkManager 不再做出这种区分。
  • androidx.work.test 软件包已重命名为 androidx.work.testing 软件包。
  • Constraints 的 setter 不再是公共 API 的一部分。
  • WorkerParameters.getTriggeredContentUris()WorkerParameters.getTriggeredContentAuthorities() 之前会返回数组。现在,这些方法会返回集合。
  • ListenableWorker.onStartWork() 已重命名为 ListenableWorker.startWork()
  • WorkStatus 的构造函数不再是公共 API 的一部分。
  • Configuration.getMaxJobSchedulerID()Configuration.getMinJobSchedulerID() 已分别重命名为 Configuration.getMinJobSchedulerId()Configuration.getMaxJobSchedulerId()
  • 针对 WorkManagerenqueuecancel 方法的所有变体现在都会返回一个新的 Operation 类型。
  • enqueue 的所有变体均不再接受 WorkRequest 的 varargs。
  • 在每个进程中尝试多次 initialize WorkManager 现在会导致出现 IllegalStateException

2018 年 11 月 1 日

Paging

发布了 Paging 2.1.0-beta01,该版本与 2.1.0-alpha01 相比没有变化。

2018 年 10 月 30 日

Room

发布了 Room 2.1.0-alpha02,该版本修复了几个问题,并引入了一项新功能。

新功能

  • @Relation 中添加了对引用 @DatabaseView 的支持。b/117680932

问题修复

  • 修复了在从 Rx 返回类型进行订阅和处理时 Room 会在主线程中执行磁盘 I/O 的问题。b/117201279
  • 修复了 Room 无法为 Kotlin 实体类中的字段找到合适的类型转换器的问题。b/111404868
  • 修复了 Room 会为包含没有参数的 Kotlin 默认方法的 DAO 接口实现生成错误代码的问题。b/117527454
  • 更新了 Room 的 SQLite 语法解析器,修复了会导致编译时间较长的性能问题。b/117401230

2018 年 10 月 29 日

发布了 Navigation 1.0.0-alpha07,该版本修复了一些问题,并进行了几项 API 更改。

新功能

重要更改

  • navigation-testing-ktx 模块已折叠放入 navigation-testing artifact,将不再发布。
  • navigation-testing 软件工件现在依赖于 Kotlin 标准库。API 已被更改以与 Kotlin 惯例更加一致,但您可以继续将其用于采用 Java 语言编写的测试。
  • 不再支持元数据清单注册的导航图表。 b/118355937
  • 操作不能再附加到 <activity> 目标。 aosp/785539

问题修复

  • 深层链接现在可以正确解析查询参数。 b/110057514
  • Activity 目标现在可以正确应用所有进入和退出动画。 b/117145284
  • 修复了使用自定义导航器时在配置更改后发生崩溃的问题。b/110763345

Safe Args

  • Safe args 现在固定依赖于 Android Gradle Plugin 3.2.1。 b/113167627
  • 现在可以为内部类生成方向。 b/117407555
  • 修复了与生成 <include> 图表的方向有关的问题。 b/116542123

2018 年 10 月 12 日

Paging

发布了 Paging 2.1.0-alpha01,该版本主要新增了两部分内容,一是为每个软件工件新增了页面丢弃和 KTX 扩展库,二是进行了另外几项 API 更改,并修复了一些问题。

API 更改

  • 添加了 PagedList.Config.Builder.setMaxSize(),用于限制在内存中加载的项数。
  • 添加了 androidx.paging.Config() 作为以下类的 Kotlin 替代方案:PagedList.Config.Builder
  • 添加了 androidx.paging.PagedList() 作为以下类的 Kotlin 替代方案:PagedList.Builder
  • 添加了 DataSourceFactory.toLiveData() 作为 LivePagedListBuilder 的 Kotlin 替代方案
  • 添加了 DataSourceFactory.toObservable()toFlowable() 作为 RxPagedListBuilder 的 Kotlin 替代方案
  • 添加了 AsyncPagedListDiffer.addPagedListListener(),用于监听何时交换 PagedList。b/111698609
  • 添加了用于传递新旧列表的 PagedListAdapter.onCurrentListChanged() 变体,弃用了以前的变体。
  • 添加了 PagedListAdapter/AsyncPagedListDiffer.submitList() 变体,这些变体在比较差异后接受额外的回调,该回调在显示 pagedlist 时触发。这样,您可以将 PagedList 交换与其他界面更新同步。b/73781068
  • 添加了 PagedList.getLoadedCount(),以告知您内存中有多少项。请注意,如果停用了占位符,则返回值会一律等于 .size()

问题修复

  • 修复了在重复使用列表的情况下比较差异时的竞争条件问题 b/111591017
  • 当索引无效时,PagedList.loadAround() 现在会抛出 IndexOutOfBoundsException。之前,它可能会发生崩溃,并抛出不明确的其他异常。
  • 修复了在初始负载大小极小且数据未更改时导致不再继续加载的问题 b/113122599

2018 年 10 月 11 日

WorkManager

发布了 WorkManager 1.0.0-alpha10,该版本支持开发者控制的异步工作。此版本包含重要的 API 更改,请参阅下面的“重要 API 更改”部分。

我们预计 WorkManager 正在进入其 alpha 版本期间的最后阶段。我们希望在测试版中使 API 变得稳定,因此请花一些时间在我们的问题跟踪器上提交反馈。

API 更改

  • 移除了所有之前的 deprecated 方法和类,尤其是默认的 Worker 构造函数。这是一项重要的 API 更改。
  • NonBlockingWorker 已重命名为 ListenableWorker,它现在是一个取消隐藏的公共类,随时可供使用。
    • 通过 ListenableWorker 可以访问一个在主线程上调用的抽象方法,即 ListenableFuture<Payload> onStartWork()。异步启动和处理工作由您负责执行。完成后,您应该适当地更新 ListenableFutureListenableFuture 的参考实现在 alpha02Futures 软件包中提供(请参阅下面的 WorkManager 部分)。
    • Worker 扩展了 ListenableWorker,它使用抽象的 Result doWork() 方法,仍然像以前那样运行。
    • 将一些方法和成员从 Worker 转移到了 ListenableWorker
    • 我们应该很快就会提供 ListenableWorker 的参考实现,这些实现使用 Kotlin 协程(发布稳定版本后)和 RxJava2。
  • 接口 WorkerFactory 和具体实现 DefaultWorkerFactory 已合并到一个名为 WorkerFactory 的抽象类中。该实现可确保,对于任何用户创建的 WorkerFactory 实例,调用默认的基于反射的行为是最后的尝试。这是一项重要的更改。
  • 移除了 WorkManager.synchronous()WorkContinuation.synchronous() 以及所有相关方法。添加了 ListenableFuture<Void> 作为 API 中许多方法的返回类型。这是一项重要的 API 更改。
    • 您现在可以使用 ListenableFuture 来同步获取和观察。例如,WorkManager.enqueue() 过去返回 void,而现在则返回 ListenableFuture<Void>。操作完成后,您可以调用 ListenableFuture.addListener(Runnable, Executor)ListenableFuture.get() 来运行代码。
    • 请注意,这些 ListenableFuture 不会告知您操作是成功还是失败,而只是告知您操作已完成。您仍需要关联 WorkManager 方法来获取这项信息。
    • 我们会忽略对这些对象的 cancel() 调用,因为它们令人困惑且难以推断(您是要取消操作本身还是取消操作的结果?)。这在 Future 的规定范围内。
    • 为了与同步的 getStatus* 方法保持对等,我们提供了 ListenableFuture 变体,并对返回 LiveData 的现有变体进行了重命名,明确地将“LiveData”作为名称的一部分(例如,getStatusesByIdLiveData(UUID))。这是一项重要的 API 更改。

问题修复

  • 修复了 alpha09 中关于重复的 androidx-annotations.pro 文件的已知问题。您可以通过从 Gradle 文件中删除 exclude 'META-INF/proguard/androidx-annotations.pro' 来移除之前的版本说明中的解决方法。
  • 添加了 ProGuard 配置以保留新的 Worker 构造函数。b/116296569
  • 修复了在对工作进行 REPLACE 处理后的竞争条件下潜在的 NullPointerException 问题。b/116253486b/116677275
  • WorkContinuation.combine() 现在接受一个或更多 WorkContinuation,而不是两个或更多。b/117266752

重要 API 更改

  • 移除了所有之前的 deprecated 方法和类,尤其是默认的 Worker 构造函数。
  • 接口 WorkerFactory 和具体实现 DefaultWorkerFactory 已合并到一个名为 WorkerFactory 的抽象类中。
  • 移除了 WorkManager.synchronous()WorkContinuation.synchronous()
  • WorkManager.getStatus*() 方法现在返回 ListenableFutureWorkManager.getStatus*LiveData() 返回 LiveData

Futures

发布了 Futures 1.0.0-alpha02

API 更改

  • 开发者现在可以将 ResolvableFutureAbstractResolvableFuture 用作 ListenableFuture 的轻量级具体实现。

2018 年 10 月 8 日

Room

发布了 Room 2.1.0-alpha01

新功能

  • FTS:Room 现在使用 FTS3 或 FTS4 映射表来支持实体。带有 @Entity 注解的类现在可以另外带有 @Fts3@Fts4 注解,以使用全文搜索映射表来声明类。用于进一步自定义的 FTS 选项可通过注解的方法获得。b/62356416
  • 视图:Room 现在支持使用 @DatabaseView 注解将类声明为存储的查询(也称为视图)。b/67033276
  • 自动值:Room 现在支持将 AutoValue 注解类声明为实体和 POJO。Room 注解 @PrimaryKey@ColumnInfo@Embedded@Relation 现在可以在自动值注解类的抽象方法中声明。请注意,这些注解还必须附带 @CopyAnnotations,这样 Room 才能正确解读它们。b/62408420
  • 额外的 Rx 返回类型支持:带有 @Insert@Delete@Update 注解的 DAO 方法现在支持 Rx 返回类型 CompletableSingle<T>Maybe<T>b/63317956
  • 不可变类型与 @Relation:Room 以前要求 @Relation 注解字段可设置,但现在它们可以是构造函数参数。
  • enableMultiInstanceInvalidation:是 RoomDatabase.Builder 中的一个新 API,可使用同一数据库文件在 RoomDatabase 的多个实例中启用失效。这种多实例失效机制也适用于多个进程。b/62334005
  • fallbackToDestructiveMigrationOnDowngrade:是 RoomDatabase.Builder 中的一个新 API,可在发生降级时自动重新创建数据库。b/110416954
  • ignoredColumns:是 @Entity 注解中的一个新 API,可用于按名称列出忽略的字段。对于忽略实体上继承的字段很有用。b/63522075

API/行为更改

  • RoomDatabase 中的 mCallbackmDatabase 现在 @Deprecated,将在 Room 的下一主要版本中移除。b/76109329

问题修复

  • 修复了 Room 无法从损坏的数据库正确恢复或在初始化期间出现错误迁移的两个问题。b/111504749b/111519144
  • 现在,Room 将在数据类中正确使用 Kotlin 的主要构造函数,这样就无需将字段声明为 varsb/105769985

2018 年 10 月 1 日

发布了 Room 2.0.0,该版本与 2.0.0-rc01 相比没有变化。发布了 Paging 2.0.0,该版本修复了一个问题。

Paging

问题修复

  • 修复了在使用 PositionalDataSource 和占位符的情况下进行非常快速的滚动时可能会发生崩溃的问题。b/114635383

2018 年 9 月 21 日

发布了 Lifecycle 2.0.0,与 2.0.0-rc01 相比,该版本修复了 ViewModel 中的一个问题。

Lifecycle

问题修复

  • 修复了错误地移除了构造函数的 ViewModel ProGuard 规则 b/112230489

2018 年 9 月 20 日

发布了 Navigation 1.0.0-alpha06,该版本修复了一些问题,并进行了几项 API 更改。

新功能

API 更改

  • 重要更改:导航器 navigate() 方法现在接受 Navigator.Extras 参数。
  • NavController 的 getGraph() 方法现在为 NonNull b/112243286

问题修复

  • 与来自各个目标的视图一起使用时,NavigationUI.setupWithNavController() 不再泄漏视图 b/111961977
  • 现在仅调用一次导航器 onSaveState() b/112627079

Safe Args

  • 导航目标 Directions 类现在会扩展其父级的 Directions 类(如果存在)b/79871405
  • Directions 和 Args 类现在具有实用的 toString() 实现 b/111843389

2018 年 9 月 19 日

WorkManager

发布了 WorkManager 1.0.0-alpha09,该版本修复了几个问题,对基础架构进行了更新,并进行了几项 API 更改。

已知问题

如果您遇到以下问题:“发现多个文件的路径与操作系统无关‘META-INF/proguard/androidx-annotations.pro’”,请在 Gradle 文件中添加以下内容来临时解决这个问题(同时我们将在 alpha10 中解决此问题):

    android {
        packagingOptions {
            exclude 'META-INF/proguard/androidx-annotations.pro'
        }
    }

问题修复

  • 添加了“100 个作业”错误所需的另一个修复程序。b/115560696
  • 针对由于竞争条件而导致的外键约束错误添加了一些修复程序。b/114705286
  • ConstraintTrackingWorker.onStopped(boolean) 调用委托给了底层 Workerb/114125093
  • 针对 Firebase JobDispatcher 强制采用正确的最小退避延迟。b/113304626
  • 改进了库的内部线程保证。
  • 更正了与 LiveData 内部重复数据删除有关的潜在问题。

API 更改

  • 您现在可以通过将 WorkerFactory 指定为 WorkManager.Configuration 的一部分,在运行时创建自己的 Worker 实例。后备出厂设置为 DefaultWorkerFactory,它与之前版本的 WorkManager 的行为相符。
    • WorkerNonBlockingWorker 的默认构造函数现在标记为已弃用。请使用新的构造函数 (Worker(Context, WorkerParameters)) 并调用 super(Context, WorkerParameters),我们将在未来版本的 WorkManager 中移除默认构造函数。
  • 我们在内部已开始使用新的 ListenableFuture 软件工件(没有 Guava 依赖项)。我们将在即将发布的版本中向 API 引入 ListenableFutures。此更改将支持最终取消隐藏 NonBlockingWorker
  • 添加了通过 TestDriver.setInitialDelayMet(UUID)TestDriver.setPeriodDelayMet(UUID)TestDriver 中触发定时工作的功能。b/113360060

重要更改

  • 已弃用默认的 WorkerNonBlockingWorker 构造函数。请尽快迁移到新的构造函数。我们将在未来版本中移除默认构造函数。

2018 年 8 月 27 日

WorkManager

发布了 WorkManager 1.0.0-alpha08,该版本修复了一些问题。

问题修复

  • 将 WorkManager 组件明确标记为无法感知直接启动,这样它们就不会在直接启动期间启动。将来,我们将提供可感知直接启动的 WorkManager 版本。b/112665532
  • 修复了重试的工作未运行的问题。b/112604021
  • 修复了未重复执行定期工作的问题(与上述问题相关)。b/112859683
  • 当应用进程已在运行时,遵循了退避策略。
  • 更正了 Data 中的异常错误消息,以指明限制为 10KB。
  • Configuration.setMaxSchedulerLimit(int) 的最大值减小到了 50,以补偿 JobScheduler 处理过程中的一些延迟。b/112817355

2018 年 8 月 16 日

WorkManager

发布了 WorkManager 1.0.0-alpha07,该版本修复了几个问题,并进行了几项细微的 API 更改。

问题修复

  • 修复了具有负限制的潜在 SQL 查询,该查询可能会返回无限数量的结果。
  • 已完成执行的工作现在可以正确取消其他调度程序中该工作的所有待处理副本。这会导致超出 JobScheduler 作业限制。b/111569265
  • 修复了 ConstraintTracker 中的 ConcurrentModificationExceptionb/112272753
  • Data.getBooleanArray(String)Data.getIntArray(String) 的返回类型注解更改为 @Nullable 而不是 @NonNullb/112275229

API 更改

  • Worker 现在扩展了一个新类 NonBlockingWorker。这不会影响任何当前的用法。将来,NonBlockingWorker 将成为自定义线程解决方案完全支持的实体。
  • Data.getBooleanArray(String)Data.getIntArray(String) 的返回类型注解更改为 @Nullable 而不是 @NonNullb/112275229
  • Kotlin 扩展程序:弃用了 Map.toWorkData() 而添加了顶级 workDataOf(vararg Pair<String, Any?>),以便与现有 API 更加一致。

2018 年 8 月 10 日

发布了 Navigation 1.0.0-alpha05,该版本修复了一些问题。

问题修复

  • 修复了导致返回栈行为不正确的错误。b/111907708
  • 修复了 Generated Args 类的 equals() 中的错误。b/111450897
  • 修复了 Safe Args 中的构建错误。b/109409713
  • 修复了从资源标识符到 java 名称的转换问题。b/111602491
  • 修复了 Safe Args 插件中有关为空性的错误消息。
  • 添加了缺少的为空性注解。

2018 年 8 月 6 日

AndroidX 版本的 Lifecycle、Room 和 Paging 发布了版本 2.0.0-rc01。与 2.0.0-beta01 相比,所有软件工件没有变化。

2018 年 8 月 1 日

WorkManager

发布了 WorkManager 1.0.0-alpha06,该版本修复了一些问题。

问题修复

2018 年 7 月 24 日

WorkManager

发布了 WorkManager 1.0.0-alpha05,该版本修复了一些重大问题并进行了一些日志记录更改。

API 更改

  • WorkManager.getInstance() 现在带有 @NonNull 而不是 @Nullable 注释。如果在手动初始化的情况下未正确初始化单一实例,则该方法将抛出 IllegalStateException这是一项重要的 API 更改。
  • 添加了一个新的 API,即 Configuration.Builder.setMinimumLoggingLevel(int),它可以控制 WorkManager 的详细程度。默认情况下,WorkManager 会记录 Log.INFO 及更高版本。
  • 更改了 Data.getString() 的签名,因此它不再采用默认值(隐式为 null)。这是一项重要的 API 更改。
  • 将需要的某些仅供内部使用的方法标记为 @hide。其中包括 Constraints 构造函数 Data.toByteArray()Data.fromByteArray(byte[])这是一项重要的 API 更改。

问题修复

  • 在已知的自动备份情况下,WorkManager 不再执行工作。这可能会导致出现崩溃。b/110564377
  • 修复了使用 JobScheduler 时的 PeriodicWorkRequest 双重调度问题。b/110798652
  • 修复了在设备低电耗模式后 PeriodicWorkRequest 无法正确执行的问题。b/111469837
  • 修复了使用 Firebase JobDispatcher 时初始延迟的问题。b/111141023
  • 修复了一些潜在的竞争条件和时间问题。
  • 正确释放了不再需要的 BroadcastReceiver
  • 优化了应用在强制关闭后重启时的重新调度性能。
  • 允许在将给定的 WorkRequest 加入队列之前或之后调用 TestScheduler.setAllConstraintsMet(UUID)b/111238024

重要更改

  • WorkManager.getInstance() 现在带有 @NonNull(而不是 @Nullable)注释。
  • 更改了 Data.getString() 的签名,因此它不再采用默认值(隐式为 null)。
  • 将需要的某些仅供内部使用的方法标记为 @hide。其中包括 Constraints 构造函数 Data.toByteArray()Data.fromByteArray(byte[])

2018 年 7 月 19 日

Navigation 1.0.0-alpha04 和关联的 Safe Args Gradle 插件包含多项 API 更改、行为更改和问题修复。

API/行为更改

  • NavHostFragment 会始终将当前的 Fragment 设置为主要导航 Fragment,从而确保在弹出外部 NavController 之前弹出子 Fragment 管理器 b/111345778

Safe Args

  • 重要更改app:type 已更改为 app:argType,以避免与其他库(如 ConstraintLayout 2.0.0-alpha1)发生冲突 b/111110548
  • 来自 Safe Args 的错误消息现在可供点击 b/111534438
  • Args 类现在确认 NonNull 属性实际上不是 null b/111451769
  • 向 NavDirections 和 Args 生成的类添加了额外的 NonNull 注解 b/111455455 b/111455456

问题修复

  • 修复了深层链接到 Fragment 目标后系统返回按钮的问题 b/111515685

2018 年 7 月 12 日

Navigation 1.0.0-alpha03 和关联的 Safe Args Gradle 插件包含多项 API 更改、行为更改和问题修复。

API/行为更改

  • 为工具栏添加了 NavigationUI.setupWithNavController 方法 b/109868820
  • 为 CollapsingToolbarLayout 添加了 NavigationUI.setupWithNavController 方法 b/110887183
  • 当返回栈为空或给定的目标 ID 不在返回栈中时,popBackStack() 现在返回 false b/110893637
  • FragmentNavigator 现在会在 FragmentManager 保存状态后忽略导航操作,从而避免出现“在 onSaveInstanceState 后无法执行此操作”异常 b/110987825

Safe Args

  • 重要更改:操作和参数名称中的非字母数字字符将替换为各自 NavDirections 方法名称中的驼峰式大小写格式
    • 例如,DemoController.index 将变为 setDemoControllerIndex b/79995048
    • 例如,action_show_settings 将变为 actionShowSettings b/79642240
  • 重要更改:默认情况下,现在将参数视为非 null。要允许字符串和 Parcelable 参数具有 null 值,请添加 app:nullable="true" b/79642307
  • 您现在可以采用“123L”的形式对 app:type="long" 与默认值使用 b/79563966
  • 现在支持 Parcelable 参数,并使用 app:type 的完全限定类名。支持的唯一一个默认值是 "@null" b/79563966
  • Args 类现在实现 equals()hashCode() b/79642246
  • Safe Args 插件现在可以应用于库项目 b/80036553
  • Safe Args 插件现在可以应用于功能项目 b/110011752

问题修复

  • 修复了在 Fragment 生命周期方法期间导航时出现的问题 b/109916080
  • 修复了在多次导航嵌套图表时出现的问题 b/110178671
  • 修复了在将 setPopUpTo 与图表中的第一个目标一起使用时出现的问题 b/109909461
  • 修复了将所有 app:defaultValue 值作为字符串传递的问题 b/110710788
  • 与 Android Gradle Plugin 3.2 Beta 01 捆绑在一起的 aapt2 现在为导航 XML 文件中的每个 android:name 属性添加了保留规则 b/79874119
  • 修复了在更换默认的 FragmentNavigator 时出现的内存泄漏问题 b/110900142

2018 年 7 月 2 日

AndroidX 版本的 Lifecycle、Room 和 Paging 发布了版本 2.0.0-beta01

Lifecycle

问题修复

  • 修复了 LifecycleObserver ProGuard 规则以仅保留实现而不保留子接口 b/71389427
  • 修复了 ViewModel ProGuard 规则以允许混淆和压缩

Room

API/行为更改

  • 添加了 RoomDatabase.Builder.setQueryExecutor() 以允许自定义查询运行位置
  • 添加了 RxJava2 Observable 支持
  • 生成的 DAO 和数据库实现现在是最终实现

问题修复

  • 在“找不到字段的 getter”错误中指定类/字段名称 b/73334503
  • 修复了 RoomOpenHelper 与较低版本的 Room 的向后兼容性问题 b/110197391

Paging

问题修复

  • 修复了在某些前置情况下(占位符已停用,PositionalDataSource)内容消失的问题 b/80149146
  • (在 1.0.1 中已发布)修复了导致 PagedListAdapterAsyncPagedListDiffer 无法发出移动事件信号的崩溃问题 b/110711937

2018 年 6 月 26 日

Paging

发布了 Paging 1.0.1,该版本修复了 runtime 过程中的一个错误。为了保持稳定性,我们强烈建议使用 1.0.1。还发布了 Paging RxJava2 1.0.1,它与 1.0.0-rc1 完全相同。

问题修复

  • 修复了导致 PagedListAdapterAsyncPagedListDiffer 无法发出移动事件信号的崩溃问题。b/110711937

WorkManager

发布了 WorkManager 1.0.0-alpha04

问题修复

  • 当使用基于 AlarmManager 的实现时,现在可以正确地重新调度 PeriodicWorkRequest

  • 修复了在强行停止或重新启动后重新调度所有 Worker 线程时出现的潜在 ANR 问题。b/110507716

  • 向各种 WorkManager API 添加了为空性注解。b/110344065

  • 记录在 Worker 线程执行期间发生的未捕获异常。b/109900862

  • 在您决定回滚到较低版本的 WorkManager 时,允许进行破坏性数据库迁移。b/74633270

  • 修复了在创建重复隐式标记时出现的迁移崩溃问题。这是一个很少见的问题,只有在您自己使用相同的隐式标记格式时才会发生。

2018 年 6 月 19 日

Room

发布了 Room 1.1.1。此版本与 Room 1.1.1-rc1 完全相同。

WorkManager

发布了 WorkManager 1.0.0-alpha03

问题修复

  • 修复了基于 AlarmManager 的实现中的竞争条件问题。b/80346526

  • 修复了在设备重新启动后使用 JobScheduler 时出现的重复作业问题。

  • 具有内容 URI 触发器的作业现在可以在系统重新启动后保留。b/80234744

  • 文档更新。b/109827628b/109758949b/80230748

  • 修复了在将 WorkRequest 重新加入队列时出现的崩溃问题。b/109572353

  • 修复了在使用 work-runtime-ktx 依赖项时出现的 Kotlin 编译器警告。

  • WorkManager 现在使用 Room 1.1.1-rc1

API 更改

  • 添加了 getStatusesSync(),即 WorkContinuation.getStatuses() 的同步版本。

  • Worker 能够区分用户发起的取消和操作系统请求的临时停止。如果已请求任何类型的停止,Worker.isStopped() 将返回 true。已显式取消 Worker 线程后,Worker.isCancelled() 将返回 trueb/79632247

  • 在 API 28 上添加了对 JobParameters#getNetwork() 的支持。这通过 Worker.getNetwork() 公开。

  • 添加了 Configuration.Builder.setMaxSchedulerLimit(int maxSchedulerLimit),这样便可强制规定可以将多少作业发送到 JobSchedulerAlarmManager。这有助于防止 WorkManager 占用所有可用的 JobScheduler 插槽。

  • 添加了 Configuration.setJobSchedulerJobIdRange(int minJobSchedulerId, int maxJobSchedulerId),它有助于定义 WorkManager 尽可放心使用的一系列 JobScheduler 作业 ID。b/79996760

  • Worker.getRunAttemptCount() 返回给定 Worker 的当前运行计数。b/79716516

  • 通过 WorkManager.enqueueUniquePeriodicWork(String uniqueWorkName, ExistingPeriodicWorkPolicy existingPeriodicWorkPolicy, PeriodicWorkRequest periodicWork),可以将唯一的 PeriodicWorkRequest 加入队列。b/79600647

  • WorkManager.cancelAllWork() 会取消所有 Worker。依赖于 WorkManager 的库可以使用 WorkManager.getLastCancelAllTimeMillis() 查询上次调用此方法的时间,以便对内部状态进行额外的清理。

  • 添加了 WorkManager.pruneWork() 以从内部数据库中移除完成的作业。b/79950952b/109710758

行为更改

  • 为所有 WorkRequest 添加了一个隐式标记,它是 Worker 的完全限定类名。这样便能够在没有 tag 的情况下或在 id 不可用时移除 WorkRequestb/109572351

重要更改

  • Worker.WorkerResult 重命名为 Worker.Result

  • Worker.onStopped 现在有一个额外的 isCancelled 参数,已显式取消 Worker 后,该参数将设置为 true

2018 年 6 月 7 日

发布了 Navigation 1.0.0-alpha02

行为更改

  • FragmentNavigator 现在使用 setReorderingAllowed(true)b/109826220

  • Navigation 现在对从深层链接网址解析的参数执行 URLDecode 操作。b/79982454

问题修复

  • 修复了在从 Fragment 生命周期方法调用 Navigation 时出现的 IllegalStateExceptionb/79632233

  • Navigation 现在依赖于 Support Library 27.1.1 来修复使用动画时的闪烁问题。b/80160903

  • 修复了在使用 defaultNavHost="true" 作为子 Fragment 时出现的 IllegalArgumentExceptionb/79656847

  • 修复了在使用 NavDeepLinkBuilder 时出现的 StackOverflowErrorb/109653065

  • 修复了在导航回嵌套图表时出现的 IllegalArgumentExceptionb/80453447

  • 修复了在使用 launchSingleTop 时 Fragment 重叠的问题。b/79407969

  • Navigation 现在可以为嵌套图表构建正确的合成返回栈。b/79734195

  • 当使用嵌套图表作为 MenuItem 时,NavigationUI 现在会突出显示正确的项。b/109675998

API 更改

  • 已弃用操作的 clearTask 属性以及 NavOptions 中的关联 API。b/80338878

  • 已弃用操作的 launchDocument 属性以及 NavOptions 中的关联 API。b/109806636

2018 年 5 月 24 日

发布了 WorkManager 1.0.0-alpha02

WorkManager

问题修复

  • 修复了在 State.isFinished() 时出现的 NullPointerExceptionb/79550068

  • 修复了导致在 Application.onCreate() 时重新调度 Worker 的问题。b/79660657

  • 修复了您可以调度的作业数超过操作系统允许的作业数的问题。b/79497378

  • 将与 Worker 关联的唤醒锁定的清理工作移到了后台线程。

  • 当所有待处理的作业完成时,AlarmManager 实现现在可以正确清理。

  • 修复了会影响非英语语言区域的清理 SQL 查询。b/80065360

  • Data 中添加了对 float 的支持。b/79443878

  • Data.Builder.putAll() 现在返回 Builder 的实例。b/79699162

  • 文档中介绍了更多 javadoc 和修复程序。b/79691663

API 更改

  • Worker 可以对停止做出响应。Worker.isStopped() 可用于检查 Worker 是否已停止。Worker.onStopped() 可用于执行轻量级清理操作。

  • Worker.getTags() API 将返回与 Worker 关联的标记 Set

  • 添加了 javax.time.Duration 过载,它接受时长和 TimeUnit 的组合。受 @RequiresApi(26) 保护。

  • WorkManager 扩展已从 androidx.work.ktx 软件包移至 androix.work 软件包。旧的扩展已弃用,将在以后的版本中移除。

  • Configuration.withExecutor() 已弃用。请改用 Configuration.setExecutor()

2018 年 5 月 16 日

发布了 Paging RxJava2 1.0.0-rc1 和 Room 1.1.1-rc1。如果您使用迁移功能,强烈建议您使用 Room 1.1.1-rc1 而不是 1.1.0

Room

修复了 Room 无法正确处理迁移后初始化的错误 b/79362399

Paging

Paging rxjava2 即将迁移到候选版本,该版本与初始 alpha 版本相比没有变化。

2018 年 5 月 8 日

Paging 1.0、Navigation 和 WorkManager alpha 版、Room 1.1 以及 AndroidX

发布了 Paging 1.0.0Room 1.1.0,以及两个新的架构组件(即 Navigation 和 WorkManager)的 alpha 版。

自最新发布的候选版本以来,Paging 和 Room 没有任何变化。

新库:Navigation

Navigation 可以提供用于构建应用内导航的框架。此初始版本为 1.0.0-alpha01

新库:WorkManager

WorkManager 可以简化有保证的约束感知型后台工作的调度和执行。此初始版本为 1.0.0-alpha01

AndroidX

架构组件正在成为 AndroidX 的一部分,包括更新的软件包名称、软件工件名称以及对其他 AndroidX 库的依赖关系。这些是在 2.0.0-alpha1 版本下发布的,可与其他 AndroidX 库结合使用。

Kotlin 扩展

ViewModel、ReactiveStreams 和 Sqlite(以前是 Room 的“数据库”组件)全部都添加了 Kotlin 扩展库(作为 AndroidX alpha 版本的一部分)。此外,Navigation 和 WorkManager 包括 -ktx 模块。其中每个扩展模块均可在添加组件中找到。

2018 年 5 月 2 日

  • Room 1.1.0 候选版本
  • 发布了 Room 1.1.0-rc1

问题修复

  • Room 现在与 Kotlin 1.2.40 兼容。b/78328708

2018 年 4 月 19 日

Paging 候选版本

发布了 Paging 1.0.0-rc1 和 Room 1.1.0-beta3

Paging

我们没有关于 Paging 1.0.0 版本的任何其他已知问题,也没有为其做新功能方面的安排。请升级您的项目以使用 1.0.0-rc1 并帮助我们对其进行严格的测试,以便我们可以推出稳定可靠的 1.0.0

此版本没有任何变化,它与 1.0.0-beta1 相同。

Room

问题修复

  • 修复了当 Kotlin POJO 引用用 Java 定义的关系实体时出现的编译错误 b/78199923

2018 年 4 月 5 日

发布了 Room 1.1.0-beta2、Paging 1.0.0-beta1 和 Paging RxJava 1.0.0-alpha1

在成为候选版本之前,Paging 将在测试阶段进行短时间的测试。我们不计划对 Paging 1.0 做出进一步的 API 更改,并且任何 API 更改的标准都非常高。

Alpha RxJava2 对 Paging 的支持作为一个单独的可选模块 (android.arch.paging:rxjava2:1.0.0-alpha1) 发布,并且将暂时单独版本化,直到它稳定为止。

此新库提供了 RxJava2 来替代 LivePagedListBuilder,能够构造 ObservableFlowable,接受 Scheduler 而不是 Executor

Observable<PagedList<Item>> pagedItems =
        RxPagedListBuilder(myDataSource, /* page size */ 50)
                .setFetchScheduler(myNetworkScheduler)
                .buildObservable();

Paging

新功能

  • 通过新的 android.arch.paging:rxjava2 软件工件添加了 RxPagedListBuilder

API 更改

  • 进行了 API 更改,以阐明执行器在构建器中的作用:

    • setBackgroundThreadExecutor() 重命名为 setFetchExecutor()(在 PagedList.BuilderLivePagedListBuilder 中)

    • setMainThreadExecutor() 重命名为 setNotifyExecutor()(在 PagedList.Builder 中)。

  • 修复了 PagedList.mCallbacks 成员,使其成为专用成员。

问题修复

  • LivePagedListBuilder 将在指定的执行器上而不是在架构组件 IO 线程池中触发初始 PagedList 加载。

  • 修复了内部 DataSource 封装容器(用于实现 DataSource.map 以及停用了占位符的 PositionalDataSource 加载)中的失效行为 b/77237534

Room

问题修复

  • 修复了 Room 的 Rx SingleMaybe 实现中的一个关键错误,该错误将提前回收查询,导致在向返回的 SingleMaybe 实例添加多个观察者时出现问题。 b/76031240

  • 如果在事务内调用 RoomDatabase.clearAllTables,它不会对数据库执行 VACUUM 操作。 b/77235565

2018 年 3 月 21 日

发布了 Room 1.1.0-beta1、Paging 1.0.0-alpha7 和 Lifecycles 1.1.1

Room

API 更改

问题修复

  • RoomDatabase.clearAllTables 现在通过设置 WAL 检查点和对数据库执行 VACUUM 操作,尝试将空间返还给操作系统。

  • @RawQuery 现在接受 observedEntities 属性的任何 Pojo,前提是该 Pojo 通过其 Embedded 字段或 Relation 引用一个或多个实体。 b/74041772

  • Paging:Room 的 DataSource 实现现在可以正确处理多表依赖项(如关系和连接)。以前,这些将无法触发新结果,或者可能无法编译。 b/74128314

Lifecycles

只有一项小小的更改:android.arch.core.util.Function 已从 arch:runtime 移至 arch:common。这样,便可以在没有运行时依赖项的情况下使用它,例如在下面的 paging:common 中。

lifecycle:commonlifecycle:runtime 的依赖项,所以此更改不会直接影响 lifecycle:runtime,而只会影响像 Paging 一样直接依赖于 lifecycle:common 的模块。

Paging

发布了 Paging 1.0.0-alpha7 以及 Lifecycles 1.1.1。由于 Paging alpha7 依赖于上述 Function 类的移动,因此您需要将 lifecycle:runtime 依赖项更新为 android.arch.lifecycle:runtime:1.1.1

在 Paging 进入测试阶段之前,计划将 Paging alpha7 作为最终版本。

API 更改

  • DataSource.LoadParams 对象现在具有一个公开构造函数,而 DataSource.LoadCallback 对象现在是抽象对象。这样,便可以封装 DataSource 或通过模拟回调直接测试 DataSourceb/72600421
  • DataSource 和 DataSource.Factory 的映射器
    • 通过 map(Function<IN,OUT>),可以转换、封装或修饰由 DataSource 加载的结果。
    • mapByPage(<List<IN>,List<OUT>>) 可以为批处理启用相同的功能(例如,如果从 SQL 加载的项需要另外查询一个单独的数据库,则可以采用批处理的方式完成该操作)。
  • 以便捷方法的形式添加了 PagedList#getDataSource() b/72611341
  • 所有已弃用的类都已从 API 中移除,包括 recyclerview.extensions 软件包的剩余内容和 LivePagedListProvider
  • DataSource.Factory 从接口更改为抽象类以启用映射功能。

问题修复

  • 已将构建器更改为最终版本。 b/70848565
  • Room DataSource 实现现已得到修复,能够处理多表查询 - 此修复包含在 Room 1.1.0-beta1 中,参见上文。
  • 修复了在启用占位符后且总大小为页面大小的整数倍时无法为 PositionalDataSource 调用 BoundaryCallback.onItemAtEndLoaded 的错误。

2018 年 3 月 2 日

发布了 Room 1.1.0-alpha3。这是计划的最后一个 Room 1.1.0 alpha 版本。

API 更改

  • InvalidationTrackeraddObserverremoveObserver 方法现已同步,并且需要在非界面线程上调用。这样可防止在观察表格时出现一些竞争条件。

  • RoomDatabase 类有了一个新的 clearAllTables() 方法,该方法可截断所有表格内容。 b/63807999

  • SupportSQLiteQuery 现在有一种 getArgCount() 方法,该方法可返回查询参数的数量。 b/67038952

问题修复

  • Paging 查询现在正确支持 @RawQueryb/72600425

  • 当两个或更多 Dao 接口是同一软件包中的内部类且具有相同的名称时,Room 现在可以正确命名生成的 Dao 类以避免名称冲突。 b/73536380

  • Pojo 中的通用字段类型正确解析为扩展类的成员。 b/73534868

  • 现在可以正确解析从依赖项软件工件继承的 Dao 接口中的查询参数。 b/68118746

  • @Relation 生成的查询现在可以正确转义字段名称。 b/70925483

2018 年 2 月 27 日

发布了 Paging 1.0.0-alpha6 以及 Support Library 27.1.0。 ListAdapter 和一些相关的类已从 Paging 库直接移至 Recyclerview,同时还重命名了一些类,以使某些类的功能更加清晰。此 Paging alpha 版本很可能是对 API 进行重要更改的最后一个版本。

API 更改

  • 已移至 recyclerview-v7 的类:
    • ListAdapter
  • 已重命名且移至 recyclerview-v7 的类:
    • ListAdapterHelper -> AsyncListDiffer
    • ListAdapterConfig -> AsyncDifferConfig
    • DiffCallback -> DiffUtil.ItemCallback
  • 在 paging-runtime 中已重命名的类:
    • PagedListAdapterHelper -> AsyncPagedListDiffer

移动的类与 RecyclerView 在一起很有用,独立于 Paging 库。这意味着,可以在不依赖于 Paging alpha 版本的情况下使用它们;但也意味着,使用 Paging 的应用必须同时升级到 Alpha 6 和 Support Library 27.1.0。

** Paging Alpha6 的迁移指南:**

  • 将 Paging 和 RecyclerView 依赖项更新为 android.arch.paging:runtime:1.0.0-alpha6com.android.support:recyclerview-v7:27.1.0
    • 这些必须同时完成,因为 ListAdapter 已从 Paging 移至 RecyclerView
  • ListAdapterHelper 的所有引用更新为 AsyncListDiffer
    • 已移除 getItem(index)/getItemCount(),取而代之的是调用更明确的 getCurrentList().getItem(index)getCurrentList().size() 的模式。
  • ListAdapterConfig 的所有引用更新为 AsyncDifferConfig
  • DiffCallback 的所有引用更新为 DiffUtil.IttemCallback
  • PagedListAdapterHelper 的所有引用更新为 AsyncPagedListDiffer
  • setList() 的引用更新为 submitList()
    • 进行了重命名,以阐明列表差异的异步性质

问题修复

  • 修复了停用占位符后将错误的初始位置传递给初始加载的问题。b/73513780

2018 年 2 月 15 日

发布了 Room 1.1.0-alpha2

新功能

  • Room 现在支持在预写日志模式下打开数据库。在这种模式下,您的写入将不再阻止您的读取查询。虽然消耗更多内存(由于存在多个连接),但是这种模式通常更快。默认情况下,如果设备是 API 16 或更高版本且不是低内存设备,则 Room 将使用 WAL。您可以使用 RoomDatabase.Builder 上的 setJournalMode() 方法控制此行为。 b/67757002

  • Guava 支持:Room 现在支持在 DAO 查询中返回 Guava Optional<T>ListenableFuture<T>。要使用 ListenableFuture<T>,您需要从 Room 导入 guava 软件工件 (android.arch.persistence.room:guava:1.1.0-alpha2)。

  • Room 现在支持从 DAO 查询返回 java.util.Optional<T>

  • DAO 类中的 @Transaction 方法现在支持具有默认实现的接口方法。这同时适用于 Java 8Kotlinb/72416735

问题修复

  • 如果存在可使用的其他构造函数,带有 @Relation 的构造函数不会导致编译错误。 b/72884434

  • 现在可以为失效跟踪器正确转义在 @Query 方法中使用 ' 转义的表格名称。 b/72366965

  • 在注解处理过程中,Room 现在使用 Kotlin @Metadata 注解读取类结构。这意味着,即使 Pojo 是从依赖项继承的,也可以正确读取其构造函数参数名称。 b/67181813

  • 修复了查找降级迁移路径的问题。 b/72153525

  • 从现有数据库迁移到 Room 时,现在可以正确处理非默认列类型。 b/71953987

  • Room 现在可以正确处理 Kotlin 类中的持久性 boolean? 字段。 b/72786402

2018 年 1 月 22 日

发布了 Lifecycle 1.1.0、Room 1.1.0-alpha1 和 Paging 1.0.0-alpha5

Lifecycle 1.1.0

打包更改

现在可使用小得多的新增依赖项:

  • android.arch.lifecycle:livedata:1.1.0
  • android.arch.lifecycle:viewmodel:1.1.0

API 更改

  • 已弃用的 LifecycleActivityLifecycleFragment已移除 - 请使用 FragmentActivityAppCompatActivity 或支持 Fragment
  • @NonNull 注解已添加到 ViewModelProvidersViewModelStores
  • ViewModelProviders 构造函数已弃用 - 请直接使用其静态方法
  • ViewModelProviders.DefaultFactory 已弃用 - 请使用 ViewModelProvider.AndroidViewModelFactory
  • 已添加 ViewModelProvider.AndroidViewModelFactory.getInstance(Application) 静态方法,用于检索适合创建 ViewModelAndroidViewModel 实例的静态 Factory

Room 1.1.0-alpha1

新功能

  • RawQuery:这一新 API 允许 @Dao 方法接收 SQL 作为查询参数 b/62103290b/71458963
  • fallBackToDestructiveMigrationsFrom:通过 RoomDatabase.Builder 中的这一新 API,可以更精细地控制允许从哪些起始架构版本进行破坏性迁移(与 fallbackToDestructiveMigration 相比)b/64989640
  • Room 现在仅支持较新的 Paging API (alpha-4+),不再支持已弃用的 LivePagedListProvider。要使用新的 Room alpha 版,您需要使用 Paging alpha-4 或更高版本,并从 LivePagedListProvider 切换到 LivePagedListBuilder(如果尚未切换)。

问题修复

  • 改进了对 Kotlin Kapt 类型的支持。b/69164099
  • 字段的顺序不再使架构无效。b/64290754

Paging 1.0.0-alpha5

问题修复

  • 修复了停用占位符后的页面加载问题 b/70573345
  • 添加了跟踪 IllegalArgumentException 错误的日志记录 b/70360195(以及推测性 Room 端修复)
  • 修复了 Javadoc 示例代码 b/70411933b/71467637

2017 年 12 月 11 日

发布了 Paging alpha4-1。这是 Paging alpha 4 的一个小错误修复版本。

问题修复

2017 年 12 月 7 日

发布了 Paging alpha4,该版本主要针对网络和网络 + 数据库用例进行了重要更改并添加了一些内容。

API 更改

  • DataSource 现在是一个异步 API,使直接从网络进行分页更容易:

    • 初始大小和数据的单一入口点
    • 通过暂挂回调并稍后分派来支持网络重试
    • 线程安全回调允许异步加载,以便在界面线程上创建单一网络支持的 PagedList
    • 与初始加载参数有关的错误行为更清晰
  • TiledDataSource 重命名为 PositionalDataSource 以反映其基于位置的索引,以及在停用占位符后不会平铺的事实。

  • 添加了 PageKeyedDataSource 以支持嵌入网络页面加载的下一个/上一个令牌。KeyedDataSource 重命名为 ItemKeyedDataSource 以区分清楚。

  • LivePagedListBuilderDataSource.Factory 取代了 LivePagedListProvider。LivePagedListBuilder 可提供相同的功能,但具有更多自定义项和更简单的默认值。DataSource.Factory 允许 DataSource 生成代码保持独立于 LiveData

  • 针对数据库 + 网络用例添加了 PagedList.BoundaryCallback

  • PagedList.Builder 构造函数接受 DataSource + PagedList.Config,现在更类似于 LivePagedListBuilder,并允许使用 Java 语言中的菱形操作符或 Kotlin 中的推断类型。

  • 添加了 PagedList.getConfig(),并且 PagedList.Config 现在具有公开成员属性。

  • KeyedDataSource.loadBefore() 不再要求反转结果。

  • 添加了 PagedListAdapter.onCurrentListChanged() 以监听显示 PagedList 时所基于的更新。

问题修复

  • 修复了 PagedListAdapter(Helper) 中的 IndexOutOfBoundsException b/67883658

1.0.0 - 2017 年 11 月 6 日

所有主要组件(Paging 除外)现在都是 1.0.0。除了对 reactivestreams 库进行了一项更改之外,此版本与 rc1 完全相同。

问题修复

候选版本 - 2017 年 10 月 18 日

所有主要软件工件(Paging 除外)现在都是 1.0.0-rc1

我们没有关于 1.0.0 版本的任何其他已知问题,也没有为其安排新功能。请升级您的项目以使用 1.0.0-rc1 并帮助我们对其进行严格的测试,以便我们可以推出稳定可靠的 1.0.0

行为更改

  • 在此版本中,当调用 onSaveInstanceState 时,现在会分派 Lifecycle.Event#ON_STOP(以前,只是将其标记为 CREATED 而不分派 ON_STOP)。您可以在 Lifecycles 文档中了解详情。

问题修复

  • Room:

    • Room 现在依赖于最新的 xerial 软件工件,该软件工件修复了编译期间的 OutOfMemory 问题。 b/62473121
    • Query 方法现在可以带有 @Transaction 注解。详情请参阅 @Transaction 的参考文档b/65112315
    • Room 中的 StringUtil 类已从公共 API 中移除(从未打算将其用作公共 API)。
  • Lifecycles:

    • 当小于 24 的 API 部分涵盖 Activity 时,LiveData 可以正常工作。 b/65665621

    • 现在可以正确调用父类中的 OnLifecycleEvent 方法;或者,如果无法调用,则会在编译期间输出警告。 b/63474615

    • Lifecycle 现在持有对其 LifecycleOwnerWeakReference,以免当 Lifecycle 留在内存中的时间比往常长时泄漏 LifecycleOwner(这只是一项预防措施,您还是应该小心,不要泄漏 Lifecycle)。

2017 年 10 月 9 日

发布了 Paging alpha-3,此次发布使其与 Lifecycles 和 Room 的 beta 2 版本兼容。

问题修复

  • 改进了 Paging 文档。

2017 年 10 月 5 日

所有主要软件工件(Paging 除外)现在都是 beta 2。此次没有发布新版本的 Paging。

问题修复

  • Lifecycles:

    • LiveData 未处于活跃状态时,LiveDataReactiveStreams 现在可以正确地从源发布者取消订阅。 b/62609183
    • 当父类来自另一个模块时,Lifecycle 事件会正确地传播到父类。 b/63474615
    • 当观察者在订阅创建期间取消订阅时,LiveData 会正确处理观察者。 b/66337741
    • 现在,依赖项树中提供了 Java 8 语言软件工件的 FullLifecycleObserverb/66525578

    • 对于 ProGuard,请将以下行添加到 ProGuard 文件。(当 1.0.0 正式推出时,不再需要执行此操作。)

      • -keep class * implements android.arch.lifecycle.GeneratedAdapter {<init>(...);}
  • Room:

    • @Query 方法中返回的 Pojo 的 @NonNull 字段与查询响应中的任何列都不匹配时,Room 现在会在编译时输出错误。如果该字段为 @Nullable,则 Room 仅输出警告。 b/67115337
    • Room 现在会验证较新操作系统版本中的索引。 b/63132683
    • 如果 Pojo 中存在多个匹配的构造函数,则 Room 默认情况下会选取无参构造函数。 b/67353427
    • 如果单列主键为 IntegerLong,则它们可以为 Nullableb/67086876
    • 失效跟踪器会在测试模式下正确处理重新输入。 b/65471397
    • Room 现在会在编译时检查列和表格名称中是否存在无效字符(无效字符:`")。 b/64749111

2017 年 9 月 21 日

在此版本中,所有架构组件模块都至少达到 beta 1(新的 Paging Library 除外,它是 alpha 2)。

我们不计划再进行任何 API 更改。可能会发生计划外更改,但在 1.0.0 稳定之前更改任何 API 的标准都非常高且不太可能发生。

  • 1.0.0 稳定之前,将移除 LifecycleActivity 和 LifecycleFragment。使用 Support Library 26.1.0 或更高版本时,不需要这些组件。

与 alpha 阶段不同,beta 阶段计划的持续时间非常短。

版本更改

  • Lifecycle Extensions 和 Room 现在是 beta 1
  • Paging 现在是 alpha 2
  • Lifecycles(runtime 和 common)与 Arch Core (common) 没有变化。自 9 月 13 日以来,这两个软件工件都是 1.0.0 版本。

新的软件工件

  • Lifecycles 现在有一个名为 common-java8 的新软件工件。该软件工件包含一个名为 DefaultLifecycleObserver 的新接口,它具有所有 Lifecycle 方法的默认实现。如果您使用的是 Java 8 语言,则应该优先使用此软件工件而不是注解。

    • 由于 beta1 中存在错误,因此您需要添加对 android.arch.lifecycle:common:1.0.1 模块的显式依赖性,才能使用新的 common-java8 软件工件。此问题将在 beta2 中修复。

打包更改

  • android.arch.persistence.room.db 已移至 android.arch.persistence.db
  • android.arch.persistence.room.db-impl 已移动且重命名为 android.arch.persistence.db-framework

这两个软件工件都已经依赖于 Room,所以除非您直接使用它们,否则应该不需要更改编译文件中的任何内容。

API 更改

  • Room:

    • @ColumnInfo 注解现在支持在列上设置排序规则。 b/62007004
    • 现在,默认情况下会忽略 transient 字段,除非它们带有 @ColumnInfo@Embedded@Relation 注解。 b/62600692
    • 主键必须带有 @NonNull 注解,除非它们是自动生成的。 b/64292391
      • 此更改可能需要架构迁移。对由此带来的不便,我们深表歉意。
    • 添加了一个方便的新注解 (@Transaction),该注解替换了 DAO 方法并在事务内运行它。
  • 支持 SQLite 数据库:

  • Paging:

    • 通过添加示例和线程注解改进了 Paging 文档。

问题修复

  • Room:
    • @Query 方法中的 Kotlin 多行字符串得到正确处理。 b/65809374
  • Paging:
    • Paging 软件工件不再依赖于 junit。 b/65690261

1.0.0 Alpha 9-1 - 2017 年 9 月 13 日

这是一个主要版本,其中 core lifecycle 软件工件(runtime 和 common)与 arch core (common) 已达到稳定版本 1.0.0

随着此更改,Support Library 26.1.0 现在依赖于这些库。AppCompatActivitySupport Fragment 现在都实现 LifecycleOwner 接口。

此版本还依赖于 Support Library 26.1.0 以利用新的集成。

新库:Paging

此版本还包括一个名为 Paging 的新库,使用该库可在必要时以区块的形式轻松地将大型数据集加载到 RecyclerView。发布的 Paging 版本为 alpha1,它将具有自己的发布周期。

API 更改

问题修复

  • 如果应用在类路径中具有相应的注解,则生成的类现在带有 @Generated 注解。 b/35754819

  • 修复了 MediatorLiveData 的观察者比较错误。 b/64413274

  • [LiveData] 现在支持 SQLite WITH 查询。[ref-LiveData] b/62510164

  • 修复了在观察到超过一个表格时 InvalidationTracker 无法发送正确列表的错误。b/65099281

  • 修复了 Room 在 Windows 系统上生成不同文件的错误。 b/64470691

  • 现在支持根目录软件包中的 LifecycleObserver。 b/62310817

1.0.0 Alpha 9 - 2017 年 8 月 16 日

问题修复

  • 修复了 LiveData 中的一个问题:在将第一个观察者从其 onChanged 方法中移除后会忽略第二个观察者b/64285805

1.0.0 Alpha 8 - 2017 年 8 月 1 日

行为更改

  • 为基元类型的列或带有 NonNull 注解的列添加了 NOT NULL 约束。这样会更改表格的结构,因此,如果您已在使用架构组件 alpha 7 或更低版本,那么要保留数据,则需要实现迁移,或者使用构建器中的 fallbackToDestructiveMigration() 方法。b/62007004

API 更改

1.0.0 Alpha 7 - 2017 年 7 月 26 日

问题修复

1.0.0 Alpha 6 - 2017 年 7 月 25 日

行为更改

  • LifecycleObserver 调用的顺序已更改。以前,总是按照观察者的添加顺序调用观察者:如果 observer1observer2 之前添加,则它将在 observer2 之前接收 ON_CREATE 以及其他所有事件。销毁事件不再是这种情况,对于此类事件,调用观察者的顺序与添加的顺序相反。所以,当前的行为是:如果 observer1observer2 之前添加,则 ON_CREATE 会先发送到 observer1,再发送到 observer2(对于 ON_STARTON_RESUME 同样如此),但 ON_PAUSE 事件会先发送到 observer2,之后才会发送到 observer1(对于 ON_STOPON_DESTROY 同样如此)。

  • 如果缺少迁移,则 Room 会抛出异常。以前,Room 只会清除数据库,但现在它会发生崩溃。开发者可以通过调用构建器 API 来选择清除行为。b/63872392

API 更改

  • fallbackToDestructiveMigration() 方法添加到了 RoomDatabase.Builder,用于在缺少迁移时清除数据库。b/63872392

  • 架构组件现在依赖于 Support Library 26.0.0

问题修复

1.0.0 Alpha 5 - 2017 年 7 月 18 日

API 更改

您需要依赖于 android.arch.persistence.room:rxjava2 软件工件来向 Room 添加 RxJava 支持。

问题修复

  • 修复了没有任何参数的 @Delete 查询问题。b/63608092

  • 修复了 getter 和 setter 的 Room 类型检查。b/63733651

1.0.0 Alpha 4 - 2017 年 7 月 11 日

API 更改

  • RoomDatabase 添加了一种新的便捷方法 (runInTransaction())。

  • @Insert@Delete@Update 方法现在可以具有来自不同实体类型的参数。b/62682405

问题修复

  • 修复了 @Dao 方法中的 byte[] 处理问题。b/62460045

  • Room 中的迁移检查现在使用不区分大小写的比较。b/62875382

  • 修复了 Lifecycles 软件工件的 ProGuard 配置。b/62113696

1.0.0 Alpha 3 - 2017 年 6 月 15 日

API 更改

  • @OnLifecycleEvent 现在仅支持 1 个事件参数。这是为 Java 8 支持做准备而进行的更改,以便我们将来可以迁移到具有默认方法的接口。关于此更改,只有带 @OnLifecycleEvent(ON_ANY) 注解的方法可以接收 Event 类型的第二个参数(第一个参数是 LifecycleOwner)。详情请参阅 Lifecycle 文档。

  • LifecycleActivityLifecycleFragment 类已移入 android.arch.lifecycle:extensions 软件工件。

  • MigrationTestHelper 接收插桩实例而不是 Context,从而能够从测试资源中读取架构,并在应用上下文中创建数据库。

  • Iterable 现在可以作为 @DAO 方法中的 @Insert@Delete@Update 注解的参数类型。b/62259820

问题修复

  • 不再多次调用具有生命周期事件的被覆盖方法。

  • 现在可以正确处理多个 IN 参数。b/62608681

  • 抽象 DAO 类现在可以具有接收 @Database 实例的构造函数。b/38488747

  • DAO 现在可以具有带类型参数的超类/接口。b/62103620

1.0.0 Alpha 2 - 2017 年 6 月 2 日

API 更改

问题修复

  • 为生命周期提供了 ProGuard 文件。(b/62113696)
  • 修复了类型转换器丢失数据的问题。(b/62100716)
  • 允许从 @Insert 查询返回 Long[]

1.0.0 Alpha 1 - 2017 年 5 月 17 日

MinSDK:14

一般建议

  • 虽然我们在发布之前进行了大量测试,但架构组件目前还是 alpha 版。如果您正在构建正式版应用,请注意,API 将在 1.0 版本之前发生更改,并且可能不完全稳健。如果您不愿调试所使用的库中的问题,我们建议您先在副项目中尝试使用架构组件。

  • 我们不建议所有人立即迁移。我们将为 1.0 版本的架构组件准备好迁移指南。

已知限制和问题