RogerAce +

Android N preview 体验

昨日凌晨,谷歌发布android N开发者预览版(Android N preview 1),接下来每一个月到一个半月会依次放出preview 2,3...。直到8月发正式版。规划

总体来说,N关注的是体验和性能。下面来了解一下N预览版的功能。

多屏幕支持

个人认为主要是提升tablet和TV的体验。手机上的场景,yy一些:字符串跨应用复制,阅读记笔记,看视频聊微信,看优酷购物,陌陌堵脖微信付账等,可能有很多。新玩法、新思路待挖掘,冥冥之中感觉会有优秀的创意,围绕截屏,浮窗会有不错的玩法。

对于手机和tablet

可以同时运行并展示两个app。通过拖拽的方式,可以改变两者占屏幕的大小。

你可以设置支持多屏幕与否,也可以设置支持的话最小尺寸。

对于电视

你可以设置画中画模式的显示方式。家里用盒子的,对这个的需求的迫切的。

生命周期

生命周期保持不变。需要注意的是:当你跟左屏交互时,右屏会onPause。这很重要,也就是说从activityManager上来看,并没有变化。同一时间,仍旧只能有一个activity处于active的,这个多屏幕,可能只是在activity的layout布局最外层加的那个frameLayout上做了手脚吧。这样不是真正意义的分屏,使用上需要在两个不同应用的activity上失焦、聚焦,跨应用交互上可能会不连贯。例如当前聚焦A,但我滑动应用B的列表。

适配多屏幕设计

对于适配多屏幕,除了官方文档以外,我们要重点关注onPause和onStop的设计了。

过去我们onPause被调用后,onStop很可能会被调用,除了dialog,屏幕resize等情况。所以我们会在onPause中,处理一些事情:视频停止,状态保存等。如今我们需要考虑有些内容是需要后置到onStop中了,以达到更好的多屏幕体验。

增强Notification

重新设计了Notification的部分,吸收了ios的精华,又含有自己的想法。

更改Notification模板

包含应用icon,方便识别所属通知。

通知分组

ios中设计成按时间排序或按预设应用顺序排序,并可以设置按应用分组。N借鉴分组,并遵循material design,使分组通知看上去更清爽。

直接回复

copy from ios

自定义view

icon所在header部分可以自定义样式和行为。

此次改造,可以让通知重新回归到你的视线范围,并管理起来。

Profile-guided JIT/AOT compilation

过去ART的运行时使用AOT,而Dalvik使用JIT。AOT,在安装的时候会做dex2oat预编译,应用启动,运行时效率更高,与此同时安装过程更久,系统更新更久,耗电量更大,占用空间更多。新compilation就是要解决这个问题,融合两种的优势。

基于profile引导的编译,是将JIT compiler也交给ART,使ART具备JIT的能力。并由它的compilation来决定使用哪种预处理。在程序运行过程中,会根据真实使用情况维护一个profile,包含那些hot methods,对这一部分使用AOT,保证其运行效率。其他的方法到真正使用的时候,再JIT编译。预编译今后只会在充电并且空闲的时候做。

这个策略很重要,想满足不同情况的机器,需要一个完善的策略。不过这对于低端机型开启ART是个福音。据官方描述,新的compilation可以全面减少RAM,适应低存储情形,更省电。

安装时间优化

基于JIT,更改做dex2oat的策略,安装应用的时间变快。属于找回曾经拥有的优势,不详述。

Doze

瞌睡模式,系统为了延长用户手机电池的待机时长,而提出并实现的策略:当锁屏时,通过对cpu和网络做限制,使应用暂停,从而达到省电的目的。系统会在一定的时间,回复限制,让应用暂且执行,之后再回收限制。不过,如果你有一个重要的推送过来,或其他行为,导致你想获得cpu和网络,你可以更改消息级别来暂时获得。

策略相当于,将一个1微妙执行一个命令的设备降级成1毫秒执行一次的设备。策略虽好,需要共同维护。

后台任务优化

为了打造生态的另一举措。N 为节约内存和电量,移除了三种广播通知:

  1. ACTION_NEW_PICTURE:拍摄了新的图片
  2. ACTION_NEW_VIDEO:拍摄了新的视频
  3. CONNECTIVITY_ACTION: 用户网络发生变化

移除这几个广播,原因是因为这几个被用于唤起后台进程太过凶猛,目的是希望开发者在后台的应用能够使用JobScheduler来做。

Data Saver

在设置中新增Data Saver选项,用于节省流量。设置为开启的应用,系统将禁止后台的网络行为,同时给该应用信号,收到信号的应用需要自己做前台节流。与控制权限不同,此设计是要求开发者拥有一套省流量的策略。评价同样,需要时间给我们答案。

JAVA8&JACK

支持JAVA8,lamada等用法可以用起。不过一定要使用jack compiler。

JACK is for java android compile kit.过去我们.class,如今是.jack。无论你的源码,本地aar项目,依赖的远端仓库,都会先处理成jack文件,进行合并,压缩,混淆,最终生成dex。

jack的优势在于其merge、shrink、obfuscate时的效率。过去卡在shrinking很久。

jack会自动分dex,无需再配mutlidex,只需:

android {
    ...
    buildToolsRevision ‘21.1.2’
    defaultConfig {
      // Enable the experimental Jack build tools.
      useJack = true
    }
    ...
}

即可。详见jack&jill

解决65535?

65535问题是在于dexopt过程,手机methodID集使用了short。而不是dex文件本身(dex的head文件描述里,使用的是32位int存储的),只不过编译时为了保证dexopt的作用,会抛错。在ART虚拟机中,AoT的执行方式,当安装时,会把包内的多dex,处理并合成一个oat文件。如上所述,6.0的新ART,Profile-guided ART,会权衡性能消耗和执行效率。

所以,随着4.X成为过去,当某一天你为5.0及以上的机器开发时,你只需配置好jack,然后65535的问题基本是无感的了。

Direct boot

像是电脑中的对软件设置「开机启动」功能。即当手机启动后,会对注册过特殊权限的应用发送一个广播,允许这些应用执行自己的组件。系统会保证在解锁前,启动好这些组件。

Android Studio 2.1 Preview

已支持Android N preview,不过注意,有些变化:

  1. instant run不兼容jack,意味着如果你useJack,那么没有instant run功能
  2. 基于读.class的工具会失效(如Mockito,link)

这些都跟jack使用新的中间文件.jack有关,jack作为14年的产物,如今做出加入N的决策,相信后续在android studio上会支持更好。

Blog

Opinion

Project