Android N Behavior Changes 笔记

来源:互联网 发布:linux 查找字符串 编辑:程序博客网 时间:2024/05/16 03:13

一、性能改进

1.Doze模式的优化

在安卓6.0中,安卓引入了新的省电机制Doze,当时针对的场景只是当手机同时处于灭屏以及静止状态来减少应用对电量的消耗。但是在实际使用中手机灭屏时不仅仅是处于静止状态,还有很多情况下是处于运动状态的,例如步行,坐车,坐飞机等情况,这时Doze就不会生效。比如你出门在外把手机放在裤子口袋,若是Android 6.0的Doze则会认为用户还可能会使用设备而不启动后台省电管理机制。然而Android N在此基础上更近了一步,将Doze分成多个层次.



When a device is on battery power, and the screen has been off for a certain time, the device enters Doze and applies the first subset of restrictions: It shuts off app network access, and defers jobs and syncs. If the device is stationary for a certain time after entering Doze, the system applies the rest of the Doze restrictions toPowerManager.WakeLockAlarmManager alarms, GPS, and Wi-Fi scans. Regardless of whether some or all Doze restrictions are being applied, the system wakes the device for brief maintenance windows, during which applications are allowed network access and can execute any deferred jobs/syncs.

从这段文字可以看出。

Android 对于Doze在原来的基础上变得更加严格。

当一个设备使用电池供电,屏幕关闭一段时间后,就会进入Doze。这一点上跟原来6.0机制一样。进入Doze后,将关掉应用网络访问能力同时延期一些系统工作与同步任务。

当设备进入Doze一段时间并持续保持静止时,进入途中第三阶段的Doze,系统将限制PowerManager.WakeLockAlarmManager alarms, GPS, and Wi-Fi scans这些功能的使用。

(在Android 6.0中,AlarmManager新增了setAndAllowWhileIdle() and setExactAndAllowWhileIdle()方法,如果你的app需要在Doze下用AlarmManger设置alarm做点什么,如唤起进程等,可以改用这两个方法,这两个方法设置的Alarms在系统处于Doze也能起作用。

但是从图中可以看出,每隔一段时间,系统会周期性地唤起一个 brief maintenance 窗口,在唤起窗口的这段时间,应用将被允许联网和执行其他活动。在这个窗口结束之后,设备将再次进入Doze。随着时间的增长,系统唤起maintenance windows的频率将越来越低。


更详细的Doze解释可以查看官方文档Optimizing for Doze and App Standby

2.项目瘦身:后台的优化

一句话总结就是:
为了优化性能跟用户体验,减少内存的使用与电池功耗,Android N删除了CONNECTIVITY_ACTION、ACTION_NEW_PICTURE and ACTION_NEW_VIDEO这三个广播。

Android设备在网络连接上切换很频繁,通常设备都会在流量跟wifi连接之前切换,如果应用注册了CONNECTIVITY_ACTION这个广播,那么每次切换都将被唤起,这样对系统的性能跟功耗有不好的影响;此外还有 ACTION_NEW_PICTURE and ACTION_NEW_VIDEO 这两个广播,用户用照相机拍一张照片,这些广播被监听也将导致apps被唤起。

To alleviate these issues, Android N applies the following optimizations:

  • Apps targeting Android N do not receive CONNECTIVITY_ACTION broadcasts, even if they have manifest entries to request notification of these events. Apps running in the foreground can still listen forCONNECTIVITY_CHANGE on their main thread if they request notification with a BroadcastReceiver.
  • Apps cannot send or receive ACTION_NEW_PICTURE or ACTION_NEW_VIDEO broadcasts. This optimization affects all apps, not only those targeting Android N.

为了缓解这些问题,Android做了以下优化:
·所有targetSDK为Android N版本的应用只有在他们应用处于前台时,才能在应用主线程中接收CONNECTIVITY_ACTION广播,其他状态下,即使在manifest里注册了也没办法接收。
·所有在Android N版本设备上运行的应用都不能注册或者发送ACTION_NEW_PICTURE or ACTION_NEW_VIDEO广播了。

为了解决这个问题,Google提供了JobScheduler来帮助应用过度。这玩意能帮你在一些特定条件下执行网络操作。注: JobScheduler在API 21及以上才有

想要了解更多后台优化的信息,可以查看官方文档Background Optimizations

二、权限更改

1.弃用了GET_ACCOUNTS权限。


2.文件系统权限变更

为了提供私有文件数据的安全性,使用Android N及以上版本的应用的私有目录下权限限制为0700,这样可以防止泄露文件的元数据,比如文件大小与是否存在等。
这个改变会引发一些副作用:
· 私有文件的权限不能被文件的所有者对外开放,如果想通过MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE来修改文件权限,将会抛出SecurityException;
·通过 files://  URIs来访问 超过应用包的范围的路径,将抛出FileUriExposedException. Google推荐使用 FileProvider来分享私有文件的内容。
·DownloadManager不能通过文件名来分享私有文件的信息。通过DownloadManager.COLUMN_LOCAL_FILENAME来访问文件时,将抛出SecurityException;
诚然,可以在下载文件的时候,设置下载地址为公共的位置,就可以通过setDestinationInExternalFilesDir(Context, String, String)  或者setDestinationInExternalPublicDir(String, String) 方法使用DownloadManager.COLUMN_LOCAL_FILENAME访问到文件,但是这种做法是Google极力劝阻的,访问一个公开文件的首选方法是使用openFileDescriptor(Uri, String)。
·

三、可访问性的改进

1.屏幕放大

2.在安装向导有视觉设置

这个是介绍Android N系统在Settings > Accessibility的一些功能改进。

四、NDK Apps Linking to Platform Libraries

如果在Android N上使用NDK,只能够只用公开的API,不能使用任何非公开APi(包括主工程及引用的第三方库等等都不能包含有非公开的API)


五、其他重点:

所有tartgetSDK低于Android N版本的应用运行在Android N系统上时,用户的以下操作可能会导致崩溃,需要引起注意:

1.修改了屏幕显示图标大小或者字体大小,并从最近使用的程序中回到应用。

2.从DDMS中手动杀死应用

相关内容:
http://soft.chinabyte.com/137/13728637.shtml
http://developer.android.com/intl/zh-cn/preview/behavior-changes.html
0 0