文章目录
  1. 1. Android 6.0 API Level 23
    1. 1.1. 新增
    2. 1.2. 改变
    3. 1.3. 删除
  2. 2. Android 7.0 API Level 24 25
    1. 2.1. 新增
    2. 2.2. 改变
    3. 2.3. 删除
    4. 2.4. API 23 -> API 24
  3. 3. Android 8.0
    1. 3.1. 面向开发者的新功能
      1. 3.1.1. 通知
      2. 3.1.2. 自动填充框架
      3. 3.1.3. 画中画(PictureInPicture,PIP)模式
      4. 3.1.4. 处理字体
      5. 3.1.5. 接听权限ANSWER_PHONE_CALLS
      6. 3.1.6. 内容提供程序分页
      7. 3.1.7. 无障碍功能
      8. 3.1.8. 其他功能
    2. 3.2. 改变
    3. 3.3. 针对Android O的应用
    4. 3.4. 功能和API

如今Android 已经出到了O (Android 8.0, API Leve 26), 多个版本累加起来变化颇多, 记录一下.
从新增/改变/删除角度记录, 主要搬运官网.

Android 6.0 API Level 23

以前写过一篇Android 6.0小记, 这回新瓶装旧酒, 换种组织方式再写一下.

新增

  • 运行时请求应用权限. 这是一种新的权限请求方式, 它允许应用通过requestPermissions()来实时请求权限. 需要注意, 在Android 6.0的操作系统环境下, 应用的所有权限都可以随时被取消, 所以即便你在App中注册了权限, 你运行时也应该检查一下是不是已经获得了权限. 一种典型的情况是, 你注册了权限, 也成功运行了App并获取了权限, 但用户出于某些缘故把你申请的权限取消了, 此时哪怕你仍然在运行, 也应该在执行需要权限的操作前检查自身权限. 检查权限可调用checkSelfPermission()方法.
  • 应用待机模式. 系统通过一段时间是否触摸屏幕判定是否进入待机模式, 并根据是否连接电源采取不同的处理策略, 以延长待机时间. 主要是限制被判定为待机模式的应用的网络访问, 同步, 闹钟等功能. 应用可申请加入白名单, 以保留网络访问, 但其他方面仍受限制.
  • 低耗电模式. 系统在未插入电源且屏幕关闭后静止一定时间, 会进入低耗电模式. 该模式下会推迟Activity活动, 网络访问, 同步, 闹铃, 并定期退出低耗电模式统一完成这些操作.
  • 文本选择时新增浮动工具栏. 交互方式与在单个视图中启用上下文操作模式类似.

  • 指纹验证FingerpringManager类及权限.

  • 确认凭据, 通过上次解锁与本次解锁的时间间隔来验证身份, 结合你应用自身的公钥或私钥, 完成身份验证. 通过createConfirmDeviceCredentialIntent()发起新验证, 通过setUserAuthenticationValidityDurationSeconds()设置同一密钥的有效期.
  • 应用链接(App Linking). 可令应用与某个特定Web域关联, 系统处理特定Web域的时候就会默认使用该应用, 而无需用户选择.
  • 自动备份应用. 目标平台在23以上的应用, 系统会通过Google账户为其自动执行完整的数据备份或恢复.
  • 直接共享. 提供ChooserTargetService类以供扩展, 可以直接发起一次共享调起其他应用的特定Activity. 可以指定某个Activity为可供直接共享的公开Activity. 有点类似于ContentProvider.
  • 新的语音交互API.
  • 助手程序. 用户在手动开启助手功能后, 可以通过长按”首页”按钮在任何应用内召唤助手.
  • 可采用的存储设备(adoptable storage device).
  • 在Nexus 6和Nexus 9上添加了对Hotspot 2.0的支持.
  • 新增4K显示模式. 新增Display.ModeAPI.
  • ColorStateList现在也可以使用主题属性.

