Android 6.0版本的变化

本贴最后更新于 3245 天前,其中的信息可能已经时移世易

备注:原文见https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html。

修改日志:20160726  v0.1:从英文翻译为中文


Android 6.0增加了一些新的特性和功能,同时修改了部分API的行为方式,也修改了系统的部分地方。本文强调了部分关键修改点,对于这些更改,需要理解并且在APP中考虑到。

另外,请注意平台的这些更改会影响到之前发布过了Android app

运行时权限认证



这个版本引进一个新的权限模型:用户可以在运行时直接管理app权限。这个模式为用户提供一种改进的可见性的和权限控制,并为开发者提供精简安装和自动升级流程。用户可以对已安装的apps授予或撤销个别权限。

Android 6.0(API level 23)或以上,需要在运行的时候检查或者请求权限。查看自己是否获得某个权限,使用新增的checkSelfPermission()方法。申请某个权限,使用新增的requestPermissions() 方法。就算APP的目标版本不是6.0,也需要测试app是否获得某个权限。

关于这个新的权限模式,参考Working with System Permissions.

关于如何评估对app的影响,参考Permissions Best Practices.

Doze and App Standby



这个版本引进了一种新的最优节能方案来管理空闲的设备和app。这些特性影响所有的app,所以需要在新的模式下测试之前的app.

·         Doze:如果用户在一段时间内拔掉充电插头或静置设备或关屏,设备将进入Doze模式,这个模式下系统将进入睡眠状态。这个模式下,设备会周期性的恢复普通操作一段时间,那样app能够进行同步,系统也能执行其他阻塞的操作。

·         App Standby:App Standby用于系统决定某个用户没有激活使用的App是否空闲。系统通过一段时间内用户没有点击这个App来确定某个App是否处于空闲状态。如果设备没有插电,系统认为应该闲置,它将关闭网络、阻塞app的同步和任务。

更多的关于节能的更改,参考Optimizing for Doze and App Standby.


Apache HTTP Client Removal


       

         6.0版本移除了Apache HTTP client的支持。如果在使用了这个库,或者目标版本为2.3或更高,使用HttpURLConnection  替换。这个API更有效,因为它通过使用对上层透明的压缩算法、应答缓存和最小化的电量损耗来减少网络占用。

如果要继续使用Apache HTTP API,需要在build.gradle文件中声明编译的依赖项。

android {
    useLibrary
'org.apache.http.legacy'
}


BoringSSL


        

        Android不再使用OpenSLL,改用BoringSSL库。如果在app中使用了Android NDK,不要使用不是NDK API一部分的库,比如libcrypto.solibssl.so。这些库不是公共API,并且不同的版本或者设备有可能改变或者没有通知的中断使用。此外,对app需要进行安全漏洞检查。用 连接静态加密库的方式 替代 另一种本地代码通过JNI调用Java加密API 的方式 作为实践中的更佳选择。


Access to Hardware Identifier



为了给用户提供更为好的数据保护,Android移除了通过可编程的方式来访问设备的硬件本地标示符,比如Wi-Fi和蓝牙API WifiInfo.getMacAddress()BluetoothAdapter.getAddress()方法现在返回的是一个常量值:02:00:00:00:00:00.

通过蓝牙和Wi-Fi扫描可以访问附近外部设备的硬件标示符,使用下面方法时必须具有ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION权限:

·         WifiManager.getScanResults()

·         BluetoothDevice.ACTION_FOUND

·         BluetoothLeScanner.startScan()

注意:当Android 6.0设备在初始化Wi-Fi或蓝牙扫描时,这个操作对于外部设备来说是可见的,它会生成一个随机的MAC地址。


Notifications



这个版本移除了Notification.setLatestEventInfo()方法。使用Notification.Builder类作为构建方法。复用Notification.Builder实例作为周期性通知。调用build()方法来得到更新了的Notification实例。 adb shell dumpsys notification 命令不在打印出通知文本。相应的使用adb shell dumpsys notification –noredact命令来打印通知的文本。


AudioManager Changes



通过AudioManager 直接设置音量或者静音不再有效。setStreamSolo() 方法过时,而是使用 requestAudioFocus()方法替换。类似的,setStreamMute() adjustStreamVolume()替换,参数为ADJUST_MUTE ADJUST_UNMUTE


Text Selection


当用户在app中选择选择文本时,现在可以在悬浮按钮中显示对选中文本的操作:剪切、拷贝、复制和包含在悬浮按钮中的查找、评论、删除。 这个用户交互的实现和action bar类似,参考单一的视图实现上下文操作模式:Enabling the contextual action mode for individual views

