Android 6.0版本的变化

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

备注:原文见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 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Windows

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

    229 引用 • 476 回帖
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    46 引用 • 114 回帖 • 169 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    198 引用 • 543 回帖 • 2 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 110 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 239 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 643 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 735 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 407 关注
  • Kafka

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

    36 引用 • 35 回帖 • 3 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 314 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 196 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    10 引用 • 15 回帖
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 36 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 546 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 1 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    17 引用 • 7 回帖 • 4 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    115 引用 • 319 回帖
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    32 引用 • 99 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 264 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 184 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 181 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    694 引用 • 537 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 369 关注