行为变更

参照:http://developer.Android.com/intl/zh-cn/preview/behavior-changes.html

本文内容

  1. 性能提升

    1. 打盹

    2. 后台优化

  2. 权限更改

  3. 辅助工具改进

    1. 屏幕缩放

    2. 设置向导中的视觉设置

  4. NDK 应用链接至平台库

  5. Android for Work

另请参阅

  1. Android N API 概览

Android N 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更。本文重点介绍您应该了解并在开发应用时加以考虑的一些重要变更。

如果您之前发布过 Android 应用,请注意您的应用可能受到这些平台变更的影响。

性能提升


为延长设备的电池寿命、降低内存使用率以及提升应用性能,Android N 对系统行为做出了一些变更。这些变更可能会影响系统资源和系统通知对应用的可用性。您应仔细检查这些变更并评估应用可能需要做何调整以适应这些变更。

打盹

Android 6.0(API 级别 23)引入了打盹模式,当用户设备未插接电源、处于静止状态且屏幕关闭时,该模式会推迟 CPU 和网络活动,从而延长电池寿命。而 Android N 则通过在设备未插接电源且屏幕关闭状态下、但不一定要处于静止状态(例如用户外出时把手持式设备装在口袋里)时应用部分 CPU 和网络限制,进一步增强了打盹模式。

当设备处于充电状态且屏幕已关闭一定时间后,设备会进入打盹模式并应用第一部分限制:关闭应用网络访问、推迟作业和同步。如果进入打盹模式后设备处于静止状态达到一定时间,系统则会对PowerManager.WakeLockAlarmManager 闹铃、GPS 和 Wi-Fi 扫描应用余下的打盹限制。无论是应用部分还是全部打盹限制,系统都会唤醒设备以提供简短的维护时间窗口,在此窗口期间,应用程序可以访问网络并执行任何被推迟的作业/同步。

图 2. 打盹模式如何在设备处于静止状态达到一定时间后应用第二级系统活动限制的图示。

请注意,激活屏幕或插接设备电源时,系统将退出打盹模式并取消这些处理限制。此项新增的行为不会影响有关使您的应用适应 Android 6.0(API 级别 23)中所推出的旧版本打盹模式的建议和最佳实践,如打盹和应用待机优化中所讨论。您仍应遵循这些建议(例如使用 Google Cloud Messaging (GCM) 发送和接收消息)并开始安排更新计划以适应新增的打盹行为。

Project Svelte:后台优化

Android N 删除了三项隐式广播,以帮助优化内存使用和电量消耗。此项变更很有必要,因为隐式广播会在后台频繁启动已注册侦听这些广播的应用。删除这些广播可以显著提升设备性能和用户体验。

移动设备会经历频繁的连接变更,例如在 Wi-Fi 和移动数据之间切换时。目前,可以通过在应用清单文件中注册一个接收器来侦听隐式 CONNECTIVITY_ACTION 广播,让应用能够监控这些变更。由于很多应用会注册接收此广播,因此单次网络切换即会导致所有应用被唤醒并同时处理此广播。

同理,应用可以注册接收来自其他应用(例如相机)的隐式 ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 广播。当用户使用相机应用拍摄照片时,这些应用即会被唤醒以处理广播。

为减缓这些问题,Android N 应用了以下优化措施:

  • 面向 Android N 开发的应用不会收到 CONNECTIVITY_ACTION 广播,即使它们已有清单条目来请求接受这些事件的通知。在前台运行的应用如果使用 BroadcastReceiver 请求接收通知,则仍可以在主线程中侦听CONNECTIVITY_CHANGE

  • 应用无法发送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 广播。此项优化会影响所有应用,而不仅仅是面向 Android N 的应用。

未来的 Android 版本还可能会弃用其他隐式广播以及未绑定的后台服务。有鉴于此,您应避免依赖在清单文件中声明的接收器来侦听隐式广播或删除此依赖关系,以及避免或删除对后台服务的依赖关系。