实现文本选择悬浮工具按钮,需要在app中改变以下几点:

    1.View或者Activity对象中,将startActionMode(Callback)改成startActionMode(Callback, ActionMode.TYPE_FLOATING)来改变ActionMode 

    2. ActionMode.Callback 的实现改成继承ActionMode.Callback2

    3.覆盖 onGetContentRect() 方法获得界面中内容坐标的Rect 对象(比如文本选择矩形框)。

    4.如果矩形位置不再可用并且是失效的唯一的变量,调用invalidateContentRect() 方法。

如果正在使用Android Support Library 22.2版本,注意悬浮工具栏不是向后兼容并且默认AppCompat控制ActionMode 对象。这可以防止悬浮按钮工具栏消失。在AppCompatActivity中通过调用getDelegate()方法返回AppCompatDelegate 对象,然后调用setHandleNativeActionModesEnabled()方法并传入参数false开启ActionMode的支持。这个调用 返回了frameworkActionMode对象的的控制。Android 6.0设备中,framework支持ActionBar 或者悬浮工具栏模式,但是Android 5.1或更低中,只有ActionBar的支持。


Browser Bookmark Changes


    

  这个版本移除了对全局书签的支持。方法android.provider.Browser.getAllBookmarks() android.provider.Browser.saveBookmark()已经被移除。READ_HISTORY_BOOKMARKS WRITE_HISTORY_BOOKMARKS权限也被移除。Android 6.0以后,不能通过系统的provider或申请书签权限,而应该让app自己保存书签。


Android Keystore Changes



Android Keystore provider不再支持DSA加密算法,ECDSA继续支持。当安全锁屏禁用或者重置(比如被用户或者设备管理员)的时候,不再需要被用来加密的密钥不再删除。


Wi-Fi and Networking Changes


      

    Wi-Fi和网络API的变化如下:

                1. WifiConfiguration 的状态只有在创建这个对象之后才能被修改。

                2.之前,通过enableNetwork() 方法并设置disableAllOthers=true ,设备将从别的网络(比如移动网络)断开,然后连接一个特定的Wi-Fi。这个版本,设备不在断开别的网络连接。如果app的目标版本是20或更低,设备将连接选定的Wi-Fi网络。如果app的版本是21或更高,使用多种网络API(比如openConnection()bindSocket(), 新的 bindProcessToNetwork()方法 )来确定网络流量走的是选定的网络。


Camera Service Changes



 在这个版本,摄像头服务中的访问共享资源模式由先来先服务的访问模式改为“高优先级先服务“的模式。变更点如下:

·             1.访问摄像头子资源系统,包括打开、管理摄像头设备,将以优先级顺序对子程序排序。用户可见、前台activities获得更高的优先级,得到更高可靠性的资源请求和设备使用服务。

·             2.正在使用camera服务的低优先级的app有可能被高优先级的app剥夺使用权。在过时的Camera API中,onError() 方法将被剥夺的app调用,返回被剥夺的结果。而在Camera2 API中,onDisconnected() 方法将被调用。

·            3.有的摄像头硬件可以同时为多个程序提供独立服务,但是,多个进程同时使用必然会导致性能的显著下降。摄像头服务目前是会检测并不允许多进程访问摄像头服务的。这个更改可能导致低优先级的进程永远不能获得使用权,就算没有其他app视图访问同一相机设备。

·           4.切换当前用户将导致上一个用户的app中使用摄像头的客户进程被中止。用户配置文件中声明了当前用户访问摄像头的权限。在实践中,这可以看做是一个来宾账户。当用户进行账户切换时,正在使用摄像头的进程也会中止。


Runtime


        

        ART运行时现在可以正确的实现newInstance() 方法的访问规则这个更改修正了Dalvik在上一个版本中不能正确的检查访问权限规则的问题。如果在app中使用newInstance() 方法,或者想重写访问检查,调用setAccessible()方法,并且传入参数true如果app中使用了v7 appcompat library 或者v7 recyclerview library,必须升级这些库到最新版本。此外,确认XML中声明的其他自定义类已经升级,那样类的构造方法才能被访问。

这个版本升级了动态链接器的行为方式。动态连接器可以分辨一个库的别名和它的路径(public bug 6670),也实现了通过别名查找。以前的app如果有糟糕的 DT_NEEDED入口(通常是构建机器文件系统的绝对路径)将有可能在加载的时候失败。

dlopen(3) RTLD_LOCAL 标志现在已经被正确的实现。调用dlopen(3) 的时候 如果不显式的声明,默认的是RTLD_LOCAL(除非显式的使用RTLD_GLOBAL)。使用 RTLD_LOCAL标志,调用 dlopen(3)标志位将不可用于之后加载的库(与 DT_NEEDED 入口相反)。

在之前的Android版本,如果app需要系统去加载代码重定位的共享库,系统虽然会显示警告但是依然允许去加载库。

