随着新的特性和功能,在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. Android应用程序模型:应用程序,任务,进程,线程
  2. Android代码优化
  3. PHP简单判断iPhone、iPad、Android及PC设备的方法
  4. 自定义View关于measure流程的基本思路整理
  5. 18 .Android中创建与几种解析xml的方法
  6. Android应用程序介绍页面实现 (二)
  7. ReactNative 调用Android(安卓)原生(一)——原生模块(一)
  8. Android(安卓)ContentResolver使用说明
  9. 【Android】百度地图自定义弹出窗口

随机推荐

  1. Android shell命令大全
  2. Android软键盘弹出,界面整体上移的问题
  3. android listview去掉分割线
  4. android在线播放音乐
  5. android读取文件权限
  6. Android游戏引擎《Rokon》
  7. Android TextView布局__2019.09.02
  8. Android系统修改导航栏显示位置
  9. pixel升级Android Q beta
  10. Android Studio下“Error:Could not find