Android 框架提供多种解决方案来降低这些隐式广播或后台服务的必要性。例如,JobScheduler API 提供了一个稳健可靠的机制来安排满足指定条件(例如连入不按流量计费的网络)时所执行的网络操作。您甚至可以使用JobScheduler 来响应内容提供程序所发生的变更。

如需了解有关此行为变更及如何改写应用的详细信息,请参阅后台优化。

权限更改


Android N 做了一些权限更改,包括用户帐户权限和向外部存储设备写入信息的新权限,这些更改可能会影响您的应用。下面概要列出了预览版中已发生更改的权限。

  • GET_ACCOUNTS(已弃用)

    GET_ACCOUNTS 权限现已弃用。对于面向 Android N 的应用,系统将忽略此权限。

辅助工具改进


为提高平台对于视力不佳或视力受损用户的可用性,Android N 做出了一些更改。这些更改一般并不要求更改您的应用代码,不过您应仔细检查并使用您的应用测试这些功能,以评估它们对用户体验的潜在影响。

屏幕缩放

Android N 支持用户设置显示尺寸,以放大或缩小屏幕上的所有元素,从而提升设备对视力不佳用户的可访问性。用户无法将屏幕缩放至低于最小屏幕宽度 sw320dp,该宽度是 Nexus 4 的宽度,也是常规中等大小手机的宽度。

当设备密度发生更改时,系统会以如下方式通知正在运行的应用:

  • 如果是面向 API 级别 23 或更低版本系统的应用,则系统会自动终止其所有后台进程。这意味着如果用户切换离开此类应用,转而打开 Settings 屏幕并更改 Display size 设置,则系统会像处理内存不足的情况一样终止该应用。如果应用具有任何前台进程,则系统会如处理运行时变更中所述将配置变更通知给这些进程,就像对待设备屏幕方向变更一样。

  • 如果是面向 Android N 的应用,则其所有进程(前台和后台)都会收到有关配置变更的通知,如处理运行时变更中所述。

大多数应用并不需要进行任何更改即可支持此功能,不过前提是这些应用遵循 Android 最佳实践。具体要检查的事项:

  • 在屏幕宽度为 sw320dp 的设备上测试您的应用,并确保其充分运行。

  • 当设备配置发生变更时,更新任何与密度相关的缓存信息,例如缓存位图或从网络加载的资源。当应用从暂停状态恢复运行时,检查配置变更。

    注:如果您要缓存与配置相关的数据,则最好也包括相关元数据,例如该数据对应的屏幕尺寸或像素密度。保存这些元数据便于您在配置变更后决定是否需要刷新缓存数据。

  • 避免用像素单位指定尺寸,因为像素不会随屏幕密度缩放。应改为使用与密度无关像素 (dp) 单位指定尺寸。

设置向导中的视觉设置

Android N 在“Welcome”屏幕中加入了“Vision Settings”,用户可以在新设备上设置以下辅助工具设置:Magnification gesture、Font size、Display size 和 TalkBack。此项变更增强了与不同屏幕设置相关的错误的可见性。要评估此功能的影响,您应在启用这些设置的状态下测试应用。您可以在 Settings > Accessibility 中找到这些设置。

NDK 应用链接至平台库


Android N 做了一些命名空间更改,以阻止加载非公开 API。如果您使用 NDK,则只能使用 Android 平台提供的公开 API。在下一个官方发布的 Android 版本上使用非公开 API 会导致应用崩溃。

为提醒您使用了非公开 API,在 Android N 设备上运行的应用会在有应用调用非公开 API 时在日志消息输出中生成一个错误。此错误还会作为消息显示在设备屏幕上,以帮助增强您对此情况的认识。您应检查应用代码以删除使用非公开平台 API,并使用预览版设备或模拟器全面测试应用。

如果您的应用依赖平台库,则请参见 NDK 文档,了解使用公开 API 等效项替换普通私有 API 的典型修复。您还可以链接至平台库,而无需实现此应用,如果应用使用的库是平台的一部分(例如 libpng),但不属于 NDK,则更可如此。此情况下,请确保您的 APK 包含您打算链接到的所有 .so 文件。

