6.0 Marshmallow API23

  • 运行时权限
  • 低电耗模式
    • 低电耗模式 - 设备屏幕关闭且未插入电源,并且保持一定时间不活动状态,整个设备会进入低电耗模式,在这个模式下系统会限制应用访问网络和CPU,并延迟作业和闹钟;
    • 应用待机模式 - 系统判定哪些应用是用户没有在使用的,当用户有一段时间没有和应用发生交互,应用会被视为闲置的,并限制闲置应用访问网络,以下应用不会被视作闲置的:
      • 用户近期启动的应用;
      • 有前台服务或前台活动的应用;
      • 生成用户可在锁定屏幕或通知栏中看到的通知的应用;
      • 一些和系统紧密相关的应用;
  • Apache HTTP客户端被默认取消,不过可以通过gradle配置继续使用;
  • SSL库从OpenSSL替换为BoringSSL;
  • 部分硬件标识符被禁止访问,包括Wifi和Bluetooth的mac地址,如果希望获取这些信息,应用必须拥有定位相关运行时权限;
  • Notification API变更
  • AudioManager API变更
  • 文本选择与Action Mode相关变更,不过基本上没人用Action Bar。。
  • 禁用浏览器全局书签
  • Android密钥库提供程序不再支持DSA,但ECDSA依然支持
  • WLAN和网络链接
    • 应用只能修改自己创建的WifiConfiguration;
    • 如果应用利用带有disableAllOthers=true设置的enableNetwork强制设备连接特定WLAN,设备会断开移动数据网络并固定使用特定的WLAN网络;修改为当TargetSdkVertion为21或以上时不再有以上行为,应用必须使用openConnection(), bindSocket(), bindProcessToNetwork()来确保使用特定网络传输流量。
  • 相机服务变更
    • 按照应用进程优先级授予对相机子系统资源的访问权,而不是按照先到先得
    • 高优先级应用尝试使用相机时,系统会驱逐正在使用相机的低优先级应用
    • 禁止多个进程同时独立打开和使用不同的相机设备
    • 账号切换后,仅当前帐号用户可以访问相机,之前用户下的应用程序如果正在使用相机,会被驱逐
  • ART运行库修复了Dalvik中newInstance方法的访问规则错误问题
  • APK验证更为严格
  • USB连接默认设置为仅充电模式
  • 其他
    • NetworkUsageStats被重命名为NetworkStats
    • setGlobalSettings可设置的设置项变更

7.0 Nougat API24

  • 电池和内存优化
    • 低电耗模式加强,6.0是手机静止才会进入,7.0变成为智能识别场景,智能进入;
    • target sdk在7.0以上的无法静态注册CONNECTIVITY_ACTION广播,任何应用都无法接受ACTION_NEW_PICTURE和ACTION_NEW_VIDEO广播
  • 文件权限优化
    • 强烈建议使用ContentProvider的方式在应用间共享数据而不是使用sd开公共目录共享数据
    • 禁止将file:// 提供给其他应用
  • 无障碍改进
    • 支持屏幕缩放,屏幕缩放设置变更时对于target sdk在23或更低的后台应用直接杀死,就好像内存不足时系统所会做的那样,对于前台应用发送配置变更通知
    • 支持设置字体和显示大小
  • 禁止应用动态链接到非公开NDK库,不过部分常被链接的非公开库在应用的target sdk为23或以下时,暂时只会触发Logcat中的Warning,给开发者一些时间做适配,后续更新系统后会导致应用崩溃;
  • 修复注解可见性错误的问题,该问题导致部分原本不可在运行时可见的注解在运行时可见;
  • 其他

