随着新的特性和功能,在Android6.0(API 23)包括各种系统的变化和API变化。本文主要介绍了一些你应该了解和您的应用程序占有的关键变化。如果您之前已经发布过Android的应用程序,要知道,这些变化会影响您的应用程序。
1.运行权限
Android6.0引入了新的权限模型,用户现在可以直接在运行时管理应用程序的权限。这种模式为用户提供了改进的可见性和控制限,同时简化了应用程序开发人员安装和自动更新过程。用户可以对安装的应用单独授予或撤销权限。
在您的应用程序适用于Android6.0(API 23)以上时,确保在运行时检查和请求权限。调用新的checkselfpermission()方法,去判断你的应用程序是否已被授予权限。调用新requestPermissions()方法,去请求权限。即使你的应用程序不是针对Android6.0(API23),你也应该下的新的权限模式下测试你的应用程序。
关于在应用程序中支持新权限模式的详细信息,点击Working with System Permissions。关于如何评估对你的应用程序的影响的提示,点击Permissions Best Practices。
2.休眠和应用待机
Android6.0对闲置设备和应用引入了新的节能优化。这些特性会影响所有的应用程序,因此确保在这些新模式测试您的应用程序。
要了解更多关于这些节能的变化,点击Optimizing for Doze and App Standby。
3.Apache的HTTP客户端去除
Android的6.0版本中删除了的Apache HTTP客户端支持。如果您的应用程序使用此客户端和目标为Android2.3(API 9)或更高,使用HttpURLConnection类代替。这个API提高了效率而且最大限度的减少功耗,因为它通过明显的压缩和响应网络缓存减少了网络的使用。为了能继续使用Apache HTTP APIs,你必须在build.gradle做如下声明:
android {
useLibrary 'org.apache.http.legacy'
}
4.BoringSSL
Android正在从OpenSSL迁移到BoringSSL库,如果你正在你的应用中使用Android NDK,不要链接不属于NDK API的一部分的密码库,比如libcrypto.so和libssl.so。这些库不是公共的 APIs,可能在跨版本和设备中改变或中断而没有发出通知。另外,你也可能暴露自己的安全漏洞。相反,通过JNI或你选择的静态链接密码库修改你的本地代码去调用java加密API通过JNI或静态链接和密码库。
5.访问硬件标识符
为了给用户提供更高的数据保护,从这个版本开始,Android对使用的Wi-Fi和蓝牙API的应用删除了程序访问设备的本地硬件标识符。方法WifiInfo.getMacAddress()和BluetoothAdapter.getAddress()现在返回一个常量02:00:00:00:00:00。要通过蓝牙和Wi-Fi扫描访问附近外部设备的硬件标识码,您的应用程序现在必须有ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限:
注意:当运行Android6.0(API 23)的设备启动的后台Wi-Fi或蓝牙扫描,这个操作是可见的随机MAC地址的外部设备。
6.通知栏
Android的6.0版本中删除了Notification.setLatestEventInfo()方法。用Notification.Builder类构造通知。要反复更新通知,复用Notification.Builder实例。调用build()方法获取最新的Notification 实例。
adb shell dumpsys notification命令不再打印通知文本,代替使用adb shell dumpsys notification --noredact命令在一个通知对象中打印通知文本。
7.AudioManager变化
Android的6.0版本中不再支持通过AudioManager直接设置音量或类静音特定流。setStreamSolo()方法已经过时,你应该用requestAudioFocus()方法。同样,setStreamMute()已经过时,代替的调用方法 adjustStreamVolume()传入ADJUST_MUTE或者ADJUST_UNMUTE。
8.文本选择
当用户在你的应用中选中文本时,你现在可以在floating toolbar显示选中的操作,比如剪切、复制和粘贴。用户交互的实现类似于contextual action bar,如 Enabling the contextual action mode forindividual views。
为了实现对文本选择浮动工具栏,请在现有应用程序中进行以下更改:
1)在你的View或者Activity对象中,改变你ActionMode调用方法startActionMode(Callback)为startActionMode(Callback,ActionMode.TYPE_FLOATING)。
2)把现有的实现ActionMode.Callback替换为继承ActionMode.Callback2。
3)重写onGetContentRect()方法来提供内容的矩形对象在视图中的坐标(如文本选择矩形)。
4)调用invalidateContentRect()方法是使矩形定位不再有效的唯一要素。
如果你正在使用Android SupportLibrary22.2,注意,要知道浮动工具栏是不向后兼容的,默认情况下由appcompat代替ActionMode。这可以防止浮动工具栏的显示。为了使ActionMode在AppCompatActivity中支持,调用getDelegate()方法,然后再返回AppCompatDelegate中调setHandleNativeActionModesEnabled()并且传递参数为false。这个调用返回ActionMode的控制对象到framework在Android6.0(API23)设备上,framework支持ActionBar和floating toolbar模式,但是在 Android 5.1 (API level 22) 或者更低版本的设备上,只支持ActionBar 模式。
9.浏览器的书签变化
Android的6.0版本中删除支持全局书签。android.provider.Browser.getAllBookmarks()方法和android.provider.Browser.saveBookmark()方法被删除。同样,READ_HISTORY_BOOKMARKS和WRITE_HISTORY_BOOKMARKS权限被删除。如果你的应用程序中的目标是Android6.0(API23)或更高,不要从全局provider 或者书签权限访问书签。相反,你应该在应用内存储书签数据。
10.AndroidKeystore变化
Android的6.0版本中,Android Keystore provider不再支持DSA。ECDSA仍然被支持。未使用的不需要加密的Keys 当安全的锁屏被禁用或重置(例如,由用户或设备管理员)时将不再被删除。而在前面情况中未使用需要加密的Keys将会被删除。
11.Wi-Fi和网络的变化
Android的6.0版本中对Wi-Fi和网络APIs引入了以下变化:
12.CameraService变化
Android的6.0版本中,访问相机服务共享资源的模式从之前“先来先服务”改变为“高优先级进程优先”的模式。服务行为的变化包括:
13.运行
ART运行现在可以正确的实现访问规则newInstance()方法。这种变化修复了在以前的版本中Dalvik检查问规则不正确的问题。如果你的应用使用了newInstance()方法,你想要重写访问检查,调用setAccessible()方法并且传入参数true。如果你的应用使用了v7 appcompat library或者v7 recyclerview library,去使用这些库的最新版本。另外确保XML中引用的任何自定义类都被更新,以便这些类的构造函数可以访问。
此版本更新动态链接器的行为。动态链接器现在明白了一个库的现在和它的路径(公共bug 6670)的差异,现在搜索已经实现。之前运行时有坏的DT_NEEDED条目(通常生成计算机上的文件系统是绝对路径)的应用,当被加载的时候可能失败。
标志dlopen(3) RTLD_LOCAL现在可以正确实现。需要注意的是RTLD_LOCAL是默认的,所以调用执行dlopen(3)没有明确使用RTLD_LOCAL会受到影响(除非你的应用程序明确使用RTLD_GLOBAL),符号将不被提供给由以后调用dlopen(3)去加载库(与引用DT_NEEDED是相对)。
在Android的早期版本中,如果您的应用程序请求系统加载的共享库文本重定位,系统显示一个警告,但仍允许库被加载。在这个版本开始,如果您的应用程序的目标SDK版本是23或更高版本的系统将拒绝该库。为了帮助你发现一个库是否加载失败,您的应用程序应该记录的dlopen(3)故障,并包括问题的描述文本dlerror(3)
调用返回。要了解更多关于处理文本重定位,请参阅guide。
14.APK验证
Android的6.0版本中执行严格的APKs验证。如果一个文件在manifest 声明,但是APK中没有这个文件,那么这个APK就会被认为是腐败的。如果有任何内容被删除,一个APK必须重新签名。
15.USB 连接
设备通过USB端口连接默认情况下被设置为充电模式。通过USB连接访问设备和设备内容,用户必须明确的授予权限。如果你的应用支持通过USB端口对设备的用户交互,注意交互必须显式启用。
16.Androidfor Work变化
Android的6.0版本中包括Android for Work的以下行为的变化:
1)调用setCameraDisabled()方法仅仅影响相机调用者。从管理配置文件中调用不会影响主用户运行的相机应用。
2)此外,setKeyguardDisabledFeatures()方法现在除了设备用户可用外,对配置用户也可用。
3)一个配置用户可以设置keyguard 约束:KEYGUARD_DISABLE_TRUST_AGENTS和KEYGUARD_DISABLE_FINGERPRINT影响父用户keyguard 设置。KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS只影响配置文件里的应用产生的通知。
4)DevicePolicyManager.createAndInitializeUser()和DevicePolicyManager.createUser()方法被废弃。
5)当给定用户的应用程序是在前台,setScreenCaptureDisabled()方法现在也阻塞辅助结构。
6)EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM现在默认是SHA-256。SHA-1仍然向后兼容,但是在未来可能被移除。EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM现在只接受SHA-256。
7)在Android 6.0(API 23)存在的设备初始化的API现在被删除。
8)EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS被移除,因此NFC凹凸配置不能以编程方式解锁工厂复位保护装置。
9)你现在可以额外的使用EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE在被管理设备的NFC供应期间将数据传递给设备所有者的应用。
10)Android for Work API是对于M运行权限优化,包括工作配置文件,辅助层,和其它方面。新DevicePolicyManager权限的API不影响pre-M的应用程序。
11)当用户退出通过ACTION_PROVISION_MANAGED_PROFILE或ACTION_PROVISION_MANAGED_DEVICE意图发起的设置流程的同步部分,目前该系统会返回一个RESULT_CANCELED结果码。
数据的使用: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