注意:有些第三方库可能会链接至非公开 API。如果您的应用使用这些库,那么当您的应用在下一个官方发布的 Android 版本上运行时可能会出现崩溃现象。

应用不应依赖或使用不属于 NDK 的原生库,因为这些库可能会发生更改或从一个 Android 版本迁移至另一版本。例如,从 OpenSSL 切换至 BoringSSL 即属于此类更改。此外,不同的设备可能提供不同级别的兼容性,因为不属于 NDK 中的平台库没有兼容性要求。如果您必须在较旧设备上访问非 NDK 库,则请依据 Android API 级别进行加载。

为帮助您诊断此类问题,下面列举了一些在您试图使用 Android N 开发应用时可能遇到的 Java 和 NDK 错误:

Java 错误示例:

java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so"is not accessible for the namespace "classloader-namespace"

NDK 错误示例:

dlopen failed: cannot locate symbol "__system_property_get" referenced by ...

以下是遇到这类错误的应用的一些典型修复:

  • 可以使用标准 JNI 函数来替代使用 libandroid_runtime.so 中的 getJavaVM 和 getJNIEnv:

    AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h>
    AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or
    JavaVM::AttachCurrentThread from <jni.h>.
  • 可以使用公开备选项 __system_property_get 来替代使用 libcutils.so 中的 property_get 符号。如需这样做,请使用 __system_property_get 及以下 include 函数:

    <span class="com" style="margin: 0px; padding: 0px;">#include</span><span class="pln" style="margin: 0px; padding: 0px; color: rgb(0, 0, 0);"> </span><span class="str" style="margin: 0px; padding: 0px;"><sys/system_properties.h></span>
  • 应使用应用本地版本来替代使用 libcrypto.so 中的 SSL_ctrl 符号。例如,您应在 .so 文件中静态链接libcyrpto.a,或者在应用中包含您自己的来自 BoringSSL 或 OpenSSL 的动态 libcrypto.so

Android for Work


Android N 包含一些针对面向 Android for Work 的应用的变更,包括对证书安装、密码重置、二级用户管理、设备标识符访问权限的变更。如果您是要针对 Android for Work 环境开发应用,则应仔细检查这些变更并相应地修改您的应用。

  • 您必须先安装授权证书安装程序,然后 DPC 才能对其进行设置。对于面向 N SDK 的配置文件和设备所有者应用,您应在设备策略控制器 (DPC) 调用 DevicePolicyManager.setCertInstallerPackage() 之前安装授权证书安装程序。如果尚未安装此安装程序,则系统会引发 IllegalArgumentException

  • 针对设备管理员的重置密码限制现在也适用于配置文件所有者。设备管理员无法再使用DevicePolicyManager.resetPassword() 来清除或更改已经设置的密码。不过,设备管理员仍可以设置密码,但只能在设备没有密码、PIN 或图案时这样做。

  • 即使设置了限制,设备所有者和配置文件所有者仍可以管理帐户。而且,即使具有DISALLOW_MODIFY_ACCOUNTS 用户限制,设备所有者和配置文件所有者仍可调用 Account Management API。

  • 设备所有者可以更轻松地管理二级用户。当设备在设备所有者模式下运行时,系统将自动设置DISALLOW_ADD_USER 限制。这样可以防止用户创建非托管二级用户。此外,CreateUser() 和createAndInitial() 方法已弃用,取而代之的是 DevicePolicyManager.createAndManageUser() 方法。

  • 设备所有者可以访问设备标识符。设备所有者可以使用 DevicePolicyManagewr.getWifiMacAddress() 访问设备的 Wi-Fi MAC 地址。如果设备上从未启用 Wi-Fi,则此方法将返回一个 null 值。

如需了解有关 Android N 中针对 Android for Work 所做变更的详细信息,请参阅 Android for Work 更新。