改变

  • SSL库从OpenSSL迁移到BoringSSL. 主要影响使用加密库的项目, 如果使用NDK编译, 不要链接到非NDK API组成部分的加密库, 例如libcrypto.so, libssl.so, 因为并非公共API, 所以在不同版本的系统或设备上可能会引起故障或行为变化, 且存在安全漏洞. 如果要用, 应当静态链接.
  • 修改直接获取硬件标识符的API. 对于使用WLAN API和Bluetooth API的应用, 从前可通过WifiInfo.getMacAddress()BluetoothAdapter.getAddress()方法拿到硬件Mac值, 现在这两个接口返回常量值02:00:00:00:00:00. 想要获取Mac值, 需要ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION权限.
  • Notification.setLatestEventInfo()移除, 改为Notification.Builder构建通知. adb shell dumpsys notification --noredact打印notification对象中的文本.
  • 不再通过AudioManager直接修改音量, 弃用setStreamSolo(), setStreamMute(), 应当分别改为调用requestAudioFocus(), adjustStreamVolume(传入方向值ADJUST_MUTE ADJUST_UNMUTE).
  • Android密钥库不再支持DSA, 仍支持ECDSA.
  • WLAN和网络连接变更. 现在应用只能修改自己创建的WifiConfiguration对象状态.
  • 相机服务变更. 相机服务中共享资源的访问模式由”先到先得”改为”高优先级进程优先访问”. 低优先级进程可能会被驱逐, 导致回调断开相机服务的函数. 活动的相机客户端仅属于当前账户, 切换账户会导致客户端断开.
  • 运行时. 正确实现了newInstance()访问规则检查. 更新了动态链接程序的行为, 可识别soname与其路径之间的差异, 并能按soname搜索. 正确实现dlopen(3) RTLD_LOCAL标记. 在目标SDK高于23时, 直接加载包含文本重定位信息的共享库会被拒绝, 可以通过检查dlopen(3)失败日志并通过dlerror(3)获得调用返回的问题描述文本来确定库加载是否成功.
  • 更严格的APK验证. 如果清单中声明的文件在APK中不存在, 该APK会被视为已损坏.
  • USB连接. 默认情况下USB连接设置为仅充电, 需要手动显式授予权限给数据访问等其他交互方式.
  • 改善对蓝牙触控笔的支持.
  • 改进蓝牙低功耗扫描.
  • 增强音频功能. 添加了对MIDI的支持.
  • 增强视频功能. 新增MediaSync类帮助应用同步渲染音频流和视频流.
  • 增强相机功能. 新提供Flashlight API和Reprocessing API系列接口.

删除

  • 不再支持Apache HTTP客户端. 应当改用HttpURLConnection.
  • 移除对全局书签的支持. 移除android.provider.Browser.getAllBookmarks() android.provider.Browser.saveBookmark()方法和READ_HISTORY_BOOKMARKS WRITE_HISTORY_BOOKMARKS权限.

Android 7.0 API Level 24 25

新增

改变

  • 低耗电模式在手机不处于静止状态时也适用.
  • 面向Android 7.0及以上版本的应用, 私有目录被限制访问(0700).
    这将导致几个副作用:
    1. 自主扩大访问权限的行为受到影响, 例如使用MODE_WORLD_READABLEMODE_WORLD_WRITEABLE将引发SecurityException(但使用原生API或File API修改权限仍然不被限制, 尽管官方强烈反对);
    2. 尝试传递file://URI会触发FileUriExposedException, 推荐使用FileProvider分享私有文件内容;
    3. DownloadManager不再按文件名分享私人存储的文件. 面向Android 7.0或更高版本的应用在尝试访问COLUMN_LOCAL_FILENAME时会触发SecurityException, 除非DownloadManager设置为将文件存放在公共位置, 但官方强烈反对这种使用方法. 首选访问方式是使用ContentResolver.openFileDescriptor().
  • 面向Android 7.0的应用, StrictMode API禁止在应用外公开file://URI, 如果包含文件URI的intent发送超出你应用的范围, 则引起FileUriExposedException异常, 应当使用content://URI并授予URI临时访问权限, 以在应用间共享文件. 例如使用FileProvider进行授权.
  • 无障碍改进. 支持用户设置显示尺寸, 设备密度会因此改变, 面向API 23及以下的应用会被终止后台进程, 面向Android 7.0的应用所有进程都会收到有关配置变更的通知; 设置向导中增加视觉设置.
  • NDK应用链接至平台库. 从Android 7.0开始, 系统阻止应用动态链接到非公开NDK库. 需要注意您的应用中的第三方静态库可能会这么做, 因此应当检查确保应用不会在Android 7.0崩溃. 如果要使用原声代码, 只能使用公开的NDK API. 要使用私有库, 就需要将其添加到应用中. Android 7.0 SDK带有工具readelf, 使用以下命令可以生成给定的.so文件的所有动态链接的共享库列表: aarch64-linux-android-readelf -dW libMyLibrary.so.

