Android 6.0的变化 (下)

目录

浏览器书签变化

这个版本移除了对全局书签的支持。android.provider.Browser.getAllBookmarks()and android.provider.Browser.saveBookmark() 方法现在被移除了。同样的,READ_HISTORY_BOOKMARKS and WRITE_HISTORY_BOOKMARKS 权限也被移除了。如果你的APP目标版本是Android 6.0 (API level 23) 或者更高,不要使用全局书签或使用全局书签的权限,相对应的,你的APP应该使用内部的书签。

Android密钥库变化

在这个版本, Android Keystore provider 不在支持DSA.ECDSA仍然被支持。
当安全锁屏被禁用或复位时(例如,被用户或设备管理器操作时),那些没加密的密钥将不再被删除,在这些时候那些加密的密钥将被删除。

wifi和网络工作的变化

这个版本介绍了一下几个有关于Wi-Fi 和网络工作的API的行为变化。

你的APP现在可以改变 WifiConfiguration 对象的状态仅当是你创建了这些对象时。你将不被允许去修改或者删除WifiConfiguration 对象当他是被用户或者别的APP创建的。

在之前,如果一个APP使用 enableNetwork() 方法并设置disableAllOthers=true 来强制设备连接某个指定的WiFi网络,设备将会拒绝连接其他的网络比如蜂窝数据。在这个版本,设备不在拒绝连接其他的网络。如果你的APP的targetSdkVersion 是20或者更低,他将被固定在所选的WiFi网络。如果你的APP的targetSdkVersion 是21或者更高,使用多网络API(例如 openConnection(), bindSocket(),和新的bindProcessToNetwork() 方法)来确保网络通信是使用被选择的网络。

照相服务改变

在这个版本中,接收摄像头服务和共享资源的模式已经从原来的“先到先服务”的模式转变为先服务高优先级的进程,服务的行为改变包括:

获取相机子系统的资源,包括打开和配置相机设备,是基于APP进程的“优先级”来进行授予的。用户可见的或者在最前的activity的APP进程通常给予较高的优先级,来使的相机资源的分配和使用更加的可靠。

一个低优先级的APP的正在使用相机的用户可能会被“驱逐”当一个高优先级的APP尝试使用相机时。在被弃用的Camera API中,这将导致被驱逐的用户将会调用 onError() 方法,而在Camera2 API中,这将导致被驱逐的用户调用 onDisconnected() 方法。

当设备拥有合适的照相机硬件时,不同的APP进程可以独立的打开和使用照相机设备。然而,多进程使用的情况下,当同时请求导致对任意的相机设备的性能和能力的降低,现在的相机服务对此进行检测并且禁止改行为。这样的改变可能导致低优先级的用户被“驱逐”即使没有其他的APP明确的尝试访问相同的相机设备。

改变当前的用户会导致之前的用户中的APP的活动的相机用户被驱逐。访问相机应用将被限制于用户配置文件属于当前设备用户者。在实践中,这就比如说是一个“游客”账户,当用户切换了一个不同的账号时将无法离开正在运行的相机子系统的进程。

运行时

ART运行时可以正确的实现访问 newInstance()方法的规则。这种改变解决了以前版本中Dalvik 检查访问规则错误的问题。如果你的APP调用了 newInstance()方法并且你想要重写访问检查,应该调用 setAccessible()并将传入参数设为true。如果你的APP使用了v7 appcompat library 或者 v7 recyclerview library 包,你必须在你的APP里更新这些相应的包到最新版。此外,确保你的xml中引用的自定义类已经更新来保证他们的类构造器可用。

这个版本更新了动态连接器的行为。动态链接器现在可以识别库的soname和他的路径的不同(公共bug6670),并且实现了通过soname来进行查找的功能。在加载的时候那些先前工作在坏的 DT_NEEDED 的项目(在创建机器文件系统时使用绝对路径)可能会失败。

