Android 6.0 新特性

来源:互联网 发布:我们的法兰西岁月 知乎 编辑:程序博客网 时间:2024/04/28 02:41

随着新的特性和功能,在Android6.0(API 23)包括各种系统的变化和API变化。本文主要介绍了一些你应该了解和您的应用程序占有的关键变化。如果您之前已经发布过Andr​​oid的应用程序,要知道,这些变化会影响您的应用程序

1.运行权限

Android6.0引入了新的权限模型,用户现在可以直接在运行时管理应用程序的权限。这种模式为用户提供了改进的可见性和控制限,同时简化了应用程序开发人员安装和自动更新过程。用户可以对安装的应用单独授予或撤销权限

在您的应用程序适用于Android6.0(API 23)以上时,确保在运行时检查和请求权限。调用新的checkselfpermission()方法,去判断你的应用程序是否已被授予权限。调用新requestPermissions()方法,去请求权限。即使你的应用程序不是针对Android6.0(API23),你也应该下的新的权限模式下测试你的应用程序。

关于在应用程序中支持新权限模式的详细信息,点击Working with System Permissions。关于如何评估对你的应用程序的影响的提示,点击Permissions Best Practices

 

2.休眠和应用待机

Android6.0对闲置设备和应用引入了新的节能优化。这些特性会影响所有的应用程序,因此确保在这些新模式测试您的应用程序。

  • 休眠:如果设备在没有插入电源的灭屏状态下,用户有一段时间没有触碰和使用设备,该设备进入睡眠模式,它试图保持系统处于睡眠状态。在这种模式下,设备周期的短暂恢复正常运行,以便APP进行同步和系统能够执行任何挂起的操作。
  • 应用待机:应用待机允许系统判断当用户没有积极使用某一应用时,该应用是空闲的。当用户一段时间内没有使用点击该应用,系统就会作此判定。如果设备没有插入电源,系统将会对它认为的空闲应用禁止网络访问,暂停同步和其他操作。

要了解更多关于这些节能的变化,点击Optimizing for Doze and App Standby

3.ApacheHTTP客户端去除

Android的6.0版本中删除了的Apache HTTP客户端支持。如果您的应用程序使用此客户端和目标为Andr​​oid2.3(API 9)或更高,使用HttpURLConnection类代替。这个API提高了效率而且最大限度的减少功耗,因为它通过明显的压缩和响应网络缓存减少了网络的使用。为了能继续使用Apache HTTP APIs,你必须在build.gradle做如下声明:

    android {

       useLibrary 'org.apache.http.legacy'

     }

4.BoringSSL

Android正在从OpenSSL迁移到BoringSSL库,如果你正在你的应用中使用Android NDK,不要链接不属于NDK API的一部分的密码库,比如libcrypto.solibssl.so。这些库不是公共的 APIs,可能在跨版本和设备中改变或中断而没有发出通知。另外,你也可能暴露自己的安全漏洞。相反,通过JNI或你选择的静态链接密码库修改你的本地代码去调用java加密API通过JNI或静态链接和密码库。

5.访问硬件标识符

为了给用户提供更高的数据保护,从这个版本开始,Android对使用的Wi-Fi和蓝牙API的应用删除了程序访问设备的本地硬件标识符。方法WifiInfo.getMacAddress()BluetoothAdapter.getAddress()现在返回一个常量02:00:00:00:00:00。要通过蓝牙和Wi-Fi扫描访问附近外部设备的硬件标识码,您的应用程序现在必须有ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION权限:

  • WifiManager.getScanResults()
  • BluetoothDevice.ACTION_FOUND
  • BluetoothLeScanner.startScan()

注意:当运行Android6.0(API 23)的设备启动的后台Wi-Fi或蓝牙扫描,这个操作是可见的随机MAC地址的外部设备。

6.通知栏

Android的6.0版本中删除了Notification.setLatestEventInfo()方法。用Notification.Builder类构造通知。要反复更新通知,复用Notification.Builder实例。调用build()方法获取最新的Notification 实例。

adb shell dumpsys notification命令不再打印通知文本,代替使用adb shell dumpsys notification --noredact命令在一个通知对象中打印通知文本。

7.AudioManager变化

Android的6.0版本中不再支持通过AudioManager直接设置音量或类静音特定流。setStreamSolo()方法已经过时,你应该用requestAudioFocus()方法。同样,setStreamMute()已经过时,代替的调用方法 adjustStreamVolume()传入ADJUST_MUTE或者ADJUST_UNMUTE

8.文本选择

当用户在你的应用中选中文本时,你现在可以在floating toolbar显示选中的操作,比如剪切、复制和粘贴。用户交互的实现类似于contextual action bar,如 Enabling the contextual action mode forindividual views

为了实现对文本选择浮动工具栏,请在现有应用程序中进行以下更改:

1)在你的View或者Activity对象中,改变你ActionMode调用方法startActionMode(Callback)startActionMode(Callback,ActionMode.TYPE_FLOATING)

2)把现有的实现ActionMode.Callback替换为继承ActionMode.Callback2

3)重写onGetContentRect()方法来提供内容的矩形对象在视图中的坐标(如文本选择矩形)。

4)调用invalidateContentRect()方法是使矩形定位不再有效的唯一要素。

如果你正在使用Android SupportLibrary22.2,注意,要知道浮动工具栏是不向后兼容的,默认情况下由appcompat代替ActionMode。这可以防止浮动工具栏的显示。为了使ActionModeAppCompatActivity中支持,调用getDelegate()方法,然后再返回AppCompatDelegate中调setHandleNativeActionModesEnabled()并且传递参数为false。这个调用返回ActionMode的控制对象到framework在Android6.0(API23)设备上,framework支持ActionBar和floating toolbar模式,但是在 Android 5.1 (API level 22) 或者更低版本的设备上,只支持ActionBar 模式。

 

9.浏览器的书签变化

Android的6.0版本中删除支持全局书签。android.provider.Browser.getAllBookmarks()方法和android.provider.Browser.saveBookmark()方法被删除。同样,READ_HISTORY_BOOKMARKS和WRITE_HISTORY_BOOKMARKS权限被删除。如果你的应用程序中的目标是Andr​​oid6.0(API23)或更高,不要从全局provider 或者书签权限访问书签。相反,你应该在应用内存储书签数据。

10.AndroidKeystore变化

Android的6.0版本中,Android Keystore provider不再支持DSA。ECDSA仍然被支持。未使用的不需要加密的Keys 当安全的锁屏被禁用或重置(例如,由用户或设备管理员)时将不再被删除。而在前面情况中未使用需要加密的Keys将会被删除。

11.Wi-Fi和网络的变化

Android的6.0版本中对Wi-Fi和网络APIs引入了以下变化:

  • 你的应用现在可以改变只有当你创建WifiConfiguration对象的状态。你不允许修改或者删除由用户或者其他应用创建的WifiConfiguration对象。
  • 以前,如果一个应用通过设置enableNetwork()disableAllOthers=true强制让设备连接到特定的Wi-Fi网络,设备与其它网络比如蜂窝数据断开。在Android的6.0版本中,设备不再与其它网络断开连接。如果您的应用程序的targetSdkVersion是“20”或更低,它被固定在选择的Android的6.0版本中,设备不再与其它网络断开连接。如果应用的targetSdkVersion是“21”或更高使用多网络的API(openConnection(),bindSocket()新的bindProcessToNetwork()方法)确保网络流量在选择的网络上发送。

12.CameraService变化

Android的6.0版本中,访问相机服务共享资源的模式从之前“先来先服务”改变为“高优先级进程优先”的模式。服务行为的变化包括:

  • 访问相机子系统资源(包括打开和配置一个相机设备),被授予基于客户端应用程序的“优先级”。用户可见或者前台活动的应用进程,通常被给予更高的优先级使得照相机资源获得和使用更可靠。
  • 当一个更高优先级的应用试图使用相机的时候,低优先级应用的活动摄像头的客户可能被“驱逐”。在被废弃的CameraAPI中,这会导致被驱逐客户调用的onError()方法,在Camera2API中,这会导致被驱逐客户调用onDisconnected()方法。
  • 在合适的相机硬件设备上,单独的设备可以同时独立的打开和使用单独的相机设备。但是,多进程使用的情况(同时访问引起打开的相机设备性能显著下降),现在可以被相机设备检测和禁止。这种变化可能会导致“驱逐”低优先级的客户,即使没有其他的应用程序直接试图访问同一摄像机设备。
  • 改变用户引起先前拥有的应用程序活动摄像头的客户被驱逐。访问摄像机仅限于由当前设备用户拥有的用户配置文件。实际上,这意味着当用户切换到不同帐户的时候,一个“客户”帐户不能离开正在运行使用相机子系统的进程。

13.运行

ART运行现在可以正确的实现访问规则newInstance()方法。这种变化修复了在以前的版本中Dalvik检查问规则不正确的问题。如果你的应用使用了newInstance()方法,你想要重写访问检查,调用setAccessible()方法并且传入参数true。如果你的应用使用了v7 appcompat library或者v7 recyclerview library,去使用这些库的最新版本。另外确保XML中引用的任何自定义类都被更新,以便这些类的构造函数可以访问。

此版本更新动态链接器的行为。动态链接器现在明白了一个库的现在和它的路径(公共bug 6670)的差异,现在搜索已经实现。之前运行时有坏的DT_NEEDED条目(通常生成计算机上的文件系统是绝对路径)的应用,当被加载的时候可能失败。