删除

  • 删除三个隐式广播: CONNECTIVITY_ACTION ACTION_NEW_PICTURE ACTION_NEW_VIDEO. 移动设备会经历频繁的连接变更, 其他应用例如相机可能会发送隐式广播ACTION_NEW_PICTUREACTION_NEW_VIDEO, 这三种广播的发送都非常频繁, 导致所有注册了的接收者都会被唤醒. 删除后, 面向Android 7.0开发的应用不再收到CONNECTIVITY_ACTION广播, 即使它声明接收, 除非它在前台运行并使用BroadcastReceiver请求接收通知. 所有应用都将无法发送或接收ACTION_NEW_PICTURE ACTION_NEW_VIDEO广播.

API 23 -> API 24

网页端

Android 8.0

面向开发者的新功能

本文摘录一部分, 完整版见官网.

通知

重新设计通知, 使管理通知行为和设置更加轻松和统一.

  • 通知渠道. 允许为要显示的每种通知类型创建用户可自定义的渠道. 用户界面将通知渠道称为通知类别.
  • 休眠. 用户可以将通知置于休眠状态, 稍后重新显示. 应用可以移除或更新已休眠的通知, 但更新不会使它重新显示.
  • 通知超时. 使用Notification.Builder.setTimeout()可以设置超时, 在指定的持续时间之后取消通知, 也可以提前取消通知.
  • 通知清除. 系统现在可以区分用户清除和应用清除. 在NotificationListenerService.onNotificationRemoved()方法中可以得知.
  • 背景颜色. 为通知设置背景颜色.
  • 消息样式. MessagingStyle可以在通知的折叠形式中显示更多内容.

自动填充框架

Android O 引入自动填充框架, 新老应用都可以用此简化登陆和表单填写等工作.

画中画(PictureInPicture,PIP)模式

PIP模式是一种特殊的多窗口模式, 在Android TV中最早出现, 现在可应用于搭载 Android O的其他设备. Activity处于PIP模式时, 它会处于暂停状态, 但仍继续显示内容. 因此, 假如是一个支持PIP模式的视频播放Activity, 应该在onPause中继续播放, 而在onStop中才暂停播放, 并在onStart中继续播放. 其需要注意的除了跟多窗口模式一样以外, 但区别于多窗口模式, 只需要在清单中将android:supportsPictureInPicture设置为true, 无需将android:resizeableActivity设置为true, 后者仅在需要支持其他多窗口模式时才需要.
为了完成PIP模式, Android O引入了一个新对象android.app.PictureInPictureArgs, 可以将该对象传递给PIP方法, 用以指定某个Activity在其处于PIP模式时的行为. 点击查看如何添加画中画.

处理字体

XML中允许使用字体作为资源. 字体可以不再以资产的形式存放, 并可通过R文件访问. Android O提供机制用于检索与系统字体有关的信息并提供文件描述符, 详情参见处理字体.

接听权限ANSWER_PHONE_CALLS

Android O引入权限android.permission.ANSWER_PHONE_CALLS, 应用可按照设定的方式接听拨入的电话.

内容提供程序分页

更新了内容提供程序(ContentProvider), 以支持大型数据集, 每次加载一页. 客户端和提供程序都必须实现分页.

无障碍功能

