Android 6.0版本的变化

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

备注:原文见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)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    77 引用 • 430 回帖
  • 权限
    24 引用 • 67 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 94 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 351 关注
  • 京东

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

    14 引用 • 102 回帖 • 376 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖 • 1 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    287 引用 • 4484 回帖 • 669 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 327 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 764 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    169 引用 • 506 回帖
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 19 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 664 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 26 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 2 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1705 回帖 • 1 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 5 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 173 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1348 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    729 引用 • 1327 回帖
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 22 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 585 关注
  • 以太坊

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

    34 引用 • 367 回帖
  • MySQL

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

    690 引用 • 535 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 700 关注
  • SendCloud

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

    2 引用 • 8 回帖 • 483 关注