Android 7.1.1 引入了对零售演示模式的系统级支持,以便客户可以在零售店检查运行中的设备。使用设备所有者应用程序为零售演示设置设备,以确保设备使用仅限于某些演示模式应用程序。最终用户不得在零售演示设备上添加个人帐户。 Android 8.1 修改了此支持,通过 DevicePolicyManager createAndManageUser API 创建演示用户。这允许在演示设备上的用户管理和设备策略管理方面对标准零售模式进行更大程度的 OEM 定制。
虽然DevicePolicyManager API 可以在 Android 8.1 之前的版本上使用,但在 8.0 及更早版本中无法使用createAndManageUser API 创建演示类型用户 ( DevicePolicyManager.MAKE_USER_DEMO
)。
在 Android 8.1 及更高版本中的实现
本节重点介绍平台增强功能并介绍 Android 8.1 及更高版本中的零售演示应用程序。
平台变更
设置DEVICE_DEMO_MODE
实现基于设备所有者的零售演示模式的设备必须在配置之前将Settings.Global.DEVICE_DEMO_MODE
为 1,以指示正在为零售演示模式配置设备。 SystemServer使用此标志来管理零售模式的各个方面,例如电源配置文件和 SystemUI。
启用RetailDemoModeService
在实现零售演示模式的设备中,设置向导将全局设置Global.DEVICE_DEMO_MODE
设置为true
以指示设备已进入零售模式。看到此设置后, RetailDemoModeService创建一个演示用户并在用户 0 启动时切换到该用户,启用覆盖资源中指定的自定义启动器,并禁用 SUW。 System Server 和 SystemUI 也使用这个标志来管理零售模式的各个方面。
设置自定义启动器或视频播放器
设备制造商可以通过覆盖config.xml文件中指定的框架资源config_demoModeLauncherComponent
来指定自定义启动器,如下所示。
<!-- Component that is the default launcher when Retail Mode is enabled. -->
<string name="config_demoModeLauncherComponent">com.android.retaildemo/.DemoPlayer</string>
位于/packages/apps/RetailDemo的零售演示 DemoPlayer 应用程序是 Android 开源项目 (AOSP) 中的默认自定义启动器。该应用程序在设备分区(例如 /data/preloads/demo/retail_demo.mp4)中查找视频并循环播放。当用户触摸屏幕时,自定义启动器会禁用其活动组件,这会导致默认系统启动器启动。
自定义启动器必须将其自定义组件默认标记为禁用,这样它就不会出现在非演示场景中。在演示场景中,System Server 在启动新的演示会话时启用指定的config_demoModeLauncherComponent
。
安装向导还会查找前面提到的视频,以提供进入零售模式的途径。如果视频不是演示的一部分,则可以修改 SUW 以查找支持零售模式的其他 OEM 特定标志。如果有系统 A/B 分区,系统 B 分区必须包含 /preloads/demo 中的演示视频。这会在第一次启动时被复制到 /data/preloads/demo。
为零售演示模式自定义预加载的应用程序
预加载的应用程序可以通过调用UserManager.isDemoUser()
API 来查看应用程序是否在演示环境中启动,从而针对零售演示模式自定义其体验。
在演示用户中设置了某些限制,类似于阻止应用程序和用户执行某些操作的托管设备或配置文件策略。这些限制之一是DISALLOW_MODIFY_ACCOUNTS
。由于此限制, AccountManager和Settings不允许添加帐户。某些 Google 应用会对此限制做出反应并显示错误消息,而其他应用则不会提示输入帐户(例如 YouTube 和照片)。我们建议 OEM 应用程序还检查是否设置了DISALLOW_MODIFY_ACCOUNTS
并相应地处理该情况。
系统升级
默认情况下,启用零售模式后,设备策略会自动设置为无线 (OTA) 更新。零售设备将下载、重启和安装更新(根据电池阈值),无需用户交互。
零售演示应用程序
基于设备所有者的零售演示模式实现需要将设备策略控制器应用设置为设备所有者。 AOSP 在/packages/apps/RetailDemo中包含参考 RetailDemo 应用程序实现。
设备所有者应用程序不需要提升权限或在系统映像上进行预安装,并且可以在设置或配置过程中下载。它们大多像传统应用程序一样实现,但有以下区别:
所有设备所有者应用程序都必须扩展DeviceAdminReceiver组件,该组件用作所有DevicePolicyManager API 的授权令牌。该组件必须持有
android.permission.BIND_DEVICE_ADMIN
权限,包括请求的特殊策略作为元数据,并过滤android.app.action.PROFILE_PROVISIONING_COMPLETE
和android.app.action.DEVICE_ADMIN_ENABLED
意图。设置为创建特殊演示类型用户的DevicePolicyManager#MAKE_USER_DEMO标志是一个隐藏的 API。该标志的值为常量 0x4。
设备所有权只能通过设备管理角色持有者或ManagedProvisioning应用分配。
DevicePolicyManager类中的 API 使设备所有者 (DO) 和配置文件所有者 (PO) 能够执行各种设备策略。下面列出了一些适用于零售演示模式的DevicePolicyManager函数。
创建和管理用户。
重新启动设备。
设置 LockTask 允许的包。
通过PackageInstaller安装包。
阻止软件包被卸载。
启用自动系统更新。设备将自动下载并应用 OTA 更新。
禁用键盘锁。
防止设置密码或指纹。
设置一组列入白名单的Settings.Global 、 Settings.Secure和Settings.System设置。
将权限策略设置为
PERMISSION_POLICY_AUTO_GRANT
,这会自动授予所有运行时权限。权限的授予也可以更窄:对单个应用程序的单一权限。这不适用于应用程序操作权限,用户仍必须在每个用户、每个应用程序的基础上授予这些权限。设置与UserManager中定义的零售模式相关的用户限制,如下所示。
-
DISALLOW_MODIFY_ACCOUNTS
-
DISALLOW_USB_FILE_TRANSFER
-
DISALLOW_DEBUGGING_FEATURES
-
DISALLOW_CONFIG_WIFI
-
DISALLOW_CONFIG_BLUETOOTH
-
DISALLOW_INSTALL_UNKNOWN_SOURCES
-
DISALLOW_CONFIG_MOBILE_NETWORKS
-
使用网络更新演示视频
如果有网络连接, /packages/apps/RetailDemo中的 RetailDemo 应用程序能够更新演示视频。可以通过覆盖 RetailDemo 应用程序中的以下字符串值来配置下载视频的 URL。
<!-- URL where the retail demo video can be downloaded from. -->
<string name="retail_demo_video_download_url"></string>
如果需要在不同的地区使用不同的视频,那么可以使用res/values-*/strings.xml中的 locale-specific string 资源配置不同的下载 URL。比如美国和英国需要使用不同的视频,那么对应的下载地址可以放在res/values-en-rUS/strings.xml和res/values-en-rGB/strings.xml中,分别如下所示。
在 res/values-en-rUS/strings.xml 中:
<string name="retail_demo_video_download_url">download URL for US video goes here</string>
在 res/values-en-rGB/strings.xml 中:
<string name="retail_demo_video_download_url">download URL for UK video goes here</string>
每次设备重新启动时,该视频最多下载一次。当设备上的视频正在播放时,RetailDemo 应用程序会在后台检查是否提供了下载 URL 以及该 URL 上的视频是否比正在播放的视频更新。
如果是这样,RetailDemo 应用程序将下载并开始播放视频。下载视频后,它将用于在以后的所有演示会话中播放。在下次重新启动之前,不会再次进行任何检查。
演示视频指南
演示视频必须采用纵向布局,或者如果是平板电脑,则采用设备的自然方向,并且长度可以超过五秒。内容不得导致烙印,因为它会在显示时不断播放。
有关详细信息,请参阅Android 开发人员对用户、配置文件和帐户的定义、设备策略管理器 API 文档和示例设备所有者应用程序。
验证
CTS 不包括零售演示模式,因为它是一项可选功能。必须手动进行测试或使用演示应用程序的单元测试进行测试。
演示环节
演示会话的设置
如果出厂时配置为演示模式,零售演示设备可能会启动进入零售演示模式。或者,零售员工可以直接从设置向导启用零售模式。
图 2.零售示范模式
显示演示会话
当设备进入零售模式时,它会切换到新的演示用户并自动启动覆盖资源中指定的自定义启动器,如实施中所述。默认情况下,此自定义启动器会重复播放演示视频,直到用户触摸屏幕以开始演示用户会话。那时,自定义启动器启动系统启动器,然后退出。 OEM 可以更改自定义启动器以在退出时另外启动其他服务或活动。
为了保持零售模式的完整性,键盘锁被禁用,并且可能对零售模式产生不利影响的“快速设置”中的某些操作也被禁止,包括以下内容。
- 飞行模式切换。
- 删除或修改 Wi-Fi 接入点(设置)。
- 更改运营商(设置)。
- 配置热点(设置)。
- 用户切换。
此外,还可以通过禁用以下内容来阻止对某些可能影响零售模式的全局设置的访问:
- 无线网络设置。
- 蜂窝网络配置选项,尤其是热点。
- 蓝牙配置。
- 备份和重置、日期和时间以及移动网络(它们根本不显示)。
如果用户空闲一段时间(默认为 90 秒),零售模式会显示一个系统对话框,提示用户退出会话或继续。如果用户选择退出或五秒钟内没有响应,零售模式将删除当前演示用户,切换到新的演示用户,并再次循环播放原始视频。如果使用电源按钮关闭屏幕,它会在几秒钟后自动恢复。
退出演示会话后,设备会自行静音并重置一些全局设置,包括以下内容:
- 亮度
- 自动旋转
- 手电筒
- 语
- 辅助功能
退出零售演示模式
为了退出零售模式,零售员工必须确保演示设备未在设备管理下注册,并通过引导加载程序将设备恢复出厂设置。