Android O提供以下功能, 支持应用创建自己的无障碍服务.

  • 语言检测. 使用TextClassificaationManager.detectLanguages()检测”TTS”工具在某个文本范围内识别的语言.
  • 无障碍功能按钮. 可以通过设置标志请求系统在导航区域显示你的无障碍服务的功能按钮, 并调用你自己注册的按钮回调.
  • 指纹手势. 现在指纹传感器支持指纹手势, 如上下左右滑动, 但你的服务仅能在指纹传感器不用于身份验证时才可使用它.
  • 字词级突出显示.
  • 提示文本. 可以通过AccessibilityNodeInfo.getHintText()获取EditText的提示文本, 即便它当前并未显示提示文本.
  • 连续的手势分派. 可以使用GestureDescription.StrokeDescription构造函数的最后一个参数指定属于同一设定手势的笔划的顺序.

其他功能

  • 自适应启动器图标. 可以在不同设备型号上显示不同形状的图标.
  • 颜色管理. 现在可以支持广色域彩色显示的新设备, 需要在Activity中启用一个标志.
  • WLAN感知. 基于周边感知联网(NAN)规范, 在具有相应感应器的设备上, 应用可以与之通过WLAN进行搜索和通信, 无需依赖互联网接入点.
  • 配套设备配对, Android O允许自定义配对请求对话框.
  • WebView API. 提供多种API以增强应用的稳定性和安全性. 见管理WebView
  • 固定快捷方式和小部件.
  • 媒体功能增强.
  • 多显示器支持.
  • 新的帐号访问和Discovery API
  • AnimatorSet支持寻道和倒播.
  • 自动调整TextView大小.
  • 应用可以声明它们所属的类别, 这将用于分类呈现给用户.
  • 应用可获得一定的磁盘空间配额用于缓存数据, 在系统需要释放磁盘空间时会优先释放超过配额最多的应用的缓存文件, 应用可以针对每个目录设定两种行为, 以控制系统如何释放该数据: 1. 将指定的目录作为不可分割的整体进行删除; 2. 指示不应该删除某个文件, 而是将它截断为0字节.
  • 有关企业版Android(Android for Work)的更新.
  • 更新了Java编程语言支持.

改变

  • 后台执行限制. 当应用进入已缓存状态时, 如果没有活动的组件, 系统将解除应用具有的所有唤醒锁.
  • 降低了后台应用接收位置更新的频率.
  • 蓝牙ScanRecord.getBytes()不再对所接收的字节数做任何假定. 返回的字节数可能会超过之前最大60字节的限制, 也可能小于.
  • 无障碍服务现在可识别TextView内部的所有ClickableSpan实例.
  • 安全性增强. 不再支持SSLv3; 使用HttpsURLConnection建立HTTPS连接时, 如果服务器未正确实现TLS协议版本, 不再采取回退到之前的TLS协议版本的权宜之计; Android O将使用安全计算过滤器过滤所有应用, 系统调用仅允许通过bionic公开的系统调用; WebView在多进程模式下运行, 网页内容在独立的进程, 与应用进程相隔离; APK不能假设驻留在名称以-1或-2结尾的目录中, 应用应当使用sourceDir获取目录; 增强原生库安全性.
  • 隐私性. 改变了标识符处理方式, 现在通过应用而不是用户来确定ANDROID_ID的值范围. 对于同一包名和签名的应用, 卸载或重新安装时ANDROID_ID值不变, 如果软件包签名密钥因为系统更新而改变, ANDROID_ID值也不变; 查询net.hostname系统属性, 返回为空.
  • 记录未捕获的异常. 如果异常未被移交给默认的Thread.UncaughtExceptionHandler, 系统将会记录异常堆栈跟踪情况. 建议自定义Thread.UncaughtExceptionHandler的实现始终移交给默认处理程序处理.
  • 联系人提供程序 使用情况统计方法变更. 应用请求READ_CONTACTS权限, 使用情况数据查询会返回近似值, 此前是返回精确值.
  • 集合的处理. AbstractCollection.removeAll()AbstractCollection.retainAll() 始终引发 NullPointerException, 以符合文档要求.

针对Android O的应用