8.0 Oreo API 26

  • 后台执行闲置,对于target sdk在26或以上的应用,增加了如下限制:
    • 后台应用对后台服务的访问受到限制
    • 后台应用无法使用大部分隐式广播
    • 后台应用调用位置相关API时,将获取缓存的值,该值每小时只会更新几次
  • 应用快捷方式相关变更
    • 不再可以接收INSTALL_SHORTCUT广播
    • 通过ACTION_CREATE_SHORTCUT Intent创建的快捷方式可以通过ShortCutManager管理
  • 语言区域相关API
    • 7.0引入了指定默认区域的概念,但部分和区域相关的API在无参数时,使用的不是当前区域,8.0开始它们都会使用当前默认区域;
  • 如果应用拥有SYSTEM_ALERT_WINDOW权限,那么以下类型的窗口:TYPE_PHONE, TYPE_PRIORITY_PHONE, TYPE_SYSTEM_ALERT等,从8.0开始,都会被转换成TYPE_APPLICATION_OVERLAY,这样的窗口显示在系统状态栏和输入法下方,应用活动前方,而在8.0之前,这些类型会显示在TYPE_APPLICATION_OVERLAY窗口的下方;
  • 由于Chrome操作系统支持Android应用,开始有用户使用键盘作为输入设备,因此补充了键盘导航相关能力;
  • 对网络链接和HTTP(S)链接行为的变更
    • 部分返回数据规范,开发者需注意代码兼容逻辑
    • 其他协议实现变更
  • 蓝牙ScanRecord.getBytes()检索的数据长度不再有隐式的最大或最小字节数
  • 安全性方面:
    • SSLv3不再受到Android的支持
    • 在服务器未正确实现TLS协议版本协商时不会进行TLS协议回退
    • WebView在多进程模式下运行,网页内容在非App进程中处理,与App进程隔离,以提高安全性
    • APK文件现在不一定驻留在名称以-1或-2结尾的目录中,应用应该使用ApplicationInfo#sourceDir获取该目录
    • 其他原生库安全性增强
  • 隐私性
    • Android 8.0上的应用中,ANDROID_ID的值根据应用签署密钥和用户确定作用域,统一设备不同作用域下的应用读取到的ANDROID_ID值不同;
    • 系统属性net.hostname不再能获取,类似的还有net.dns1, net.dns2等,如果要获取DNS服务器之类的网络连接信息,需要使用NetworkRequest或NetrowkCallback对象;
    • Build.SERIAL被弃用,必须使用Build.getSerial才能知道硬件序列号;
  • 自动记录未捕获的异常
    • 过去如果用户设置了自己的UncaughtExceptionHandler,并且没有调用原来系统的处理逻辑,那么异常不会被系统记录,现在不论用户是否调用系统的处理逻辑,异常都会被记录,尽管推荐的做法是自定义的未捕获异常处理器始终调用系统处理逻辑;
  • 联系人相关API不再提供精确数据
  • 类加载行为变更
    • 假设条件检查更加严格
    • DexFile API被弃用,应使用PathClassLoader或者BaseDexClassLoader

9.0 Pie API28

  • 使用前台服务的应用从Android9开始必须声明FOREGROUND_SERVICE权限;
  • Build.SERIAL弃用,需在获取READ_PHONE_STATE权限的情况下调用getSerial;
  • 安全性优化
    • 默认强制使用https(可以设置)
    • 多个不同的进程使用webview时必须使用不同的目录存放数据
    • 按照应用划分SELinux域,多个应用分享数据必须使用ContentProvider机制
  • 由于部分Android应用没有正确处理Css颜色格式,target sdk在27或以下时webview忽略了rrggbbaa中的前两位,在target sdk在28或以上时能够正确识别css颜色;
  • 电源管理
    • Android9会将应用进行分组为活跃、工作集、常用、极少使用、从未使用五个组,限制依次加强,具体分组方式是由系统决定的,可能会使用机器学习算法。这些限制在设备充电时不适用。此外,每个设备厂商的策略都可能不同。作为开发者你要做的就是确保应用在受到限制时能够良好运行。
    • Android9还改进了省电模式,包括禁止后台应用访问网络、屏幕关闭时停用位置服务、对所有target api level的应用施加后台执行限制、更积极的将应用置为待机模式。
  • 隐私变更
    • 当应用后台运行时:禁止访问麦克风和摄像头、传感器不会接收事件,如果希望检测传感器状态,应用必须使用前台服务;
    • 将电话相关权限进一步收紧,读写通话记录权限不再位于PHONE权限组,而是放在了CALL_LOG权限组;
    • 对访问Wi-Fi位置和连接信息的限制进一步加强,应用必须有位置权限和获取WiFi状态权限,并且设备启用了位置服务的情况下,才能够检索SSID和BSSID。
    • NETWORK_STATE_CHANGE_ACTION广播不再提供隐私相关数据,如果希望获取SSID、BSSID或连接信息,必须调用WifiManager或者WifiP2pManager的API;
    • 当用户停用设备定位时,TelephonyManager的和数据网络相关的API也不会再返回结果;
  • 当应用直接调用、使用反射、通过JNI访问非SDK接口时,Android9会通过Logcat给出警告;
  • 安全相关实现优化
  • 多语言库ICU库更新
  • 测试库变更
  • Java UTF解码器遵循更严格的Unicode标准
  • 证书验证时,禁止在没有SAN的情况下回退到CN验证
  • socket相关API优化
  • xt_qtaguid文件夹禁止应用访问,这些信息相关的Java API能继续运行,但cutils提供的函数不保证正确,不过cutils本来就不是NDK公开接口的一部分;
  • 修复非Activity环境中可以不通过FLAG_ACTIVITY_NEW_TASK启动Activity的bug;
  • 旋转模式变更:纵向旋转模式现在被重命名为旋转锁定,当旋转锁定启用时,用户将屏幕方向锁定到顶层Activity所支持的任意旋转
  • 使用系统ClassLoader将无法加载Apache HTTP相关类,这是因为Android9已经彻底移除了Apache HTTP相关类,建议需要使用相关类的应用将自己的apache http库打包的apk中;
  • 允许通过getCameraIdList发现所有可用的摄像头,而不是假定最多只有一个前置和后置摄像头