Android 6.0版本的变化

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

备注:原文见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 的缩写)一般指手机软件。

    90 引用 • 383 回帖
  • API

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

    76 引用 • 421 回帖
  • 权限
    23 引用 • 67 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 506 关注
  • PWA

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

    14 引用 • 69 回帖 • 120 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖 • 1 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 3 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 45 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 39 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 3 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 17 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    164 引用 • 406 回帖 • 524 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    330 引用 • 612 回帖
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1738 回帖 • 3 关注
  • Ruby

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

    7 引用 • 31 回帖 • 166 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 594 关注
  • gRpc
    10 引用 • 8 回帖 • 48 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    27 引用 • 66 回帖 • 1 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 518 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    129 引用 • 791 回帖 • 1 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 674 关注
  • Firefox

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

    7 引用 • 30 回帖 • 457 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    14 引用 • 7 回帖
  • 酷鸟浏览器

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

    3 引用 • 59 回帖 • 21 关注
  • HTML

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

    103 引用 • 294 回帖
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 496 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    37 引用 • 24 回帖 • 1 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 34 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1090 引用 • 3467 回帖 • 297 关注