标志dlopen(3) RTLD_LOCAL现在可以正确实现。需要注意的是RTLD_LOCAL是默认的,所以调用执行dlopen(3)没有明确使用RTLD_LOCAL会受到影响(除非你的应用程序明确使用RTLD_GLOBAL),符号将不被提供给由以后调用dlopen(3)去加载库(与引用DT_NEEDED是相对)

在Android的早期版本中,如果您的应用程序请求系统加载的共享库文本重定位,系统显示一个警告,但仍允许库被加载。在这个版本开始,如果您的应用程序的目标SDK版本是23或更高版本的系统将拒绝该库。为了帮助你发现一个库是否加载失败,您的应用程序应该记录的dlopen(3)故障,并包括问题的描述文本dlerror(3)
调用返回。要了解更多关于处理文本重定位,请参阅guide

14.APK验证

Android的6.0版本中执行严格的APKs验证。如果一个文件在manifest 声明,但是APK中没有这个文件,那么这个APK就会被认为是腐败的。如果有任何内容被删除,一个APK必须重新签名。

15.USB 连接

设备通过USB端口连接默认情况下被设置为充电模式。通过USB连接访问设备和设备内容,用户必须明确的授予权限。如果你的应用支持通过USB端口对设备的用户交互,注意交互必须显式启用。

16.Androidfor Work变化

Android的6.0版本中包括Android for Work的以下行为的变化:

  • 个人背景相关工作联系人:当用户查看过去的通话,谷歌通话记录现在显示工作联系人。设置setCrossProfileCallerIdDisabled()为true隐藏谷歌通话记录中联系人的工作简介。工作联系人和个人联系人可以通过设备蓝牙一起显示,只要你设置setBluetoothContactSharingDisabled()为false。默认情况下,它的设置是true。
  • Wi-Fi配置去除:现在如果工作文件被删除,那么使用者添加的Wi-Fi配置(例如,通过调用该addNetwork()方法)也会被删除。
  • Wi-Fi配置锁定:如果WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN是非零,由有源设备所有者创建的任何Wi-Fi配置可以不再由用户进行修改或删除。用户仍然可以创建和修改自己的Wi-Fi配置。原设备所有者有编辑和删除任何Wi-Fi 配置的权利,包括那些不是他们创建的Wi-Fi配置。
  • 除了谷歌账户外下载策略控制器:当一个需要通过设备策略控制器(DPC)应用管理的谷歌账户需要被需要被添加到管理上下文之外的设备,添加帐户流程现在会提示用户安装相应的WPC。这种行为也适用WPC。这种行为也适用于在初始化设备安装向导中通过Settings > Accounts添加账号。
  • 特定DevicePolicyManagerAPI的行为的变化

1)调用setCameraDisabled()方法仅仅影响相机调用者。从管理配置文件中调用不会影响主用户运行的相机应用。

2)此外,setKeyguardDisabledFeatures()方法现在除了设备用户可用外,对配置用户也可用。

3)一个配置用户可以设置keyguard 约束:KEYGUARD_DISABLE_TRUST_AGENTSKEYGUARD_DISABLE_FINGERPRINT影响父用户keyguard 设置。KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS只影响配置文件里的应用产生的通知。

 4DevicePolicyManager.createAndInitializeUser()DevicePolicyManager.createUser()方法被废弃。

5)当给定用户的应用程序是在前台,setScreenCaptureDisabled()方法现在也阻塞辅助结构。

6EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM现在默认是SHA-256。SHA-1仍然向后兼容,但是在未来可能被移除。EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM现在只接受SHA-256

7)在Android 6.0(API 23)存在的设备初始化的API现在被删除。

8EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS被移除,因此NFC凹凸配置不能以编程方式解锁工厂复位保护装置。

9)你现在可以额外的使用EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE在被管理设备的NFC供应期间将数据传递给设备所有者的应用。

10)Android for Work API是对于M运行权限优化,包括工作配置文件,辅助层,和其它方面。新DevicePolicyManager权限的API不影响pre-M的应用程序。

11)当用户退出通过ACTION_PROVISION_MANAGED_PROFILEACTION_PROVISION_MANAGED_DEVICE意图发起的设置流程的同步部分,目前该系统会返回一个RESULT_CANCELED结果码。

  • 其它APIs的变化:

数据的使用:android.app.usage.NetworkUsageStats类被更名NetworkStats

  • 全局设置的变化:

 1这些设置不再通过setGlobalSettings()方法:

· BLUETOOTH_ON

· DEVELOPMENT_SETTINGS_ENABLED

· MODE_RINGER

· NETWORK_PREFERENCE

· WIFI_ON

2)这些全局设置现在可以通过setGlobalSettings()方法:

·WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN

 

1 0