Android6.0变化整理

来源:互联网 发布:淘宝游戏扶持号 编辑:程序博客网 时间:2024/05/16 00:37

一、运行时权限检查(Runtime Permisssions)
此次发布引入了一个新的权限管理模型,使得用户能够在运行时控制应用的权限。这个模型一方面提高了用户在权限控制的可视化程度和管理粒度,另一方面也改善了应用安装和自动更新的流程。用户能够对已安装的应用的各个权限进行独立的授权(grant)和禁用(revoke)。
作为开发者,当你的app的目标版本(target)为Android6.0(API 23)或更高时,请确保在运行时进行权限的检查和请求。其中,新的方法checkSelfPermission()可以用来判断你的应用是否被授予了权限,而requestPermissions()可请求权限。即使你app的目标版本在android6.0以下,也应该在新的权限管理模型下测试你的应用。
让你的应用支持新的权限管理模型,以及获得更多的官方提示,可查看Working with System Permissionss(https://developer.android.com/training/permissions/index.html)和 Permissions Best Practices(https://developer.android.com/training/permissions/best-practices.html#testing)

二、休眠和应用待机模式(Doze and App Standby)
此次发布引入了新的省电优化方案,在设备和应用空闲时起作用。此特性影响所有的应用,请确保做好相应的测试。
休眠模式(Doze): 手机在没有外接电源且放置至屏幕关闭一段时间后,设备将进入休眠模式,它将使系统进入睡眠状态(sleep state)。在此模式下,设备周期性的短暂恢复正常操作,以使应用可以同步,系统执行一些必要操作
应用待机模式(App Standby):在用户没有使用某应用的情况下,此模式允许系统判定此应用进入空闲状态。系统的判定依据则是用户在一定的时间内没有再点击此应用(译注:主要还是依据前台进程判定)。如果此时设备也没有连接充电器,系统将禁用该应用的网络连接、同步及任务调度

了解更多关于省电方面的变化,可查看Optimizing for Doze and App Standby(Optimizing for Doze and App Standby)

三、移除Appache的HTTP Client(Apache HTTP Client Removal)
Android6.0版本移除了对Appache的HTTP client的支持。如果你的app的目标版本是Android2.3(API level 9)或者更高,请使用HttpURLConnection类进行替换。此类采用了透明压缩(transparent compression)和响应缓存(response caching),最小化电量消耗。如果你希望继续使用Appache Http API,请修改你的build.gradle文件,增加如下:
[html] view plain copy
android {
useLibrary ‘org.apache.http.legacy’
}

四、BoringSSL
Android正在将OpenSSL库替换为BoringSSL库。这将影响你的应用在NDK中所链接的加密库,比如libcrypto.so和libssl.so,它们不是NDK API的一部分。这些库不是公开的API,因此在不同版本和设备上的变化也不会及时通知开发者。而且,这也将暴露你应用的安全缺陷。因此,需要修改你的native代码,通过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()
注意:当运行Android6.0(API level 23)的设备启动后台Wi-Fi或蓝牙扫描时, 此操作对外部设备是可见的,且被显示为一个随机MAC的地址

六、通知(Notifications)
此版本移除了Notification.setLatestEventInfo()方法。用Notification.Builder类来构造通知,在需要反复更新通知的情况下,保存并重用Notification.Builder的实例;在获取更新后的Notification实例时,调用其build()方法
adb shell dumpsys notification命令不再输出你的通知文本,而adb shell dumpsys notification –noredact命令将输出一个notification对象的文本

七、AudioManager Changes
此版本不再支持通过AudioManager类来直接对特定的音频流设置音量和静音,因此:
setStreamSolo()方法过时(deprecated),替换调用requestAudioFocus()方法
setStreamMute()方法过时,替换调用为adjustStreamVolume()方法,传入的值也变为ADJUST_MUTE 或 ADJUST_UNMUTE

八、文本选择(Text Selection)
用户在应用中选择文字后,你现在可以显示一个浮动工具栏(floating toolbar),展示并进行剪切、拷贝、粘贴操作,交互过程的实现和contextual action bar的实现一样( Enabling the contextual action mode for individual views)
实现选择文字后的浮动工具栏,在app代码中需要做如下修改:
(1)在View 或 Activity对象,ActionMode的调用从startActionMode(Callback) 变为 startActionMode(Callback, ActionMode.TYPE_FLOATING)
(2)替换原有的ActionMode.Callback为ActionMode.Callback2
(3)重写OnGetContentRect()方法,提供内容Rect对象(文本选择的矩形框)在view中的位置
(4)在矩形框作为唯一的元素不再有效时,调用invalidateContentRect() 方法
如果你在使用Android Support Library revision 22.2,需要注意浮动工具栏不向后兼容且因为appcompat默认接管ActionMode对象,阻止了浮动工具栏被显示。为了在AppCompatActivity中支持ActionMode,需要调用getDelegate()方法,之后对返回的AppCompatDelegate对象调用setHandleNativeActionModesEnabled()方法,并设置输入参数为false,该调用将ActionMode对象的控制交还给系统框架层。在Android6.0(API level 23)的设备上,框架层支持ActionBar或浮动工具栏模式,在Android 5.1(API level 22)及以下的设备上,只支持ActionBar模式。

九、浏览器书签变化(Browser Bookmark Changes)
此版本移除了全局书签的支持。android.provider.Browser.getAllBookmarks() 和 android.provider.Browser.saveBookmark()方法被移除,同样的READ_HISTORY_BOOKMARKS和WRITE_HISTORY_BOOKMARKS权限也被移除。如果你app的目标版本是android6.0或更高,请不要访问全局的provider获取书签,而是应该在应用的内部保存书签数据。

十、Android KeyStore变化

此版本上Android Keystore provider不再支持DSA,仍旧支持ECDSA。

锁屏密码在(如用户或设备管理器)禁用或重置的情况下,不需要加密部分将不再被删除,而加密部分则会被删除。

十一、Wi-Fi和网络变化(Wi-Fi and Networking Changes)

此版本在Wi-Fi和网络API执行行为上有如下的变化

(1)现在,你的app只能修改你自己创建的WifiConfiguration对象的状态,而不再允许修改或删除由用户或其它app创建的WifiConfiguration对象

(2)之前,应用可以使用enableNetwork(),设置disableAllOthers=true,来使设备断开其它网络,如蜂窝网络,而强制连接指定的Wi-fi网络。在此版本上,设备将不会从其它网络断开连接。如果你的app的targetSdkVersion是20或者更低,将固定在选择的Wi-Fi网络。如果targetSdkVersion是21或者更高,使用multinetwork APIs (如openConnection(), bindSocket()和bindProcessToNetwork()方法)来保证网络流量被发送到指定的网络上。

十二、相机服务变化(Camera Service Changes)

在此发布版本上,访问相机服务模型将由原来的“先来先服务”方式,改为基于优先级的访问方式。服务行为的变化包括:

(1)客户端应用进程基于优先级的方式访问相机子系统,包括打开和配置设备相机。用户可见的应用进程通常被赋予高优先级,使得相机资源的获取和使用更可靠。

(2)高优先级的应用能够“驱逐”低优先级应用,而使用相机(译注:高优先级应用能以抢占方式使用相机)

(3)在有合适的相机的硬件上,多个应用进程可以同时且独立地使用相机设备。但是,多进程同时访问的情况下,会导致相机设备的性能显著降低,而现在相机服务会检测并不允许此种情况发生。这种变化导致低优先级的应用被“驱逐”,直到没有其它应用直接访问同一个相机设备。

(4)改变当前使用者(译注:多用户情况下的用户切换)后,引起之前使用者所拥有的应用无法再使用相机。访问相机被限制在设备的当前使用者上。实际上,这意味着一个“guest”用户账户在切换到其它用户账户时,不能再保留一个运行的进程访问相机服务。

十三、运行时(Runtime)

ART运行时可以恰当的实现newInstance()的访问规则。这一变化修复了之前版本中,Dalvik不正确的检查访问规则的问题。如在你的app使用newInstance()方法,而且你想利用setAccessible()方法,输入参数为true,改变它的访问规则的情况。如果你的app使用 v7 appcompat library或 v7 recyclerview library,你必须使用这些库的最新版本来更新应用。另外,确保在XML中引用的自定义类也被更新,以便其构造函数能够被访问。

此版本更新了动态链接器(dynamic linker)的行为。动态链接器现在能够识别库的soname和它的路径(public bug 6670)的区别,而且实现了通过soname查找。之前错误使用DT_NEEDED entries(通常以绝地路径的形式在编译应用的设备文件系统中)的应用在加载时可能会失败。

dlopen(3) RTLD_LOCAL 标识现在已被正确实现。注意RTLD_LOCAL是默认的,因此如果调用dlopen(3)时,没有明确使用RTLD_LOCAL也受到影响(除非你的应用明确使用RTLD_GLOBAL)。在设置了RTLD_LOCAL,符号对于后来调用dlopen(3)加载的库是不可用的(与DT_NEED entries的引用不同)。

在Android之前的版本,如果你的应用通过text relocation的方式请求系统加载一个共享库,系统显示一个警告,但仍然允许这个库被加载。在此版本中,如果你的应用的目标版本是大于或等于23的话,系统拒绝加载这个库。为了帮助你检测一个库是否加载失败,你的应用应该记录dlopen(3)的失败日至,而且包括调用dlerror(3)返回的问题描述。查看这个指南了解更多关于text
relocations。

十四、APK验证(APK Validation)

此平台执行更加严格的APK的验证。一个apk如果在manifest中声明了一个并不存在的文件,将被认为是腐败的(corrupt)。apk在移除了任何内容后都必须重新签名。

十五、USB连接(USB Connection)

通过UAB端口连接设备,默认采用仅充电模式。通过USB连接设备并获取内容,必须明确的经过用户授权这种交互权限。如果你的应用支持通过USB端口的交互,要考虑到这种交互必须被明确的启用。

十六、企业Android的变化(Android for Work Changes)

此版本Android for Work包括一下行为的变化:

个人环境中的企业联系人:当用户查看过去的通话记录时,Google拨号器的通话记录显示企业联系人(work contacts)。设置setCrossProfileCallerIdDisabled()为true,在Google拨号器中隐藏企业联系人的通话记录。默认情况下,在设备上通过蓝牙分享联系人时,企业联系人与个人联系人一起显示,除非设置setBluetoothContactSharingDisabled()为false。

Wi-Fi配置移除:通过Profile Owner添加的Wi-Fi配置(例如,调用addNetwork()方法)在其对应的企业配置(work profile)被移除后删除。

Wi-Fi配置锁定:当WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN值为非0时,用户无法修改或删除由启用的设备拥有者(Device Owner)创建的任何Wi-Fi配置。用户依然能够创建或修改他们自己的Wi-Fi配置。启用的设备拥有者拥有编辑或移除任何的Wi-Fi配置,即使这些配置不是它创建的。

通过Google账户添加的下载企业策略控制器(Work Policy Controller):在管控环境之外,当需要进行管理的Google账号要求通过企业策略控制器(WPC)app添加到设备时,新增账号流程会提示给用户去安装合适的WPC。这一行为对通过设置>账号和初始化设备时添加的账号同样起作用。

DevicePolicyManager API的变化:

(1)调用setCameraDisabled()方法,仅影响当前调用相机的用户;在managed profile中调用此方法并不影响primary user中使用相机的app运行。(2)此外,setKeyguardDisabledFeatures()方法对配置拥有者(Profile Owner)和设备拥有者都可用。(3)配置拥有者能够设置如下的锁屏限制:  KEYGUARD_DISABLE_TRUST_AGENTS 和 KEYGUARD_DISABLE_FINGERPRINT, 影响配置父用户(parent user)的锁屏设置  KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS, 仅影响在managed profile中应用产生的通知。(4)createAndInitializeUser() 和 createUser()方法被废弃(deprecated)(5)当给定的应用在前台时,setScreenCaptureDisabled()方法阻塞辅助框架(assist structure)  (6)EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM 默认为SHA-256. SHA-1 作为兼容性的备用,但未来将会被删除。(7)EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM 目前只接受SHA-256。(8)存在与Android6.0(API level 23)的Device initializer APIs现在被移除。(9)EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS被移除,因此,NFC触碰配置不能在代码上解锁一个恢复出厂设置被保护的设备。(10)现在可以使用EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE在managed device上通过NFC触碰传递数据给device owner app(11)Android for Work API在M的运行时权限上进行了优化,包括企业配置(Work profiles),辅助层(assist layer)等。新的DevicePolicyManager 权限API并不影响Android M之前的应用。(12)当用户在初始化设置流程中通过ACTION_PROVISION_MANAGED_PROFILE 或 ACTION_PROVISION_MANAGED_DEVICE intent退出同步部分,系统将会返回RESULT_CANCELED这一返回值

其它API的变化:

数据流量统计(Data Usage):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
原创粉丝点击