android6.0
参考六:Android历史版本 版本号对照 版本分布(截止到2017.11)
参考七:Android发展史(Android各版本特性-技术篇)(至android6.0)
参考八: 了解Android已发布的各种版本(即1.0、2.0、3.0、4.0、5.0、6.0、7.0、8.0)
参考十二:Android6.0动态权限申请步骤以及需要注意的一些坑
参考十三:彻底解决Android6.0权限管理问题
android7.0
参考一:android 7.0新特性
参考二:Android7.0新特性,及Android N适配
参考六:Android 7.0的适配问题,android.os.FileUriExposedException
参考八:android app版本升级(DownloadManager、适配6.0、7.0)
参考九:Android N(Android 7.0)版本适配(开发者应该知道的一切新特性与新功能)
参考十一: Android7.0新特性介绍(二)——通知增强功能
参考十二:android7.0对开发有影响的变动
参考十三:Android7.0适配教程,心得
参考十四:Android 7.0
参考十五:Android 7.0 新特性详解
android8.0
参考一:开发者必看|Android 8.0 新特性及开发指南
参考八:值得你关注的Android8.0(Android O)上的重要变化
参考十一:Android 8.0 功能和 API(developer.android.google.cn)
自己总结
android6.0新特性:
1-android6.0对应api级别为23;
2-android6.0版本引入了一种新的权限模式---运行时权限。
用户可直接在运行时管理应用权限。这种模式让用户能够更好地了解和控制权限,同时为应用开发者精简了安装和自动更新过程。用户可为所安装的各个应用分别授予或撤销权限。
3-android6.0版本引入了针对空闲设备和应用的最新节能优化技术---休眠和应用待机模式(Doze and App Standby)
这些功能会影响所有应用,因此请务必在这些新模式下测试您的应用。
休眠模式(Doze):如果用户拔下设备的电源插头,并在屏幕关闭后的一段时间内使其保持不活动状态,设备会进入低电耗模式,在该模式下设备会尝试让系统保持休眠状态。在该模式下,设备会定期短时间恢复正常工作,以便进行应用同步,还可让系统执行任何挂起的操作。
应用待机模式(App Standby):应用待机模式允许系统判定应用在用户未主动使用它时处于空闲状态。当用户有一段时间未触摸应用时,系统便会作出此判定。如果拔下了设备电源插头,系统会为其视为空闲的应用停用网络访问以及暂停同步和作业。
要详细了解这些节能变更,请参阅对低电耗模式和应用待机模式进行针对性优化。
4-BoringSSL
Android正在将OpenSSL库替换为BoringSSL库。这将影响你的应用在NDK中所链接的加密库,比如libcrypto.so和libssl.so,它们不是NDK API的一部分。这些库不是公开的API,因此在不同版本和设备上的变化也不会及时通知开发者。而且,这也将暴露你应用的安全缺陷。因此,需要修改你的native代码,通过JNI的方式调用Java的加密API或者静态链接你选择的加密库。
5-文本选择(Text Selection)
用户在应用中选择文字后,你现在可以显示一个浮动工具栏(floating toolbar),展示并进行剪切、拷贝、粘贴操作,交互过程的实现和contextual action bar的实现一样( Enabling the contextual action mode for individual views)。
6-USB连接(USB Connection)
android6.0版本,通过UAB端口连接设备,默认采用仅充电模式。通过USB连接设备并获取内容,必须明确的经过用户授权这种交互权限。如果你的应用支持通过USB端口的交互,要考虑到这种交互必须被明确的启用。
7-Android 密钥库变更
android6.0版本开始,Android 密钥库提供程序不再支持 DSA。但仍支持 ECDSA。
停用或重置安全锁定屏幕时(例如,由用户或设备管理员执行此类操作时),系统将不再删除需要闲时加密的密钥,但在上述事件期间会删除需要闲时加密的密钥。
8-WLAN 和网络连接变更。
9-相机服务变更
android6.0中,相机服务*享资源的访问模式已从之前的“先到先得”访问模式更改为高优先级进程优先的访问模式。
(1)客户端应用进程基于优先级的方式访问相机子系统,包括打开和配置设备相机。用户可见的应用进程通常被赋予高优先级,使得相机资源的获取和使用更可靠。
(2)高优先级的应用能够“驱逐”低优先级应用,而使用相机(译注:高优先级应用能以抢占方式使用相机)
(3)在有合适的相机的硬件上,多个应用进程可以同时且独立地使用相机设备。但是,多进程同时访问的情况下,会导致相机设备的性能显著降低,而现在相机服务会检测并不允许此种情况发生。这种变化导致低优先级的应用被“驱逐”,直到没有其它应用直接访问同一个相机设备。
(4)改变当前使用者(译注:多用户情况下的用户切换)后,引起之前使用者所拥有的应用无法再使用相机。访问相机被限制在设备的当前使用者上。实际上,这意味着一个“guest”用户账户在切换到其它用户账户时,不能再保留一个运行的进程访问相机服务。
10-APK 验证
该平台现在执行的 APK 验证更为严格。如果在清单中声明的文件在 APK 中并不存在,该 APK 将被视为已损坏。移除任何内容后必须重新签署 APK。
11-锁屏下语音搜索
用户可以直接在锁屏状态下进行语音搜索,虽然现在的一些安卓手机支持语音唤醒功能,但这些语音唤醒都是第三方厂商开发的,而此次的Android 6.0在系统层面加入锁屏下语音搜索,这无疑会在体验上有一个明显的提升。
12-指纹识别
说到指纹识别,很多用户都会觉得现在的中高端安卓手机都支持,但事实上这些安卓手机的指纹识别都是各个厂商自行开发的并没有系统底层的支持。Android 6.0则在系统层面加入指纹识别,能提供原生指纹识别API,这不但降低了厂商开发指纹识别模块的成本,最重要的是原生指纹识别将会大大提升安卓手机的指纹识别支付安全性。
13-Now on Tap功能
Now on Tap功能是和Google搜索紧密结合的功能,它可以让谷歌从任何应用中进行搜索。例如,在微信中聊天的时候提到餐馆,那么就可以在不跳转的情况下进行谷歌搜索。
14-App Links
通过App Links功能,Android平台能够向网络服务器提出申请,自主识别链接内容。直接跳转到App客户端中,改善用户体验,有利于让用户在体验更完善的App客户端完成更多操作。
此外,在Android 6.0谷歌还加入了Android Pay进一步强化移动支付,同时也是为了对抗Apple Pay。在发布会上谷歌表示Android 6.0将在下周开始推送,Nexus5/6/7/9以及Nexus Player将能够在第一时间得到升级。
15-很有必要说明的(笔者觉得和应用开发密切相关的)共两处,第一Android 2.3,,第二处是6.0 以后的版本了。
首先,Android2.3 与之前的系统有很大改进,具体是,增加nfc 支持,增加sip支持(在没增加这些之前,android开发者要开发nfc或者sip的相关应用的难度和增加之后完全不同,Android2.3 后写nfc 或sip相关程序比之前要容易得多 ),第二个改进是把输入法的框架改了(主要是将之前的java实现变为c实现),结果是2.3以后输入法的输入效率更高了。
至于6.0以后系统,第一开发工具只能用,谷歌官方的Android Studio 了。值得一提的是,从Android 4.4 开始,Android app 运行方式从原来的Dalvik 模式增加了一种可选模式 ART模式(全称是Android Runtime模式)。这种模式使得Android运行app的速度变快了(后面也有博客特别介绍)。还有就是从Android 5.0开始使用linux 3.0内核。这里就是多核处理器优化基础(因为linux内核中对于多核处理器进行了负载均衡处理)。
android6.0开发注意事项:
1-运行时权限检查(Runtime Permisssions)
作为开发者,当你的app的目标版本(target)为Android6.0(API 23)或更高时。
请确保在运行时进行权限的检查和请求。其中,
(1)新的方法checkSelfPermission()可以用来判断你的应用是否被授予了权限
(2)而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)
2-Android6.0版本移除了对Appache的HTTP Client(Apache HTTP Client Removal)
如果您的应用使用该客户端,并以 Android 2.3(API 级别 9)或更高版本为目标平台,
(1)请改用 HttpURLConnection 类,此 API 效率更高,因为它可以通过透明压缩和响应缓存减少网络使用,并可最大限度降低耗电量。
(2)如果要继续使用 Apache HTTP API,您必须先在 build.gradle 文件中声明以下编译时依赖项:
android {
useLibrary 'org.apache.http.legacy'
}
3-获取硬件标识符(Access to Hardware Identifier)
android6.0中,为了更好的保护用户的数据,
(1)Android移除了从代码中通过Wi-Fi和蓝牙的API访问设备本地网络标识符。因此WifiInfo.getMacAddress()和BluetoothAdapter.getAddress()将始终返回02:00:00:00:00:00
(2)而为了能够通过Wi-Fi和蓝牙扫描时,获取周边设备的硬件标识符,应用必须具有ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION权限:
WifiManager.getScanResults()
BluetoothDevice.ACTION_FOUND
BluetoothLeScanner.startScan()
注意:当运行Android6.0(API level 23)的设备启动后台Wi-Fi或蓝牙扫描时, 此操作对外部设备是可见的,且被显示为一个随机MAC的地址。
4-BoringSSL
5-通知(Notifications)
(1)移除了Notification.setLatestEventInfo()方法。
(2)用Notification.Builder类来构造通知,在需要反复更新通知的情况下,保存并重用Notification.Builder的实例;在获取更新后的Notification实例时,调用其build()方法。
(3)adb shell dumpsys notification命令不再输出你的通知文本,而adb shell dumpsys notification --noredact命令将输出一个notification对象的文本。
6-AudioManager Changes
android6.0不再支持通过AudioManager类来直接对特定的音频流设置音量和静音,因此:
(1)setStreamSolo()方法过时(deprecated),替换调用requestAudioFocus()方法.
(2)setStreamMute()方法过时,替换调用为adjustStreamVolume()方法,传入的值也变为ADJUST_MUTE 或 ADJUST_UNMUTE。
7-文本选择(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模式。
8-浏览器书签变化(Browser Bookmark Changes)
android6.0移除了全局书签的支持。
(1)android.provider.Browser.getAllBookmarks() 和 android.provider.Browser.saveBookmark()方法被移除;
(2)同样的READ_HISTORY_BOOKMARKS和WRITE_HISTORY_BOOKMARKS权限也被移除。
(3)如果你app的目标版本是android6.0或更高,请不要访问全局的provider获取书签,而是应该在应用的内部保存书签数据。
9-Wi-Fi和网络变化(Wi-Fi and Networking Changes)
android6.0在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()方法)来保证网络流量被发送到指定的网络上。
10-企业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这一返回值。
11- 其它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