其他重要说明


  • 如果一个应用在 Android N 上运行,但却是针对更低 API 级别开发的,那么在用户更改显示尺寸时,系统将终止此应用进程。因此,应用必须能够正常处理此情景。否则,当用户从最近使用记录中恢复运行应用时,应用将会出现崩溃现象。

    您应测试应用以确保不会发生此行为。要进行此测试,您可以通过 DDMS 手动终止应用,以造成相同的崩溃现象。

    在密度发生更改时,系统不会自动终止面向 N 及更高版本的应用;不过,这些应用仍可能对配置变更做出不良响应。

  • Android N 上的应用应能够正常处理配置变更,并且在后续启动时不会出现崩溃现象。您可以通过更改字体大小 (Setting > Display > Font size) 并随后从最近使用记录中恢复运行应用,来验证应用行为。

后台优化

本文内容

  1. 对 CONNECTIVITY_ACTION 的限制

  2. 安排连入无限流量连接时的网络作业

  3. 在应用运行时监控网络连接

  4. 对 NEW_PICTURE 和 NEW_VIDEO 的限制

  5. 新的 JobInfo 方法

  6. 新的 JobParameter 方法

  7. 进一步优化您的应用

后台进程非常耗费内存和电池。例如,隐式广播可以启动许多已注册侦听它的后台进程,即使这些进程可能没有执行许多工作。 这会严重影响设备性能和用户体验。

为减缓这个问题,N Developer Preview 应用了以下限制:

  • 面向 Preview 的应用不会收到 CONNECTIVITY_ACTION 广播,即使它们在清单文件中注册接收这些广播。 在前台运行的应用如果使用 Context.registerReceiver() 注册BroadcastReceiver,则仍可在主线程上侦听CONNECTIVITY_CHANGE

  • 应用无法发送或接收 ACTION_NEW_PICTURE 或ACTION_NEW_VIDEO 广播。此项优化会影响所有应用,而不仅仅是面向 Preview 的应用。

Android 框架提供多个解决方案来缓解对这些隐式广播的需求。 例如,JobScheduler 和GcmNetworkManager 提供了一个稳健可靠的机制来安排满足指定条件(例如连入无限流量网络)时所执行的网络操作。 现在,您还可以使用 JobScheduler 来响应内容提供程序所发生的变更。JobInfo 对象封装了JobScheduler 用来安排您的作业的参数。如果符合作业条件,系统将在应用的 JobService 上执行此作业。

在本文档中,我们将学习如何使用备用方法(如 JobScheduler)调整您的应用以符合这些新限制。

对 CONNECTIVITY_ACTION 的限制


面向 N Developer Preview 的应用不会收到 CONNECTIVITY_ACTION 广播,即使它们在清单文件中注册接收这些广播亦是如此,依赖此广播的流程也不会启动。 这可能会给需要侦听网络变化或者需要在设备接入无限流量网络时执行批量网络活动的应用造成问题。 Android 框架中已存在多个可绕过此限制的解决方案,但需要根据您想要应用实现的目标来选择正确的解决方案。

注:当应用位于前台时,通过 Context.registerReceiver() 中注册的 BroadcastReceiver 将继续接收这些广播。

安排连入无限流量连接时的网络作业

使用 JobInfo.Builder 类构建 JobInfo 对象时,应用 setRequiredNetworkType() 方法,并将JobInfo.NETWORK_TYPE_UNMETERED 作为作业参数传递。

当符合作业条件时,应用会收到回调以运行指定 JobService.class 中的 onStartJob() 方法。 如需查看JobScheduler 实现的更多示例,请参阅 JobScheduler 示例应用。

使用 GMSCore 服务且面向 Android 5.0(API 级别 21)或更低版本系统的应用可以使用 GcmNetworkManager 并指定 Task.NETWORK_STATE_UNMETERED

在应用运行时监控网络连接

在前台运行的应用仍可以通过注册的 BroadcastReceiver 侦听 CONNECTIVITY_CHANGE。不过,ConnectivityManager API 提供了一个更稳健可靠的方法,可以仅在符合指定的网络条件时才请求回调。

NetworkRequest 对象根据 NetworkCapabilities 定义网络回调的参数。 使用NetworkRequest.Builder 类创建 NetworkRequest 对象。然后,registerNetworkCallback() 将NetworkRequest 对象传递给系统。 当符合网络条件时,应用会收到回调以执行在其ConnectivityManager.NetworkCallback 类中定义的 onAvailable() 方法。

