Android 6.0(API 级别 23)除了提供诸多新特性和功能外,还包含各种 系统变更和 API 行为变更。本文档重点介绍了 您应该了解并在应用中加以考虑的一些重要变化。
如果您之前发布过 Android 应用,请注意, 都会影响您的应用
运行时权限
此版本引入了一种新的权限模型, 应用权限限制。通过该模型,用户可以更好地了解和控制 权限,同时为应用开发者简化安装和自动更新流程。 用户可以为已安装的应用单独授予或撤消权限。
对于以 Android 6.0(API 级别 23)或更高版本为目标平台的应用,请务必检查并请求
权限。要确定您的应用是否已获得某项权限,请调用
新checkSelfPermission()
方法。要请求权限,请调用新的
requestPermissions()
方法。即使您的应用并非以 Android 6.0(API 级别 23)为目标平台,您也应该在以下位置测试您的应用:
新的权限模型。
如需详细了解如何在应用中支持新权限模式,请参阅 <ph type="x-smartling-placeholder"></ph> 使用系统权限。如需了解如何评估这对应用的影响,请参阅以下提示: 请参阅权限使用说明。
低电耗模式和应用待机模式
此版本引入了针对空闲设备和应用的全新省电优化措施。这些 功能会影响所有应用,因此请务必在这些新模式下测试您的应用。
- 低电耗模式:如果用户拔下设备的电源线,使其保持静止状态并关闭屏幕, 一段时间后,设备会进入低电耗模式,在该模式下,设备会尝试保持系统 处于睡眠状态。在此模式下,设备会定期短时间恢复正常运行, 以便进行应用程序同步,并且系统可以执行任何待处理的操作。
- 应用待机模式:应用待机模式可让系统确定某个应用处于空闲状态 当用户没有主动使用它时触发。当用户未这样做时,系统便会做出此判定。 触摸应用一段时间。如果设备未接通电源,系统会停用网络 访问并暂停其视为空闲应用的同步和作业。
要详细了解这些节能方面的变化,请参阅 针对低电耗模式和应用待机模式进行优化。
取消支持 Apache HTTP 客户端
Android 6.0 版本取消了对 Apache HTTP 客户端的支持。如果您的应用使用此客户端
以 Android 2.3(API 级别 9)或更高版本为目标平台,请使用 HttpURLConnection
类
。此 API 更高效,因为它通过透明压缩来减少网络使用量
和响应缓存,并最大限度地降低功耗。要继续使用 Apache HTTP API
必须先在 build.gradle
文件中声明以下编译时依赖项:
android { useLibrary 'org.apache.http.legacy' }
BoringSSL
Android 正在从使用 OpenSSL
BoringSSL
库。如果您在应用中使用 Android NDK,请勿链接到加密库
不属于 NDK API 的一部分,例如 libcrypto.so
和 libssl.so
。这些
库不是公共 API,可能会在不同版本和设备上发生更改或出现问题,恕不另行通知。
此外,您可能还会面临安全漏洞的威胁。而应修改
通过 JNI 调用 Java 加密 API,或静态链接到
加密库。
硬件标识符访问权
为了向用户提供更完善的数据保护,从此版本开始,Android
移除对设备本地硬件标识符的编程访问权限,
使用 Wi-Fi 和 Bluetooth API 的应用。通过
WifiInfo.getMacAddress()
和
BluetoothAdapter.getAddress()
方法
现在会返回常量值 02:00:00:00:00:00
。
如需通过蓝牙和 WLAN 扫描获取附近外部设备的硬件标识符,请按以下步骤操作:
您的应用现在必须拥有 ACCESS_FINE_LOCATION
或
ACCESS_COARSE_LOCATION
权限:
注意:当搭载 Android 6.0(API 级别 23)的设备发起 后台 Wi-Fi 或蓝牙扫描,则相应操作对外部设备可见, 来自随机分配的 MAC 地址
通知
此版本移除了 Notification.setLatestEventInfo()
方法。使用
Notification.Builder
类来构造通知。要更新
请重复使用 Notification.Builder
实例。调用
build()
方法获取
已更新 Notification
个实例。
adb shell dumpsys notification
命令不再输出通知文本。
请改用 adb shell dumpsys notification --noredact
命令来输出文本
。
音频管理器变更
通过 AudioManager
直接设置音量或将特定音频流静音
类。setStreamSolo()
方法已弃用,您应调用
requestAudioFocus()
方法。同样,
setStreamMute()
方法是
已弃用;而是调用 adjustStreamVolume()
方法并传入方向值
ADJUST_MUTE
或
ADJUST_UNMUTE
。
文本选择
![显示浮动工具栏中的新文本选择功能的屏幕](https://developer.android.google.cn/static/images/android-6.0/text-selection.gif?authuser=9&hl=da)
当用户在您的应用中选择文本时,您现在可以显示文本选择操作,例如 剪切、复制和粘贴到 浮动工具栏。用户互动的实现与上述方法类似 关联操作栏,如 <ph type="x-smartling-placeholder"></ph> 为单个视图启用关联操作模式。
要实现用于文本选择的浮动工具栏,请在现有的 应用:
- 在
View
或Activity
对象中,将ActionMode
通电话,来自: 从startActionMode(Callback)
更改为startActionMode(Callback, ActionMode.TYPE_FLOATING)
。 - 采用您现有的
ActionMode.Callback
实现进行扩展ActionMode.Callback2
。 - 替换
onGetContentRect()
方法提供内容Rect
对象的坐标 (例如文本选择矩形)。 - 如果矩形的定位不再有效,并且这是唯一需要失效的元素,
调用
invalidateContentRect()
方法。
如果您使用的是
Android 支持库修订版 22.2 中所述,浮动工具栏不支持
appcompat 支持向后兼容的 ActionMode
对象
默认值。这会阻止显示浮动工具栏。启用
ActionMode
支持
AppCompatActivity
,通话
getDelegate()
,然后致电
已退货,金额为 setHandleNativeActionModesEnabled()
AppCompatDelegate
对象,并设置输入
参数设置为 false
。此调用会将 ActionMode
对象的控制权交还给
框架。在搭载 Android 6.0(API 级别 23)的设备上,框架可支持
ActionBar
或悬浮工具栏模式(在设备上运行时)
Android 5.1(API 级别 22)或更低版本,则只有 ActionBar
模式
支持。
浏览器书签变更
此版本取消了对全局书签的支持。通过
android.provider.Browser.getAllBookmarks()
和android.provider.Browser.saveBookmark()
方法现已移除。同样,READ_HISTORY_BOOKMARKS
和 WRITE_HISTORY_BOOKMARKS
权限。如果您的应用以 Android 6.0(API 级别 23)或更高版本为目标平台,则请勿
或使用书签权限。相反,您的应用应存储
并在内部为数据添加书签。
Android 密钥库变更
在此版本中, Android 密钥库提供程序不再支持 DSA。但仍支持 ECDSA。
在安全锁定屏幕时,系统不会再删除不需要静态加密的密钥 被用户或设备管理员停用或重置。需要 静态加密数据将被删除。
WLAN 和网络连接变更
此版本对 WLAN API 和 Networking API 引入了以下行为变更。
- 您的应用现在只能更改
WifiConfiguration
对象的状态 如果这些对象是由您创建的您无权修改或删除 由用户或其他应用创建的WifiConfiguration
对象。 -
以前,如果应用使用
enableNetwork()
替换为disableAllOthers=true
设置,说明设备已断开与其他网络(例如 移动数据网络。在此版本中,设备不再断开与此类其他网络的连接。如果 您应用的targetSdkVersion
为“20”
或更低,它会固定到所选 WLAN 网络。如果您的应用的targetSdkVersion
为“21”
或更高,请使用 多网络 API(例如openConnection()
,bindSocket()
,以及新的bindProcessToNetwork()
方法),以确保其网络流量通过所选网络发送。
相机服务变更
在此版本中,用于访问相机服务中共享资源的模型已更改 从之前的“先到先得”访问模式转变为高优先级访问模式, 优先流程对服务行为的变更包括:
- 允许访问相机子系统资源,包括打开和配置相机设备 根据客户端应用进程的“优先级”颁发奖项。应用进程 用户可见的 activity 或前台 activity 通常被赋予较高的优先级,使得相机资源 和使用更可靠的用户。
- 当优先级较高时,系统可能会“驱逐”当前用于低优先级应用的相机客户端
应用尝试使用相机。在已废弃的
Camera
API 中, 这会导致onError()
个 为被逐出的客户端调用的。在Camera2
API 中,这会导致onDisconnected()
调用该方法。 - 在配备相应相机硬件的设备上,单独的应用进程能够 独立打开并同时使用单独的摄像头设备。不过,多进程使用 同时访问会导致性能或能力显著下降的情况 任何打开的摄像头设备现在被摄像头服务检测到并禁止。此更改 可能会导致优先级较低的客户端被“驱逐”,即使其他应用 同一摄像头设备。
- 更改当前用户会导致在以前的用户账号拥有的应用中处于活跃状态的相机客户端 才会被逐出只有当前设备用户拥有的用户个人资料才能访问摄像头。 例如,在实际操作中,这意味着“访客”账号无法保持运行状态 在用户切换到其他账号后使用相机子系统的进程。
运行时
现在,ART 运行时可正确实现
newInstance()
方法结合使用。这个
更改修复了在以前的版本中 Dalvik 无法正确检查访问规则的问题。
如果您的应用使用
newInstance()
方法和您
要覆盖访问权限检查,请调用
setAccessible()
方法
参数设为 true
。如果您的应用使用
v7 appcompat 库或
v7 recyclerview 库、
您必须更新应用才能使用这些库的最新版本。否则,请确保
从 XML 引用的任何自定义类都会更新,以便可以访问其类构造函数。
此版本更新了动态链接器的行为。动态链接器现在能够理解
库的 soname
与其路径之间的区别
(
公开错误 6670),按 soname
进行搜索现在已变为
。之前正常运行但 DT_NEEDED
条目有误的应用
(通常是构建机器文件系统上的绝对路径)在加载时可能会失败。
dlopen(3) RTLD_LOCAL
标志现已正确实现。请注意,
RTLD_LOCAL
是默认值,因此未明确使用 dlopen(3)
的调用
RTLD_LOCAL
将受到影响(除非您的应用明确使用 RTLD_GLOBAL
)。包含
RTLD_LOCAL
时,如果之后调用
dlopen(3)
(而不是由 DT_NEEDED
条目引用)。
在以前的 Android 版本中,如果您的应用请求系统使用
文本重定位,系统显示了一条警告,但仍允许加载该库。
从此版本开始,如果您的应用的目标 SDK 版本为 23,系统会拒绝此库
或更高版本。为了帮助您检测库是否加载失败,您的应用应记录
dlopen(3)
测试失败,并添加 dlerror(3)
问题说明文本
调用返回。如需详细了解如何处理文本重定位,请参阅
指南。
APK 验证
现在,平台会对 APK 执行更严格的验证。如果某个 APK 存在以下情况,该 APK 会被视为已损坏 但 APK 中却不存在。如果存在以下任一情况,则 APK 必须重新签名: 内容将被移除。
USB 连接
现在,默认情况下,通过 USB 端口进行的设备连接设置为仅充电模式。如何访问 通过 USB 连接对设备及其内容执行上述操作后,用户必须明确授权 互动。如果您的应用支持用户通过 USB 端口与设备互动,请考虑: 请务必明确启用互动
Android for Work 变更
此版本包含下列针对 Android for Work 的行为变更:
- 个人环境中的工作联系人。Google 拨号器
现在,当用户查看过往通话时,“通话记录”会显示工作联系人。
设置
setCrossProfileCallerIdDisabled()
添加到true
可在 Google 拨号器通话记录中隐藏工作资料联系人。工作通讯录可以是 只有在下列情况下才能通过蓝牙与个人联系人一起显示给设备 您将setBluetoothContactSharingDisabled()
设置为false
。默认情况下,它设置为true
。 - Wi-Fi 配置移除:由个人资料所有者添加的 Wi-Fi 配置
(例如,通过调用
addNetwork()
方法)。 - Wi-Fi 配置锁定:由以下应用创建的任何 Wi-Fi 配置:
如果存在以下情况,则用户无法再修改或删除有效的设备所有者:
WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN
为非零值。 用户仍可创建和修改自己的 Wi-Fi 配置。活跃设备 所有者有权修改或移除任何 Wi-Fi 配置,包括 以及并非由其创建的内容 - 通过添加 Google 账号来下载设备政策控制器:当 Google 需要通过设备政策控制器 (DPC) 应用进行管理的账号添加到设备 在托管环境之外,添加账号流程现在会提示用户安装 相应的 WPC。这一行为也适用于通过 设置 >账号和初始设备设置向导中执行此操作。
- 特定
DevicePolicyManager
API 行为的变更:- 调用
setCameraDisabled()
方法只会影响发起调用的用户的相机;通过受管理资料调用它不会 影响在主要用户上运行的相机应用。 - 此外,
setKeyguardDisabledFeatures()
方法现在适用于配置文件所有者和设备所有者。 - 配置文件所有者可以设置以下键盘锁限制:
<ph type="x-smartling-placeholder">
- </ph>
KEYGUARD_DISABLE_TRUST_AGENTS
和KEYGUARD_DISABLE_FINGERPRINT
,它会影响 配置文件上级用户的键盘锁设置。KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS
, 仅影响受管理个人资料中的应用生成的通知。
DevicePolicyManager.createAndInitializeUser()
和DevicePolicyManager.createUser()
方法已废弃。setScreenCaptureDisabled()
方法现在还会在给定用户的应用在前台运行时屏蔽辅助结构。EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
现在默认为 SHA-256。为实现向后兼容性,SHA-1 仍受支持,但将被移除 。EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM
现在只接受 SHA-256。- Android 6.0(API 级别 23)中曾经存在的 Device initializer API 现已删除
EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS
已被移除,因此 NFC 触碰 无法通过编程方式解锁受恢复出厂设置保护的设备。- 您现在可以使用
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
extra 以在对受管设备进行 NFC 配置期间将数据传递给设备所有者应用。 - Android for Work API 针对 M 运行时权限进行了优化,包括工作资料、
辅助层等。新的
DevicePolicyManager
权限 API 不 影响 M 之前版本的应用。 - 当用户退出通过
ACTION_PROVISION_MANAGED_PROFILE
或ACTION_PROVISION_MANAGED_DEVICE
intent,系统 现在会返回RESULT_CANCELED
结果代码。
- 调用
- 其他 API 的变更:
<ph type="x-smartling-placeholder">
- </ph>
- 流量使用情况:
android.app.usage.NetworkUsageStats
类已重命名NetworkStats
。
- 流量使用情况:
- 对全局设置的变更:
<ph type="x-smartling-placeholder">
- </ph>
- 这些设置无法再通过
setGlobalSettings()
设定: <ph type="x-smartling-placeholder">- </ph>
BLUETOOTH_ON
DEVELOPMENT_SETTINGS_ENABLED
MODE_RINGER
NETWORK_PREFERENCE
WIFI_ON
- 现在,您可以通过
setGlobalSettings()
设置这些全局设置: <ph type="x-smartling-placeholder">
- 这些设置无法再通过