这个版本开始,系统拒绝这个库,如果你的app目标版本为23或更高的话。为了帮助检查一个类是否加载失败,你的app必须输出dlopen(3)的失败日志,并且包含dlopen(3)返回的问题描述文本。更多的关于代码重定位,参考 guide.


APK Validation



这个平台现在将进行严格的APK验证。一个APK将被认为是损坏的,如果一个在manifest中被声明的文件,在APK中不存在。APK应该被重新签名,如果有任何的内容被移除。


USB Connection



通过USB的设备连接将默认的是仅充电模式。访问设备以及它的内容,用户必须显式的为这些操作授予权限。如果你的app支持通过USB口的用户交互,考虑一下这个交互必须显式的启用。


Android for Work Changes


    

   这个版本的企业Android的行为方式包括了以下更改:

1.个人情境中的企业通讯录。当用户查看通话历史时,Google Dialer Call Log 现在是可以显示企业通讯录。设置setCrossProfileCallerIdDisabled()true来在Google Dialer Call Log中隐藏工作配置通讯录。仅当你设置setBluetoothContactSharingDisabled()false的时候,企业通讯录能和个人通讯录一样通过蓝牙在设备间显示.默认情况下,这个参数被设置为true

2.Wi-Fi配置移除:通过拥有者的配置文件添加的Wi-Fi配置现在将被移除,如果那个业务配置文件被删除的话。

3.Wi-Fi配置锁定:活动的设备拥有者创建的Wi-Fi配置不再能被修改或者删除,如果WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN 是非零的话。用户依然可以创建和修改他们拥有的Wi-Fi配置。活动的设备拥有者有编辑和移除Wi-Fi配置的权限,就算这些Wi-Fi配置不是他创建的。

4.通过谷歌账户下载DPCdevice policy controller):通过DPC app请求管理的谷歌账户被添加到一个超出管理范围的设备中,这个添加的账户现在将显示用户需要安装正确的WPC(?)。这个情况同样适用于通过设置>账户 或者 设备安装初始化向导来添加账户。

5.DevicePolicyManagerAPI的行为方式更改:

    5.1setCameraDisabled() 的调用将只影响调用这个方法的用户。从管理配置文件中调用这个方法将不会影响主要用户的相机app

    5.2此外,setKeyguardDisabledFeatures() 方式只对配置的拥有者可用,设备拥有者也一样。

    5.3配置拥有者能够设置这些锁屏策略:

        5.3.1KEYGUARD_DISABLE_TRUST_AGENTS and KEYGUARD_DISABLE_FINGERPRINT,将影响父用户配置的锁屏设置。

        5.3.2KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS将只影响在管理配置文件名单中的程序。

    5.4DevicePolicyManager.createAndInitializeUser() and DevicePolicyManager.createUser()已经过时。

    5.5setScreenCaptureDisabled()方法现在也阻塞辅助结构,当用户给出的app在前台。

    5.6EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM现在默认的是SHA-256SHA-1依然向后兼容,未来将会移除。EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM现在只支持SHA-256

    5.7设备初始化APIAndroid 6.0中移除

    5.8EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS移除,所以NFC碰撞检测不能以编程的方式解锁 一个工厂重置保护设备。

    5.9额外的,可以通过EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLENFC就绪的设备的app间进行数据交换。

    5.10Android 企业版API对于M运行时权限进行了最优化,包括企业级配置文件、辅助层或者其他。 新的DevicePolicyManagerAPI不会影响M之前的app.

    5.11当通过包含ACTION_PROVISION_MANAGED_PROFILE 或者ACTION_PROVISION_MANAGED_DEVICE标记的Intent来取消已经开始的安装流程中的同步部分 ,系统现在将返回RESULT_CANCELED结果码。

6.其他API的修改:

    数据利用率:android.app.usage.NetworkUsageStats类重命名为NetworkStats

7.全局设置的修改:

    全局设置不再通过setGlobalSettings()来设置:BLUETOOTH_ON、DEVELOPMENT_SETTINGS_ENABLED、MODE_RINGER、NETWORK_PREFERENCE、WIFI_ON。WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN改为通过setGlobalSettings()进行全局设置。



  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • 权限
    24 引用 • 67 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 251 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 385 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 33 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 1 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    98 引用 • 903 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    118 引用 • 54 回帖 • 3 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    954 引用 • 944 回帖
  • OpenCV
    15 引用 • 36 回帖 • 7 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 3 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 6 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    80 引用 • 396 回帖
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    228 引用 • 476 回帖 • 1 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 79 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 77 回帖
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 223 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 9 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 631 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 3 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 561 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 502 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖 • 13 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1395 回帖
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 8 关注