应用继续接收回调,直至应用退出或调用 unregisterNetworkCallback()

对 NEW_PICTURE 和 NEW_VIDEO 的限制


在 N Developer Preview 中,应用无法发送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 广播。此限制有助于缓解必须唤醒多个应用以处理新图像或视频时对性能和用户体验造成的影响。 N Developer Preview 扩展了 JobInfo 和 JobParameters 以提供备用解决方案。

新的 JobInfo 方法

为了针对内容 URI 变化触发作业,N Developer Preview 使用以下方法扩展了 JobInfo API。

  • JobInfo.TriggerContentUri()

  • 封装针对内容 URI 变化触发作业所需的参数。

  • JobInfo.Builder.addTriggerContentUri()

  • 将 TriggerContentUri 对象传递给 JobInfoContentObserver 监控已封装的内容 URI。如果存在多个与某个作业关联的 TriggerContentUri 对象,则系统会提供一个回调,即使其报告仅一个内容 URI 发生变化。

  • 如果给定 URI 的任何子级发生变化,则添加 TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS 标志以触发作业。 此标志对应于传递给 registerContentObserver() 的 notifyForDescendants 参数。

注: TriggerContentUri() 无法与 setPeriodic() 或 setPersisted() 结合使用。 若要持续监控内容变化,则可在应用的 JobService 完成处理最新的回调前安排新的 JobInfo

当系统报告指定内容 URI 所发生变化时,应用将收到一个回调,并向 MediaContentJob.class 中的onStartJob() 方法传递一个 JobParameters 对象。

新的 JobParameter 方法

N Developer Preview 也扩展了JobParameters,以允许应用接收有关哪些内容权限和 URI 已触发作业的有用信息:

  • Uri[] getTriggeredContentUris()

  • 返回已触发作业的 URI 数组。如果没有任何 URI 触发作业(例如,作业是因截止期限或其他一些原因触发的),或者已更改的 URI 数量超过 50,该数组将为 null

  • String[] getTriggeredContentAuthorities()

  • 返回已触发作业的内容权限的字符串数组。 如果返回的数组不是 null,请使用getTriggeredContentUris() 检索有关哪些 URI 已更改的详细信息。

进一步优化您的应用


优化您的应用以在低内存设备上或在低内存条件下运行,这样可以提升性能和用户体验。 删除后台服务依赖关系和静态注册的隐式广播接收器可帮助您的应用在此类设备上运行得更好。 尽管 N Developer Preview 采取了措施以减少部分问题,但建议您优化自己的应用,使其能够在完全不使用这些后台进程的情况下运行。

N Developer Preview 推出了一些附加 Android Debug Bridge (ADB) 命令,您可以使用这些命令测试在禁用这些后台进程情况下的应用行为:

  • 要模拟隐式广播和后台服务不可用的条件,请输入以下命令:

  • $ adb shell cmd appops set RUN_IN_BACKGROUND ignore
  • 要重新启用隐式广播和后台服务,请输入以下命令:

  • $ adb shell cmd appops set RUN_IN_BACKGROUND allow

