Android|Android 7.0 系统变更

1. API及行为变更

  1. 支持多个应用同时显示,可以并排运行两个应用或者处于分屏模式时一个应用位于另一个应用之上。
  2. 运行时在ART运行环境中加入了JIT的运行时编译优化,使得运行时速度更快。这部分的理解见另一篇:Android运行时的几个概念理解
  3. 只要屏幕关闭了一段时间,且设备未插入电源,低电耗模式就会对应用使用熟悉的 CPU 和网络限制。
  4. 引入JobScheduler用于后台优化, 并且删除了三个广播:CONNECTIVITY_ACTION,
    ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO.
  5. 强烈建议您使用 SurfaceView 代替 TextureView,以实现省电。
  6. Vulkan API 首次引入。Android 7.0 将一项新的 3D 渲染 API Vulkan 集成到平台中。就像 OpenGL ES 一样,Vulkan 是 3D 图形和渲染的一项开放标准,由 Khronos Group 维护。
  7. Android 7.0 引入密钥认证,这是一个新的安全工具,可帮助您确保设备的硬件支持的密钥库中存储的密钥对适当保护您的应用使用的敏感信息.现在只有少部分设备支持硬件级密钥认证。
  8. 提供网络安全配置可以自定义信任的CA证书。而在默认情况下,7.0的应用仅信任系统提供的证书,不再信任用户添加的证书颁发机构,如果希望添用户信任的CA,需要使用"网络安全配置"以指定信任用户CA的方式。
  9. 引入了新的应用签名方案APK Signature v2, 可以在build.gradle中做配置:
  10. Android 7.0 引入 Custom Pointer API,以便您可以自定义指针的外观、 可见性和行为。此功能在用户使用鼠标或触控板与 UI 对象交互尤为有用。默认指针使用标准图标。此 API 还包含多种高级功能,例如根据鼠标或触控板特定移动情况改变指针图标外观。
  11. VR 支持,打印服务增强
    VR 开发参考
  12. 新增了存储访问框架,对内置外置SD卡影响,对视频图片资源目录的访问有什么影响,支持虚拟文件的访问。
    google参考Sample: Sample
  13. 从以 Android 7.0 为目标平台的应用开始,地理定位 API 将仅在安全的起点(通过 HTTPS)上被允许。