现在已经支持方法dlopen(3) RTLD_LOCAL模式,需要注意的是RTLD_LOCAL是默认值,当你没有明确使用其他参数时将不会影响到默认值。(除非你的APP明确的使用了 RTLD_GLOBAL)。在使用RTLD_LOCAL的情况下,比较晚使用dlopen(3)进行库加载的标识符将不可用。

在Android之前的版本里,如果你要求系统加载一个文本重定位的共享库文件,系统会显示警告但是仍然会允许加载该库。从这个版本开始,如果你的APP的目标sdk是23或者更高系统将会拒绝该库。为了帮助你检测到库文件的加载失败,你的APP应该打印有关日志来记录dlopen()失败,包括记录问题的描述以及dlerror返回。为了学习更多的有关文本重定位的内容可见这个指导。

APK验证

现在平台执行严格的apk验证。一个在manifest中声明了某文件但是在apk中却没有出现该文件的apk被认为是损坏的。一个apk中的任何内容被修改后必须重新签名。

USB连接

设备通过USB端口进行连接现在默认设置为仅充电模式。为了通过USB连接方式访问设备及其内容,用户必须明确的授予这种交互的权限。如果你的应用支持通过USB端口进行交互,请考虑到该交互必须显示的启用。

企业级Android的变化

在这个版本包括了以下企业级Android的行为变化。

个人环境中的企业通讯录。当用户查看过去的通话记录时,google拨号器将会显示企业通讯录。设置setCrossProfileCallerIdDisabled() 为true来使得在google拨号器里隐藏企业联系人记录。当通过蓝牙分享时工作通讯录将会和个人通讯录一起显示,除非你 setBluetoothContactSharingDisabled() 为false。在默认情况下,它是设置为true的。

WiFi配置清除:通过Profile Owner来添加Wi-Fi配置(例如,调用addNetwork()方法)在它对应的企业配置文件被移除后删除。

WiFi配置锁定:如果WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN 不为0时,任何由活动设备拥有者创建的WiFi配置文件将不可以被用户进行修改和删除。用户仍然可以创建和修改他们自己的WiFi配置。活动设备所有者拥有修改和删除包括那些不是由他们创建的WiFi配置的特权。

通过google账号来下载企业策略控制器:当一个管理环境之外的需要管理的google账号要求通过设备策略控制器app添加到设备时,新增账号流程将会提示用户安装合适的WPC。这一行为同样支持通过设置-账号和初始化设备时添加账号。

DevicePolicyManager api的变化:

调用 setCameraDisabled()方法只会影响当前调用相机的用户。从管理文件中调用的话并不影响正在主用户上运行的使用相机的APP。

此外,现在配置拥有者可以和设备拥有者一样使用setKeyguardDisabledFeatures() 方法。

配置拥有者可以设置以下锁屏设置:
KEYGUARD_DISABLE_TRUST_AGENTS 和 KEYGUARD_DISABLE_FINGERPRINT可以影响配置文件的父用户。
KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS,会影响APP在管理文件中产生的通知。

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 level 23)中的 Device initializer API 现在被删除了。

EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS 被移除,所以NFC触碰配置不能以编程解锁一个恢复出厂设置保护的设备。

你现在可以使用EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE在NFC触碰时将管理设备的数据传输给设备拥有者的APP。

企业Android api 优化了M的运行时权限,包括工作文件,协助层,以及其他等等。新的 DevicePolicyManager 权限API不影响Android M 之前的APP版本。

当用户从初始化设置流程中通过ACTION_PROVISION_MANAGED_PROFILE 或 ACTION_PROVISION_MANAGED_DEVICE intent退出同步部分,系统现在会返回一个RESULT_CANCELED返回值。

其他API的变化:

数据流量统计:android.app.usage.NetworkUsageStats 类被重命名为 NetworkStats.

全局设置的变化:

以下属性将不能再通过 setGlobalSettings()来设置:
BLUETOOTH_ON
DEVELOPMENT_SETTINGS_ENABLED
MODE_RINGER
NETWORK_PREFERENCE
WIFI_ON

以下全局设置现在可以使用setGlobalSettings()来设置:
WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN

Share