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()和createAndInitializeUser()方法已弃用,取而代之的是DevicePolicyManager.createAndManageUser()方法。
设备所有者可以访问设备标识符。设备所有者可以使用DevicePolicyManagewr.getWifiMacAddress()访问设备的 Wi-Fi MAC 地址。 如果设备上从未启用 Wi-Fi,则此方法将返回一个null值。
工作模式设置控制工作应用访问。当工作模式关闭时,系统启动器通过使工作应用显示为灰色来指示它们不可用。 启用工作模式会再次恢复正常行为。
如需了解有关 Android N 中针对 Android for Work 所做变更的详细信息,,请参阅https://developers.google.com/android/work/overview
注解保留
Android N 在注解可见性被忽略时修复错误。这种问题将启用本不应被允许的运行时访问注解。 这些注解包括:
VISIBILITY_BUILD:仅应编译时可见。
VISIBILITY_SYSTEM:运行时应可见,但仅限基本系统。
如果您的应用依赖这种行为,请在注解中添加一项运行时必须可用的保留政策。 您可通过使用@Retention(RetentionPolicy.RUNTIME)来如此做。
其他重要说明
如果一个应用在 Android N 上运行,但却是针对更低 API 级别开发的,那么在用户更改显示尺寸时,系统将终止此应用进程。 应用必须能够正常处理此情景。 否则,当用户从最近使用记录中恢复运行应用时,应用将会出现崩溃现象。
您应测试应用以确保不会发生此行为。要进行此测试,您可以通过 DDMS 手动终止应用,以造成相同的崩溃现象。
在密度发生更改时,系统不会自动终止面向 N 及更高版本的应用;不过,这些应用仍可能对配置变更做出不良响应。
Android N 上的应用应能够正常处理配置变更,并且在后续启动时不会出现崩溃现象。您可以通过更改字体大小 (Setting>Display>Font size) 并随后从最近使用记录中恢复运行应用,来验证应用行为。
由于之前的 Android 版本中的一项错误,系统未能将对主线程上的一个 TCP 套接字的写入操作举报为严格模式违反。 Android N 修复了此错误。呈现出这种行为的应用引发android.os.NetworkOnMainThreadException。一般情况下,我们不建议在主线程上执行网络操作,因为这些操作通常都有可能导致 ANR 和卡顿的高尾延迟。
Debug.startMethodTracing()方法族现在默认在您的共享的存储空间上的软件包特定目录中存储输出,而非 SD 卡顶级。 这意味着应用不再需要请求WRITE_EXTERNAL_STORAGE使用这些 API 的权限。
许多平台 API 现在开始检查在Binder事务间发送的大负载,系统现在会将TransactionTooLargeExceptions再次作为RuntimeExceptions引发,而不再只是默默记录或抑制它们。 一个常见例子是在Activity.onSaveInstanceState()上存储过多数据,导致ActivityThread.StopInfo在您的应用面向 Android N 时引发RuntimeException。
如果应用向View发布Runnable任务,并且View未附加到窗口,系统会用View为Runnable任务排队;在View附加到窗口之前,Runnable任务不会执行。 此行为会修复以下错误:
如果一项应用是从并非预期窗口 UI 线程的其他线程发布到View,则Runnable可能会因此运行错误的线程。
如果Runnable任务是从并非环路线程的其他线程发布,则应用可能会曝光Runnable任务。
如果 Android N 上一项有DELETE_PACKAGES权限的应用尝试删除一个软件包,但另一项应用已经安装了这个软件包,则系统可能要求用户确认。 在这种情况下,应用在调用PackageInstaller.uninstall()时的返回状态应为STATUS_PENDING_USER_ACTION。