2. 关于这些Change的思考:
  1. 多个应用同时显示,应用的生命周期的影响?
    【Android|Android 7.0 系统变更】多个应用同时显示,不会影响应用与Activity的生命周期流程。
    在多窗口模式中,在指定时间只有最近与用户交互过的 Activity 为活动状态。 该 Activity 将被视为顶级 Activity。 所有其他 Activity 虽然可见,但均处于暂停状态。 但是,这些已暂停但可见的 Activity 在系统中享有比不可见 Activity 更高的优先级。 如果用户与其中一个暂停的 Activity 交互,该 Activity 将恢复,而之前的顶级 Activity 将暂停。
  2. JVM, Dalvik, ART, AOT, JIT的理解?
    参见 Android运行时的几个概念理解
  3. 低耗电模式是如何工作的,与以前有什么区别,对Activity,
    Service,Intent及应用内推送及短信推送有什么影响?
    • 低电耗模式
      如果用户设备未插接电源、处于静止状态一段时间且屏幕关闭,设备会进入低电耗模式。 在低电耗模式下,系统会尝试通过限制应用对网络和 CPU 密集型服务的访问来节省电量。 这还可以阻止应用访问网络并推迟其作业、同步和标准闹铃。
      系统会定期退出低电耗模式一会儿,好让应用完成其已推迟的 Activity。在此维护时段内,系统会运行所有待定同步、作业和闹铃并允许应用访问网络。
    • 低电耗模式限制
      在低电耗模式下,您的应用会受到以下限制
      • 暂停访问网络。
      • 系统将忽略 wake locks。
      • 标准 AlarmManager 闹铃(包括 setExact() 和 setWindow())推迟到下一维护时段。
        • 如果您需要设置在低电耗模式下触发的闹铃,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。
        • 一般情况下,使用 setAlarmClock() 设置的闹铃将继续触发 — 但系统会在这些闹铃触发之 前不久退出低电耗模式。
      • 系统不执行 Wi-Fi 扫描。
      • 系统不允许运行同步适配器。
      • 系统不允许运行 JobScheduler。
    • 应用待机模式
    • 应用待机模式允许系统判定应用在用户未主动使用它时处于空闲状态
    • 当用户将设备插入电源时,系统将从待机状态释放应用,从而让它们可以自由访问网络并执行任何待定作业和同步。 如果设备长时间处于空闲状态,系统将按每天大约一次的频率允许空闲应用访问网络。
      参见 低电耗与待机模式下的策略
  4. 新的后台优化策略,特别是JobSechedule机制与之前普通方式的区别在哪里,好处在哪里?
    • JobSechedue 机制
    在进行Android开发时,会遇到这样的情况:想在将来的某个时间或在一定条件下运行任务,如上传图片、 下载歌曲等操作想在接入电源或连接到WIFI时执行。Android L提供了JobScheduler API。
    • JobSechedue用法
    • JobScheduler特性:
      • 支持在一个任务上组合多个条件;
      • 内置条件:设备待机、设备充电和连接网络;
      • 支持持续的job,这意味着设备重启后,之前被中断的job可以继续执行;
      • 支持设置job的最后执行期限
    • JobScheduler机制提供的优点解析:
      • JobSchedule的宗旨就是把一些不是特别紧急的任务放到更合适 的时机批量处理。这样做有两个好处:
        1、避免频繁的唤醒硬件模块,造成不必要的电量消耗。
        2、避免在不合适的时间(例如低电量情况下、弱网络或者移动网络情况 下的)执行过多的任务消耗电量;
      • 针对第一点:我们通过一个在蜂窝网络下的网络请求例子来说明(蜂窝网络下的请求相对是比较耗电的)。Android系统为了尽可能的增加设备的续航,会不断的关闭各种硬件模块来节省电量。当我们的App在设备处于休眠状态下想要执行一次网络请求的时候;首先需要唤醒设备,接着会发送数据请求,然后等待服务端返回的结果,最后再经过一段时间的等待才会慢慢进入休眠状态。整个过程如下图:

        Android|Android 7.0 系统变更
        文章图片
        jobscheduler-1.jpg
      针对上面这个流程,Google在他们的在线课程中展示过这样一张图:
      ![jobscheduler-2.jpg](http://upload-images.jianshu.io/upload_images/2790119-1dccbe01c6123b55.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

      通过上面这张电量消耗图我们看到,在唤醒设备、发送数据以及接受数据的瞬间都会造成大量的电量消耗。同时系统为了你的下一次网络请求不用再次唤醒设备,会等待一段时间再让设备进入休眠。如果你的请求是间歇性的,那么这些等待休眠的时间内造成的电量消耗其实也是多余的。
      针对上述问题,一个很好的优化方案就是将这些间歇性的网络请求任务推迟到某个时间点(针对时间点下面会有介绍)来集中处理。JobSchedule API正是用来帮我们做这件事的,具体方案如下图:
      ![jobscheduler-3.jpg](http://upload-images.jianshu.io/upload_images/2790119-af7adaa07b016221.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    通过上图我们可以看到,间歇性的网络请求被集中处理了;避免了重复的唤醒设备,同时也减少了设备等待休眠的次数,以此达到省电的目的。
    • 针对第二点:我们可以通过JobSchedule API来优化请求时机,比如说用户的设备剩余电量已经不多了,那么对于一些及时性要求不高的任务我们就可以放到电量充足或者是设备充电阶段再执行;又比如说现在用户设备处于蜂窝网络状况或者若网络环境下,那么我们就可以将这些任务放到WiFi网络或者网络情况良好的时机再处理。前面在
      谈第一点的时候提到的“时间点”正是指的根据设备当前状况选择合适的时机。
  5. CONNECTIVITY_ACTION,ACTION_NEW_PICTURE,ACTION_NEW_VIDEO 这三个广播被系统删除了,这些对当前应用开发中的影响有哪些,如果有影响,该如何消除这种影响?
    • CONNECTIVITY_ACTION
      在 Android 7.0上 应用不会收到 CONNECTIVITY_ACTION 广播,即使你 在manifest清单文件中设置了请求接受这些事件的通知。 但,在前台运行的应用 如果使用BroadcastReceiver 请求接收通知,则仍可以在主线程中侦听CONNECTIVITY_CHANGE。
    • ACTION_NEW_PICTURE,ACTION_NEW_VIDEO
    在 Android 7.0上应用无法发送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 类型的广播。不过可以通过JobScheduler API来解决。
  6. SufaceView与TextureView区别在哪里,这两个类主要有哪些应用场景?
    • 相同点:SurfaceView和TextureView都继承自android.view.View类。它们可以从单独的线程中绘制和渲染,这是与其他视图的主要区别
    • 区别: SurfaceView的两个限制,不能动画,变换和缩放; 不能覆盖两个SurfaceView。TextureView看起来像一个普通的View。你可以动画,变换和缩放它,就像一个TextView。 TextureView只能在硬件加速窗口中使用。然而,TextureView将消耗比SurfaceView更多的内存,也可能有1?3帧延迟。
  7. Vulkan API的出现,OpenGL会是一个什么样的状态,对Android图形显示的影响有什么,关于图形开发未来趋势是什么?
    这部分关于图形技术及图形API是一个非常大的主题,不在这里展开。一句话就是Vulkan 的设计是为了在未来替换OpengGL, 提高图形硬件的执行效率。
  8. 新引进的硬件级别的密钥认证工具,提供了哪些功能,对安全级别要求高的应用开发有哪些好的影响?
    暂时不太清楚
  9. 自定义CA证书这个是如何配置的,与之前有什么区别?
    暂时不太清楚
  10. 新引进的应用签名机制APK Signature v2对App的部署与发布有什么影响?
    暂时不太清楚
  11. 新增了存储访问框架,对内置外置SD卡有什么影响,对视频及图片资源目录的访问有什么影响?
    访问存储框架
    使用作用域目录访问
  12. 提供的VR SDK, 需要些什么储备知识,如果想要跨入这个领域,该如何学习?
    官方文档
  13. Android 7.0 安全增强方面的措施
    系统级别的安全增强
    Android 7.0 新增安全特性

    推荐阅读