Android 8 总览
https://developer.android.google.cn/about/versions/oreo?hl=zh-cn
文章基于官方资料上提取
针对所有 API 级别的应用
后台执行限制
https://developer.android.google.cn/about/versions/oreo/android-8.0-changes?hl=zh-cn#back-all
Android 8.0 为提高电池续航时间而引入的变更之一是,当您的应用进入已缓存状态时,如果没有活动的组件,系统将解除应用具有的所有唤醒锁。
此外,为提高设备性能,系统会限制未在前台运行的应用的某些行为。具体而言:
- 现在,在后台运行的应用对后台服务的访问受到限制。
- 应用无法使用其清单注册大部分隐式广播(即,并非专门针对此应用的广播)。
为解除此限制需要使用前台服务。
Android 后台位置限制
为节约电池电量、保持良好的用户体验和确保系统健康运行,在运行 Android 8.0 的设备上使用后台应用时,降低了后台应用接收位置更新的频率。此行为变更会影响包括 Google Play 服务在内的所有接收位置更新的应用。
应用快捷键
https://developer.android.google.cn/about/versions/oreo/android-8.0-changes?hl=zh-cn#as
Android 8.0 对应用快捷方式做出了变更
语言区域和国际化
https://developer.android.google.cn/about/versions/oreo/android-8.0-changes?hl=zh-cn#lai
Android 7.0(API 级别 24)引入能指定默认类别语言区域的概念,但是某些 API 在本应使用默认 DISPLAY 类别语言区域时,仍然使用不带参数的通用 Locale.getDefault()
函数。现在,在 Android 8.0 中,以下函数使用 Locale.getDefault(Category.DISPLAY)
来代替 Locale.getDefault()
:
- Currency.getDisplayName()
- Currency.getSymbol()
- Locale.getDisplayScript()
提醒窗口
https://developer.android.google.cn/about/versions/oreo/android-8.0-changes?hl=zh-cn#all-aw
SYSTEM_ALERT_WINDOW
权限相关
输入和导航
https://developer.android.google.cn/about/versions/oreo/android-8.0-changes?hl=zh-cn#ian
网页表单自动填充
https://developer.android.google.cn/about/versions/oreo/android-8.0-changes?hl=zh-cn#wfa
现在,Android 自动填充框架提供对自动填充功能的内置支持,对于安装到运行 Android 8.0 的设备上的应用,与 WebView 对象相关的下列函数已经发生变化:
- WebSettings
- getSaveFormData() 函数现在返回 false。之前,此函数返回 true。
- 调用 setSaveFormData() 不再有任何效果。
- WebViewDatabase
- 调用 clearFormData() 不再有任何效果。
- hasFormData() 函数现在返回 false。之前,当表单包含数据时,此函数返回 true。
无障碍功能
现在,无障碍服务可识别应用的 TextView 对象内部的所有 ClickableSpan 实例。
https://developer.android.google.cn/about/versions/oreo/android-8.0-changes?hl=zh-cn#a11y
网络连接和 HTTP(S) 连接
8.0 变更
https://developer.android.google.cn/about/versions/oreo/android-8.0-changes?hl=zh-cn#networking-all
蓝牙
https://developer.android.google.cn/about/versions/oreo/android-8.0-changes?hl=zh-cn#bt
Android 8.0 对 ScanRecord.getBytes() 函数检索的数据长度做出变更
无缝连接
安全性
https://developer.android.google.cn/about/versions/oreo/android-8.0-changes?hl=zh-cn#security-all
隐私性
https://developer.android.google.cn/about/versions/oreo/android-8.0-changes?hl=zh-cn#privacy-all
记录未捕获的异常
联系人提供程序使用情况统计方法的变更
如果应用请求 READ_CONTACTS 权限,它们仍可以读取此数据。从 Android 8.0 开始,使用情况数据查询会返回近似值,而不是精确值。
https://developer.android.google.cn/reference/android/Manifest.permission?hl=zh-cn#cpu
集合的处理
现在,AbstractCollection.removeAll() 和 AbstractCollection.retainAll() 始终引发 NullPointerException;之前,当集合为空时不会引发 NullPointerException。此项变更使行为符合文档要求。
针对 Android 8.0 的应用
https://developer.android.google.cn/reference/android/Manifest.permission?hl=zh-cn#o-apps
提醒窗口
https://developer.android.google.cn/reference/android/Manifest.permission?hl=zh-cn#cwt
使用 SYSTEM_ALERT_WINDOW 权限的应用无法再使用以下窗口类型来在其他应用和系统窗口上方显示提醒窗口
内容变更通知
https://developer.android.google.cn/reference/android/Manifest.permission?hl=zh-cn#ccn
Android 8.0 更改了 ContentResolver.notifyChange() 和 registerContentObserver(Uri, boolean, ContentObserver) 在针对 Android 8.0 的应用中的行为方式。
安全性
如果您的应用的网络安全性配置选择退出对明文流量的支持,那么您的应用的 WebView 对象无法通过 HTTP 访问网站。每个 WebView 对象必须转而使用 HTTPS。
帐号访问和可检测性
https://developer.android.google.cn/reference/android/Manifest.permission?hl=zh-cn#aaad
除非身份验证器拥有用户帐号或用户授予访问权限,否则,应用将无法再访问用户帐号。仅拥有 GET_ACCOUNTS 权限尚不足以访问用户帐号。要获得帐号访问权限,应用应使用 AccountManager.newChooseAccountIntent() 或特定于身份验证器的函数。获得帐号访问权限后,应用可以调用 AccountManager.getAccounts() 来访问帐号。
隐私性
https://developer.android.google.cn/reference/android/Manifest.permission?hl=zh-cn#o-pri
权限
https://developer.android.google.cn/reference/android/Manifest.permission?hl=zh-cn#rmp
在 Android 8.0 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。
媒体
https://developer.android.google.cn/reference/android/Manifest.permission?hl=zh-cn#med
原生库
https://developer.android.google.cn/reference/android/Manifest.permission?hl=zh-cn#nl
类加载行为
https://developer.android.google.cn/reference/android/Manifest.permission?hl=zh-cn#o-cl
Android 8.0 检查确保类加载器在加载新类时不会违反运行时假设条件。不论类引用自 Java(来自 forName())、Dalvik 字节码还是 JNI,都会执行这些检查。平台不会拦截 Java 对 loadClass() 函数的直接调用,也不会检查此类调用的结果。此行为不应影响运行良好的类加载器的正常运行。
Android 8.0 功能和 API
https://developer.android.google.cn/about/versions/oreo/android-8.0?hl=zh-cn
用户体验
通知
https://developer.android.google.cn/about/versions/oreo/android-8.0?hl=zh-cn#notifications
- 通知渠道:Android 8.0 引入了通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别。
- 通知标志:Android 8.0 引入了对在应用启动器图标上显示通知标志的支持。通知标志可反映某个应用是否存在与其关联、并且用户尚未予以清除也未对其采取行动的通知。
自动填充框架
Android 8.0 通过引入自动填充框架,简化了登录和信用卡表单之类表单的填写工作。在用户选择接受自动填充之后,新老应用都可使用自动填充框架。
https://developer.android.google.cn/guide/topics/text/autofill?hl=zh-cn
画中画模式
Android 8.0 允许以画中画 (PIP) 模式启动操作组件。
https://developer.android.google.cn/about/versions/oreo/android-8.0?hl=zh-cn#opip
可下载字体
https://developer.android.google.cn/guide/topics/ui/look-and-feel/downloadable-fonts?hl=zh-cn
XML 中的字体
自动调整 TextView 的大小
Android 8.0 允许您根据 TextView 的大小自动设置文本展开或收缩的大小。
https://developer.android.google.cn/about/versions/oreo/android-8.0?hl=zh-cn#atv
自适应图标
https://developer.android.google.cn/about/versions/oreo/android-8.0?hl=zh-cn#ai
颜色管理
WebView API
https://developer.android.google.cn/about/versions/oreo/android-8.0?hl=zh-cn#wv
固定快捷方式和小部件
https://developer.android.google.cn/about/versions/oreo/android-8.0?hl=zh-cn#iapoas
最大屏幕纵横比
https://developer.android.google.cn/about/versions/oreo/android-8.0?hl=zh-cn#max-aspect-ratio
多显示器支持
https://developer.android.google.cn/reference/android/accounts/AccountManager?hl=zh-cn#mds
指针捕获
https://developer.android.google.cn/reference/android/accounts/AccountManager?hl=zh-cn#pc
应用类别
在适当的情况下,Android 8.0 允许每个应用声明其所属的类别。这些类别用于将应用呈现给用户的用途或功能类似的应用归类在一起,例如按流量消耗、电池消耗和存储消耗将应用归类。您可以在 清单标记中设置 android:appCategory 属性,定义应用的类别。
Android TV 启动器
https://developer.android.google.cn/reference/android/accounts/AccountManager?hl=zh-cn#tvlauncher
AnimatorSet
从 Android 8.0 开始,AnimatorSet API 现在支持寻道和倒播功能。
输入和导航
https://developer.android.google.cn/reference/android/accounts/AccountManager?hl=zh-cn#ian
系统
https://developer.android.google.cn/about/versions/oreo/android-8.0?hl=zh-cn#sys
新的 StrictMode 检测程序
Android 8.0 添加了三个新的 StrictMode 检测程序,帮助识别应用可能出现的错误:
- detectUnbufferedIo() 将检测您的应用何时读取或写入未缓冲的数据,这可能极大影响性能。
- detectContentUriWithoutPermission() 将检测您的应用在其外部启动 Activity 时何时意外忘记向其他应用授予权限。
- detectUntaggedSockets() 将检测您的应用何时使用网络流量,而不使用 setThreadStatsTag(int) 将流量标记用于调试目的。
缓存数据
Android 8.0 优化了缓存数据的导航和行为。现在,每个应用均获得一定的磁盘空间配额,用于存储 getCacheQuotaBytes(UUID) 返回的缓存数据。
内容提供程序分页
如需了解有关内容提供程序变更的详细信息,请参阅 ContentProvider 和 ContentProviderClient。
内容刷新请求
https://developer.android.google.cn/reference/android/accounts/AccountManager?hl=zh-cn#crr
现在,ContentProvider 和 ContentResolver 类均包含 refresh() 函数,这样,客户端可以更轻松地知道所请求的信息是否为最新信息。
JobScheduler 改进
https://developer.android.google.cn/reference/android/accounts/AccountManager?hl=zh-cn#jobscheduler
媒体增强功能
https://developer.android.google.cn/reference/android/accounts/AccountManager?hl=zh-cn#me
- VolumeShaper
- 音频焦点增强功能
- 媒体指标
- MediaPlayer
- 音频录制器
- 音频播放控制
- Google 智能助理的新音频使用类型
- 设备音频播放的变更
- 显式请求音频焦点
增强的媒体文件访问功能
https://developer.android.google.cn/about/versions/oreo/android-8.0?hl=zh-cn#imfa
连接
https://developer.android.google.cn/about/versions/oreo/android-8.0?hl=zh-cn#cs
蓝牙
Android 8.0 通过增加以下功能,增强了平台对蓝牙的支持:
支持 AVRCP 1.4 标准,该标准支持音乐库浏览。
支持蓝牙低功耗 (BLE) 5.0 标准。
将 Sony LDAC 编解码器集成到蓝牙堆叠中。
共享
https://developer.android.google.cn/reference/android/accounts/AccountManager?hl=zh-cn#sh
无障碍功能
https://developer.android.google.cn/reference/android/accounts/AccountManager?hl=zh-cn#a11y
安全性与隐私
https://developer.android.google.cn/reference/android/accounts/AccountManager?hl=zh-cn#sp
权限
Android 8.0 引入了多个与电话有关的新权限:
ANSWER_PHONE_CALLS
允许您的应用通过编程方式接听呼入电话。要在您的应用中处理呼入电话,您可以使用acceptRingingCall()
函数。READ_PHONE_NUMBERS
权限允许您的应用读取设备中存储的电话号码。
这些权限均被划分为危险类别,属于 PHONE
权限组。
新的帐号访问和 Discovery API
Android 8.0 添加了 addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
函数,其允许应用指定应接收帐号变更的帐号类型列表。
API 变更
AccountManager 提供六个新函数以帮助身份验证器管理哪些应用可以查看某个帐号:
Android 8.1 功能和 API
自动填充框架更新
https://developer.android.google.cn/about/versions/oreo/android-8.1?hl=zh-cn#autofill
通知
Android 8.1 针对通知做了以下更改:
- 现在,应用每秒只能发出一次通知提示音。超过此频率的提示音无法加入队列且会丢失。此项更改不会影响通知行为的其他方面,并且通知消息仍会正常发布。
- 低内存 Android 设备不支持 NotificationListenerService 和 ConditionProviderService,这些设备在调用 ActivityManager.isLowRamDevice() 时会返回 true。
EditText 更新
从 API 级别 27 开始,EditText.getText() 方法会返回 Editable;以前,它会返回 CharSequence。此项更改可向后兼容,因为 Editable 会实现 CharSequence。
Editable 接口提供重要的附加功能。例如,由于 Editable 还会实现 Spannable 接口,因此您可以对 EditText 实例中的内容应用标记。
程序化安全浏览操作
https://developer.android.google.cn/about/versions/oreo/android-8.1?hl=zh-cn#safebrowsing
通过使用 Safe Browsing API 的 WebView 实现,您的应用可以在 WebView 实例尝试转到 Google 已归类为已知威胁的网址时检测到该行为。WebView 默认会显示一个插页,以警告用户存在已知威胁。通过该界面,用户可以选择仍然加载网址或返回到上一个安全的页面。
视频缩略图提取器
https://developer.android.google.cn/about/versions/oreo/android-8.1?hl=zh-cn#video-thumbnail
MediaMetadataRetriever 类拥有一个新方法 getScaledFrameAtTime(),它能够在给定时间值附近找到一个帧,并返回一个与源帧具有相同宽高比的位图,但会对该位图进行缩放,使其能够嵌入具有特定宽高度的矩形。这对于从视频生成缩略图非常有用。
Shared memory API
https://developer.android.google.cn/about/versions/oreo/android-8.1?hl=zh-cn#sharedmemory
WallpaperColors API
Android 8.1(API 级别 27)支持动态壁纸向系统界面提供颜色信息。为此,您可以从位图、可绘制对象或使用三种手动选择的颜色创建 WallpaperColors 对象。您还可以检索该颜色信息。
https://developer.android.google.cn/about/versions/oreo/android-8.1?hl=zh-cn#wallpaper
指纹更新
FingerprintManager 类引入了以下错误代码:
FINGERPRINT_ERROR_LOCKOUT_PERMANENT - 用户尝试使用指纹读取器解锁设备的次数过多。
FINGERPRINT_ERROR_VENDOR - 发生了特定于供应商的指纹读取器错误。
加密更新
在 Conscrypt 中实现了新的算法。系统会优先使用 Conscrypt 实现,而不是现有的 Bouncy Castle 实现。新算法包括:
https://developer.android.google.cn/about/versions/oreo/android-8.1?hl=zh-cn#crypto