AndroidN行为变更和后台优化相关推荐

  1. mysql 织梦 优化,优化分析:分享织梦搭建和后台优化设置

    织梦内容管理系统(DedeCms) 以简单.实用.开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统.DedeCMS基于PHP+MySQL的技术开发,支持多种服务器 ...

  2. Android 系统性能优化(81)---Android后台优化系列-background optimization-初识低耗电模式

    Android后台优化系列-background optimization-初识低耗电模式 〇. 序 当我们手机屏幕电量的时候,我们或在游戏,或在看视频,或在上网,屏幕是一个很耗电的组件,在电量消耗方 ...

  3. 魔众文库系统 v2.2.0 常规升级,界面和后台优化

    魔众文库系统基于文档系统知识,建立平台与领域,打造流量.用户.付费和变现的闭环,帮助您更好的搭建文库系统. 魔众文库系统发布v2.2.0版本,新功能和Bug修复累计14项,常规升级,界面和后台优化. ...

  4. 魔众工具箱系统 v2.4.0 常规升级,界面和后台优化

    魔众工具箱系统打造和收集各种简单.易用的在线工具大全,做出最简单方便.最干净整洁.最全面完整的在线工具,免下载的在线工具箱. 魔众工具箱系统发布v2.4.0版本,新功能和Bug修复累计9项,常规升级, ...

  5. 《仙剑奇侠传online》游戏后台优化分析:CPU、内存与启动时间

    一.服务器CPU性能优化 1.1寻路算法JPS优化 MMORPG游戏中服务器中需要对NPC寻路,然而A*算法及其各种优化并不让人满意,因此寻路算法也成为瓶颈之一. 因此,本文介绍JPS的效率.多线程. ...

  6. Android性能优化-App后台优化

    原文链接 Background Optimizations 前言 后台进程是内存和电池敏感的.一个隐式的broadcast可能会启动很多监听它的后台进程,即使这些进程可能做得工作不多.这可能丢设备性能 ...

  7. Djiango SimpleUI后台优化

    Djiango自带的admin后台默认是英文且右侧有广告,并且样式颜色也不太美观,需要使用SimpleUI做一些优化 将原有的默认logo换成自己想要的,以及去掉右边的广告部分 # 设置站点logo ...

  8. magento bug|美国时间冬令时夏令时变更导致后台订单统计出现异常

    今天早上就又客户反映后台根据时间筛选订单统计异常.简单来讲就是在后台的订单列表,选择from日期和to日期,筛选不出想要的对应日期的订单.而想查找今天的订单,需要把选择的时间提前一天,这样就会有结果了 ...

  9. 微信小程序在网络差情况下打不开?后台优化处理思路

    启动小程序支持异步 Launch,使用默认本地缓存的配置.代码包来启动小程序,避免卡在 Loading 页面 支持弱网 / 离线一次性授权,在弱网周期内对授权类接口使用一次性弹窗授权,解决弱网或断网场 ...

最新文章

  1. 如何获取启动页activity
  2. 评审不给钱,看论文还要涨价?UCLA:我们决定抵制柳叶刀、细胞
  3. Java面试参考指南——同步
  4. 【GDKOI2003】分球
  5. java 消息传递示例_java actor模型和消息传递简单示例
  6. Keras版Faster-RCNN代码学习(IOU,RPN)1
  7. Maven之自定义pom类型的基础项目
  8. hello ,test livewriter
  9. 2020 第十一届蓝桥杯大赛软件赛省赛(第一场),C/C++大学B组题解
  10. 13-hadoop-入门程序
  11. 戴尔服务器显示器接口类型,拒绝凌乱桌面 Type-C接口显示器的魅力
  12. android studio systrace,Android Systrace 基础知识 -- Systrace 简介
  13. 电子科技大学计算机系王教授,王书振 | 个人信息 | 西安电子科技大学个人主页...
  14. 2020年安卓各大应用市场份额占比分析
  15. 人工智能、机器学习和深度学习的关系
  16. 编程中保护眼睛的颜色
  17. 关于android上的定位
  18. Zoundry Raven网易博客设置
  19. 同学,你听说过MOT吗?
  20. 360随身wifi不可以ping

热门文章

  1. 5g/4g边缘计算网关
  2. Ubuntu装机步骤(另加装机脚本)
  3. 2021年烟花爆竹经营单位主要负责人考试技巧及烟花爆竹经营单位主要负责人试题及解析
  4. Java练习------------封装
  5. 魔百盒M201-D-S905L芯片_免拆_卡刷固件包及教程
  6. 中企动力詹衡:低价拼装式经营让“云”轻松落地
  7. 计算机组装与维护 案例,计算机组装与维护案例教程
  8. 前端面试题 Vue 中的 生命函数(钩子函数)
  9. C# 判断日期是否是今天(某一天)
  10. 还是找程序员做老公,最靠谱!