支持库的最新修订版本

本页详细介绍了最近推出的支持库软件包版本。如需了解早期版本,请参阅支持库修订版本归档

修订版 28.0.0 正式版

(2018 年 9 月 21 日)

该版本是支持库 28.0.0 的稳定版,适合在生产环境中使用。这将是 android.support 包下的最后一次功能发布,建议开发者迁移到 AndroidX

新功能

  • AnimatedStateListDrawableCompat 可提供可绘制对象状态之间的动画转换。
  • VectorDrawableCompat 获得了对渐变以及 ColorStateList 填充和描边的支持。

修订版 28.0.0 RC 2

(2018 年 8 月 27 日)

此支持库候选版本被视为功能完备,而且其公共 API Surface 也稳定。除非出现任何严重问题,否则此版本将作为最终稳定版推出。此版本应可在生产环境中放心使用。如有任何问题,请向公开问题跟踪器报告。

修复的问题

  • Proguard 移除了视图模型应用构造函数(公开问题 112230489
  • 修复了 `AnimatedStateListDrawableCompat` 常量状态
  • 从 mediarouter 1.0.0 中移除了 media2 依赖项
  • 点击主屏幕按钮时,`Fragment.getViewLifecycleOwner()` 不会停止(公开问题 113070421)([公开问题 113070421](https://issuetracker.google.com/issues/113070421))

修订版 28.0.0 RC 1

(2018 年 8 月 6 日)

此支持库候选版本被视为功能完备,而且其公共 API Surface 也稳定。除非出现任何严重问题,否则此版本将作为最终稳定版推出。此版本应可在生产环境中放心使用。如有任何问题,请向公开问题跟踪器报告。

注意:某些库(如 media2)仍处于 Alpha 阶段,因为其 API Surface 尚未最终确定。我们不建议在生产环境中使用 Alpha 版库。库应严格避免在生产环境中依赖于 Alpha 版库,因为其 API Surface 可能会以与源代码和二进制文件不兼容的方式发生变化。

修复的问题

  • BottomNavigationView 菜单未在 Design 支持库中正确初始化
  • PositionalDataSource 无法正确处理向数据库中插入前置项的操作
  • 滑块卡顿且无响应
  • `SlicesProviderCompat.getPinnedSpecs()` 不会将用户 ID 添加到 URI
  • RoutePlayer2:远程播放不会切换回本地播放
  • 缓存的切片解析在执行操作时崩溃
  • Google 搜索应用在渲染静态切片时崩溃
  • 当数据集随着移除选择而发生更改时,RecyclerView Selection 库中出现 ConcurrentModificationException
  • PreferenceThemeOverlay 已更新为最新的素材主题背景。如果未提供自定义主题背景,则会将 PreferenceThemeOverlay 用作默认主题背景。
  • PreferenceThemeOverlay.v14 和 PreferenceThemeOverlay.v14.Material 主题背景已弃用,取而代之的是 PreferenceThemeOverlay。
  • PreferenceGroup 可见性现在与其子级相关联 - 如果隐藏父组,也会阻止其子级显示在层次结构中。使用 Preference.isShown() 可了解是否在层次结构中向用户实际显示了某项偏好设置。
  • Preference.onSetInitialValue (boolean, Object) 已弃用,取而代之的是 onSetInitialValue(Object)。此外,PreferenceDataStore 现在也可以正确恢复默认值。

修订版 28.0.0 Beta 版 1

(2018 年 7 月)

除非出现任何严重问题,否则此支持库测试版将被视为功能完备,而且其公共 API Surface 也稳定。虽然此版本可在生产环境中放心使用,但它可能仍有很多问题。如有任何问题,请向公开问题跟踪器报告。

修复的问题

  • 在不可选择的项上发生 GestureSelectionHelper 侵蚀事件
  • 更新滑块值时,滑块切片可能具有重复的拇指图标
  • IconCompat 破坏了 TYPE_URI 图标
  • 使用拖动条的偏好设置发生崩溃
  • Slice.toString() 中发生崩溃问题
  • OffsettingListUpdateCallback.onMoved() 会调用 mCallback.onRemoved(),而不是 mCallback.onMoved()(问题 110711937

修订版 27.1.1

(2018 年 4 月)

修复的问题

  • AsyncListDiffer 不调用 getChangePayload(AOSP 问题 73961809
  • 未调用 Fragment ViewModel 的 onCleared(AOSP 问题 74139250
  • 即使在适配器为 Null 时,RecyclerView.setRecycledViewPool() 也会增加 attachCount
  • SmoothScroller.onStop 调用 stop() 或 startSmoothScroller() 时会出现 RecyclerView NPE
  • Fragment 替换事务导致在显示新 Fragment 之后,之前的 Fragment 开始闪烁(AOSP 问题 74051124
  • 27.1.0 中的加载器回调重大变更(AOSP 问题 74135998
  • 在将垂直网格视图的列设置为 >1 时,RTL 布局不起作用
  • 在 ViewPager 中使用 FragmentPagerAdapter 多次调用 onLoadFinished
  • AsyncListDiffer 应该在设置当前列表之后发出更新(AOSP 问题 74003309
  • ShareActionProvider 在 27.1.0 中抛出 ClassCastException
  • Fragment 生命周期随 ViewPager 发生变化(AOSP 问题 73976255

修订版 28.0.0 Alpha 版 1

(2018 年 3 月)

注意:28.0.0-alpha1 是一个预发布版本,支持 Android P 开发者预览版。它的 API Surface 可能会发生更改,而且不一定包含最新稳定版支持库中的功能或问题修复。如需详细了解 Android P 开发者预览版,请参阅版本说明

重要变更

  • 正如之前在 Android KTX 公告中所述,我们将继续针对各个库采用 androidx 软件包前缀。我们在这个新软件包中着手推出一系列全新的库,包括 heifwriterrecyclerview-selection。我们希望 android.*androidx.* 之间的划分可以更清楚地体现与平台捆绑的 API,以及应用开发者用于不同 Android 版本的静态库。
  • 我们已将 support-core-ui、support-core-utils 和 support-compat 的一些部分拆分为更小的库。这一更改有助于我们将来摆脱对支持库的依赖。现在,我们推出了以下新库:
    • asynclayoutinflater(来自 support-core-ui)
    • collections(来自 support-compat)
    • coordinatorlayout(来自 design)
    • cursoradapter(来自 support-core-ui)
    • customview(来自 support-core-ui)
    • documentfile(来自 support-core-utils)
    • drawerlayout(来自 support-core-ui)
    • interpolator(来自 support-core-ui)
    • loader(来自 support-fragment 和 core-utils)
    • localbroadcastmanager(来自 support-core-utils)
    • print(来自 support-core-utils)
    • slidingpanelayout(来自 support-core-ui)
    • swiperefreshlayout(来自 support-core-ui)
    • viewpager(来自 support-core-ui)

新增的 API

  • recyclerview-selection 可以为 RecyclerView 提供内容选择支持。该软件包提供以下支持:
    • 支持创建、修改、检查和监控对 RecyclerView 列表中一组选定内容的更改。
    • 支持执行直观的多选操作:
      • 触摸驱动的选择支持用户通过直观的长按并拖动手势来选择内容范围。
      • 鼠标驱动的频段选择支持用户使用传统的鼠标指针频段/套索操作选择 RecyclerView 列表中的内容块。
    • 支持以触摸为中心的设备,包括手机和支持触摸的笔记本电脑,以及以鼠标指针为中心的设备。
  • HEIF Writer 提供对编写 HEIF 格式静态图片的支持。
  • Design 库
    • 我们推出了一个新的应用主题背景 Theme.MaterialComponents,它为组件提供了新的属性和更新样式。
    • 我们添加了以下组件:
      • BottomAppBar
      • Chip
      • ChipGroup
      • MaterialButton
      • MaterialCardView
  • 切片为应用提供了一个框架,可用于嵌入来自其他应用的模板化内容。
    • slices-builders 包含以模板格式构建内容的方法。
    • slices-view 包含呈现相应内容的方法。
  • 浏览器操作为应用开发者提供了一种协议,用于为网址启动一致(但可自定义)的上下文菜单。该功能取决于是否存在实现了对浏览器操作的支持的浏览器应用(例如,在 Chrome 浏览器中,该功能仍在开发中)。
  • ContextCompat.getSystemService()getSystemServiceName() 允许在所有 API 级别按类型查找系统服务。

问题修复

  • 未调用 Fragment ViewModel 的 onCleared(AOSP 问题 74139250
  • 在 ViewPager 中使用 FragmentPagerAdapter 多次调用 onLoadFinished()(AOSP 问题 74182171
  • 在某些情况下,RecyclerView 的 LinearLayoutManager 的 smoothScrollToPosition() 显示不稳定(来回)移动(AOSP 问题 71567765

修订版 27.1.0 版本

(2018 年 2 月)

重要变更

  • 加载器的底层实现已经重写,可以使用 Lifecycle。尽管 API 保持不变,但也存在一些行为变更:
    • initLoader()restartLoader()destroyLoader() 现在只能在主线程上调用。
    • 现在,在启动和停止包含的 FragmentActivity/Fragment 时,将分别调用加载器的 onStartLoading()onStopLoading()
    • onLoadFinished() 只会在 onStart()onStop 之间调用。因此,现在可以在 onLoadFinished() 中安全地处理 Fragment 事务。
    • 与加载器相关的 FragmentController 方法现已弃用。
  • 现在,在调用 onDestroyView() 之前,DialogFragment 的 getDialog() 将一直为非 Null,而不是在 dismiss() 中变为 Null。您现在可以通过检查 getDialog().isShowing() 是否返回 false 来确定是否在 onStop() 中手动关闭了对话框。

新增的 API

  • 借助用于 RecyclerViewListAdapter(以及 AsyncListDiffer),可以更轻松地在后台线程上计算列表差异。它们有助于您的 RecyclerView 动画内容自动变更,从而只需在界面线程中执行少量工作。在后台,它们使用的是 DiffUtil
  • SortedList.ReplaceAll 支持更新 SortedList 中的所有数据,它将为插入、移除、更改和移动(移动被视为移除和插入)运行所有适当的动画。
  • FragmentActivity 和 Fragment 现在实现 ViewModelStoreOwner,而且可以与 ViewModelProvider 构造函数搭配使用,作为使用 ViewModelProviders.of() 的替代方案。
  • Fragment 现在具有 requireContext()requireActivity()requireHost()requireFragmentManager() 方法,它们会返回等效 get 方法的 NonNull 对象或抛出 IllegalStateException
  • findViewById()@NonNull 兼容版本 requireViewById() 已添加到 WindowCompatActivityCompatViewCompat,它们会在找不到目标时抛出 IllegalArgumentException
  • LoaderCallbacks 方法现在具有适当的 @Nullable@NonNull 注释。
  • FileProvider 现在通过新的 <external-media-path> 元素支持在 API 21 及更高级别设备上使用 getExternalMediaDirs()

问题修复

  • 在 onCreate 中初始化加载器的 Fragment 破坏了 ViewPager 内的生命周期
  • LoaderManager 在 onLoadFinished 中抛出 IllegalStateException
  • LoaderViewModel 不在 onCleared 中清除其加载器
  • 找不到 android.arch.lifecycle.ViewModelStoreOwner 的类文件
  • DialogFragment onDismiss 没有在 dismiss() 之后立即调用
  • 在使用可下载字体时,国旗表情符号在发布密钥设备上不可用
  • Preference 库使用的属性不适用于旧版 Android
  • MediaCompat 的 testlib 工件类型记录有误(AOSP 问题 71559905
  • TypefaceCompatUtil 中发生 Google Sans 崩溃
  • 泄露 Collection 中需要的 ArraySet 构造函数
  • updateApi 会移除应该保留的 .ignore 文件
  • 在 BrowseFragment 中会创建冗余 MainFragment
  • 从 CarRecyclerView 中移除反射的使用
  • FragmentManagerImpl.checkStateLoss 处出现 java.lang.IllegalStateException
  • 在使用 android.support.v4.content.PermissionChecker.checkSelfPermission 时出现 java.lang.SecurityException(未记录)
  • 由于未在 setAdapter 中清除 State.mPreviousLayoutItemCount 而出现 RecyclerView IndexOutOfBoundsException(AOSP 问题 37657125
  • 在 onCreate 中初始化加载器的 Fragment 破坏了 ViewPager 内的生命周期(AOSP 问题 34831613
  • FragmentManagerImpl.execSingleAction 发生崩溃

修订版 27.0.2 版本

(2017 年 11 月)

问题修复

  • EmojiEditTextHelper 抛出 NullPointerException
  • IllegalStateException:尚未附加 Fragment。
  • 无法通过点按屏幕上的任意位置来关闭“投射”图标弹出窗口。
  • MediaMetadataCompat 抛出 BadParcelableException

修订版 27.0.1 版本

(2017 年 11 月)

问题修复

  • 在调用 startActivityForResult() 之后,LifecycleRegistry 状态有误。(问题 65665621
  • 对于较旧的 API 级别,停用按钮的颜色过浅。
  • 用户在滚动浏览后无法点击 RecyclerView 中的内容。(AOSP 问题 66996774
  • Talkback 中,点击更多选项不会导致系统公布新弹出窗口或将焦点添加到新选项。

修订版 27.0.0 版本

(2017 年 10 月)

API 差异

API 变更

  • 已将是否可为 null 的注释添加到各种 API,包括以下 API: 如果没有正确处理可以为 null 的返回类型,此变更可能会导致 Kotlin 编译错误。
  • Fragment 可以将 Transition 的支持库版本用于 Fragment 转换,包括共通元素转换。
  • Content Paging 库 (android.support.content.ContentPager) 提供对通过 ContentProvider 公开的分页内容的支持。使用此库可以让客户端避免在界面线程上进行代价高昂的进程间“光标窗口交换”,从而为 Android 8.0 功能提供兼容库。
  • ViewCompat 现在添加自动填充方法的封装容器,包括 getImportantForAutofill()isImportantForAutofill()setAutofillHints()setImportantForAutofill()
  • Leanback 获得了新功能和改进,并丢失了一些已弃用的类,例如:
    • Picker 现在可以使用 setSeparators() 方法在各个列之间使用不同的分隔符。
    • 添加了 DiffCallback,以允许 ArrayObjectAdapter 利用 DiffUtil 提供的输出。
    • 添加了基础架构以支持具有可变控件的媒体播放器,同时添加了用于执行快进、重复、随机播放、下一首、上一首和快退操作的可选控件。
    • 移除了 MediaControllerGlue、PlaybackControlGlue、PlaybackControlSupportGluePlaybackOverlayFragment
  • 为了进行测试,从 AOSP CTS 移植了 PollingCheck 实用程序。它会轮询将在超时时段内出现的条件。
  • 添加了基础架构,以使用 PermissionCompatDelegate 支持适用于 Android 5.0 的免安装应用上的运行时权限。
  • 现在支持可信的自定义标签页,而且能够定义应用和原始 URI 之间的关系。
  • 通过使用 AmbientMode 无头 Fragment 简化了 Android Wear 微光模式支持,这也使得支持微光模式与架构组件的使用相兼容。
  • Wear 团队希望就这一重大变更征询开发者的反馈。如需了解详情,请参阅 Android Wear 版本说明
  • 由于我们不再使用 V14 之前的旧版 API,因此移除了一些已弃用的类,例如 android.support.v7.NotificationCompat(改用 v4 NotificationCompat)、KeyEventCompatParallelExecutorCompat SearchViewCompat
  • 迁移的 Wear 清单元数据常量现在可以通过 android.support.wear.utils.MetadataConstants 获取。
  • 微光模式支持现在可用于所有 Activity,而不只是 WearableActivity。如需了解详情,请参阅 AmbientMode 参考文档。
  • RoundedDrawable 现在支持 XML 扩展。

问题修复

  • 应用在采用支持库 27 和可下载字体时发生崩溃
  • 可下载字体无法用于更新 SDK 后创建的新项目
  • SpeechRecognizer API 在最新升级中损坏
  • 移除动画视图后,在绘制期间发生与 Fragment 相关的崩溃
  • support-leanback-demos 媒体播放功能全部无法使用
  • Android 支持库会向清单添加 <meta-data>
  • FontResourcesParserCompat 应该了解 android: attrs
  • Leanback Glue 不支持暂停输入键
  • 当多个软件包共享同一工件 ID 时,IDE 中出现无法解析的符号
  • CarExtender 中出现 Null 指针异常
  • 创建 MediaController 之后,错误的随机播放/重复播放模式设置了 PlaybackState
  • 导航时,库集群默认海报运行到下一集群
  • 推荐卡片元数据被切断
  • RecyclerView.attachViewToParent() 出现 IllegalArgumentException
  • 在对 SavedState 进行数据编出时出现 ClassNotFoundException(AOSP 问题 37133281
  • 焦点卡在 RecyclerView 中
  • 修复了 Leanback LayoutManager 中的 ANR

修订版 26.1.0 版本

(2017 年 9 月)

这是一个特殊版本,可将支持库与架构组件Lifecycles 集成在一起。如果您未使用 Lifecycles 库,则无需从 26.0.2 更新。如需了解详情,请参阅架构组件版本说明

重要变更

修订版 26.0.2 版本

(2017 年 8 月)

问题修复

  • 菜单图标在支持库 26.0.0 上扁平化
  • GuidedAction.multilineDescription 无法在 Leanback 中正常运行

修订版 26.0.1 版本

(2017 年 8 月)

问题修复

  • FontCompat 26.0.0 在 O-MR1 设备上发生崩溃
  • 26.0.0 Design 支持库不应包含多 dex 支持(问题 63999442
  • 从 26.0.0 开始,AppBarLayout 现在具有 300px 的左内边距
  • PlaybackTransportControl 导航无法使用
  • 在 onCreate 完成之前的某个时间调用 Fragment.onCreateView
  • 在对 android.support.v4.media.MediaMetadataCompat 进行数据编出时出现 android.os.BadParcelableException: ClassNotFoundException

修订版 26.0.0 版本

(2017 年 7 月)

重要提示:支持库现在可以通过 Google 的 Maven 代码库获取。您无需从 SDK 管理器下载支持代码库。如需了解详情,请参阅支持库设置

重要变更

  • 最低 SDK 版本已提升至 14。因此,我们弃用了仅用于实现与 API 14 之前级别兼容性的许多 API。这些 API 的客户端应该迁移到其等效框架,正如每个弃用 API 对应的参考页面中所述。
  • Wear 界面库包含一些类,可以帮助您实现适用于 Wear 设备的图案和布局。如需了解详情,请参阅使用 Wear 界面库
  • Percent 支持模块已弃用。此模块的客户端应该迁移到新的 ConstraintLayout 微件,此微件作为 SDK 管理器中的单独工件提供。
  • android.support.v7.app.NotificationCompat 及其包含的类已弃用,并且将在未来的版本中移除:

新增的 API

  • RecyclerView 的新 fastScrollEnabled 布尔标记。如果启用,则必须设置 fastScrollHorizontalThumbDrawablefastScrollHorizontalTrackDrawablefastScrollVerticalThumbDrawablefastScrollVerticalTrackDrawable

API 差异

问题修复

  • RecyclerView.toString() 中出现无限循环
  • 升级到 Canary 6 之后,在 API 16 AVD 上运行 Kotlin 项目时出现 ResourceNotFoundException
  • 采用支持库 26.0.0-beta2 的设计视图中出现 java.lang.AssertionError
  • Android Studio 布局预览无法用于支持库微件
  • 如果 Preference 不是使用属性创建的,则会忽略 Preference.setSingleLineTitle()
  • 支持库 25.3.0/25.4.0 修订版的 DAC“开始时间”注释有误
  • ResourcesCompat.getFont() 抛出异常
  • 工具栏标题未以粗体显示
  • 使用 maxLines 自动调整大小会产生意外结果
  • TextView.checkForRelayout() 中出现 NullPointerException
  • AppCompatTextViewAutoSizeHelper.setRawTextSize() 在布局期间调用 requestLayout()
  • EmojiAppCompatTextView 崩溃
  • 当文本更改时,Autosize TextView 不会自动调整
  • Instacart 中出现屏幕损坏
  • MenuItemCompat 中出现 UnsupportedOperationException
  • NotificationCompat 无法完全提取对 API 24 或更高级别执行的操作
  • 布局更新时出现 CoordinatorLayout 锚定问题