那些compileSdkVersiontargetSdkVersion在Android O及以上的应用, 开发者需要按如下指导修改以正确支持相应行为.

  • 提醒窗口. 使用SYSTEM_ALERT_WINDOW权限的应用必须使用新的TYPE_APPLICATION_OVERLAY窗口类型来在其他应用和系统窗口上方显示提醒窗口, 以前的多个窗口类型不可用. 该新窗口类型具有以下特性: 始终显示在状态栏和输入法等关键系统窗口下面; 系统可以移动该窗口或调整其大小, 以改善屏幕显示效果; 用户可以打开通知栏设置阻止应用使用该类型的提示窗口.
  • 内容变更通知. ContentResolver.notifyChange()registerContentObserver(Uri, boolean, ContentObserver)接口需要在URI中定义一个有效的ContentProvider, 这可以防范来自恶意应用的内容变更.
  • View焦点. 现在View默认也可以成为焦点.
  • 安全性. 网络安全性配置设置为不允许明文流量的话, WebView将无法通过HTTP访问网站.
  • 权限. 此前, 应用在运行时请求权限并且被授予该权限, 那么在清单中注册的同一组的其他权限也将被一起授予. 现在, 这些同组权限不会在此时被授予, 但如果请求的某一权限被授予, 则后续对同组其他权限的请求将会立即被授予.
  • 集合处理. 此前, List.sort()的默认实现会调用Collections.sort(), 在Android O中则恰好相反. 但此时有以下限制: List.sort()的实现不能调用Collections.sort(), 显然因为循环调用; 重写sort的时候也要异常小心, 区分API级别来调用不同的默认实现或者调用与sort不存在依赖关系的方法来实现; 此前, 在List迭代过程中Collections.sort()List进行排序不会引发异常, 此项变更使得该方式也抛出ConcurrentModificationException异常.
  • 类加载行为. 不支持多个类加载器加载同一个DexFile对象来定义类, 否则引发InternalError错误. DexFile API现已弃用. 所有类加载器都被视为支持并行运行. 多个线程用同一个类加载器加载相同的类时, 第一个完成操作的线程胜出, 操作结果可以用于其他线程.

功能和API

  • 后台执行限制. Android O对应用在后台运行时可以执行的操作施加了限制. 应用在后台服务和广播两方面存在限制, 在多数情况下应用可以使用JobScheduler作业克服这些限制. Android O对JobScheduler提供了多个改进.
  • 对于后台应用, 位置检索行为将受到限制, 频率降低.
  • Notification Badges. 前面介绍过, 类似于3D Touch的快捷方式.
  • 以O为目标的应用, 显示通知需要实现一个或多个通知渠道(channel), 优先级(重要性)由以前的为单个通知指定变更为适用于整个通知渠道.
  • Autofill Framework. 全新的自动填充框架, 提供一个服务, 应用可以利用该服务使用自动填充.
  • Unknown App Install Permission. 这是一个权限, 允许App安装其他的未知App, 用户可以选择哪些应用具有这种权限. App需要在清单中声明, 在运行时申请该权限.
  • Pointer Capture. 这是鼠标动作捕捉机制. 在类似游戏/远程桌面/虚拟客户端等场景下, 控制鼠标点击很有用处. 该机制下, 获得焦点的View可以捕捉MotionEvent, 在回调中自行处理所有捕捉到的事件.
文章目录
  1. 1. Android 6.0 API Level 23
    1. 1.1. 新增
    2. 1.2. 改变
    3. 1.3. 删除
  2. 2. Android 7.0 API Level 24 25
    1. 2.1. 新增
    2. 2.2. 改变
    3. 2.3. 删除
    4. 2.4. API 23 -> API 24
  3. 3. Android 8.0
    1. 3.1. 面向开发者的新功能
      1. 3.1.1. 通知
      2. 3.1.2. 自动填充框架
      3. 3.1.3. 画中画(PictureInPicture,PIP)模式
      4. 3.1.4. 处理字体
      5. 3.1.5. 接听权限ANSWER_PHONE_CALLS
      6. 3.1.6. 内容提供程序分页
      7. 3.1.7. 无障碍功能
      8. 3.1.8. 其他功能
    2. 3.2. 改变
    3. 3.3. 针对Android O的应用
    4. 3.4. 功能和API