位置信息时区检测

Android 12 及更高版本中提供的位置信息时区检测是一项可选的自动时区检测功能,让设备可以使用其位置信息和时区地图数据确定时区。

位置信息时区检测是电话时区检测的替代机制。由于此功能不需要电话功能,因此除了移动电话设备外,各种外形规格的设备均支持此功能。

位置信息时区检测功能由 AOSP 平台中的以下组件组成:

  • 系统服务器中的时区检测逻辑。
  • Android 12 的“设置”中引入的一个可供用户使用的选项,让用户可以在电话和位置信息时区检测机制之间进行选择。
  • 一个用于执行位置信息检测和时区映射的组件的插件系统。插件称为位置信息时区提供程序 (LTZP),一台设备上最多可以设置两个此类插件。
  • 一个 LTZP 参考实现。
  • 主机工具,用于从 OpenStreetMap 数据生成参考数据集,该数据集可用于参考实现。

用户隐私

位置信息时区检测功能包含以下用户隐私功能:

  • 用户可以随时关闭位置信息时区检测功能。
  • 由位置信息得出的时区建议不会在一台设备上的用户之间共享。
  • 用户可以通过日期和时间设置屏幕为时区检测明确控制位置信息检测。用户不必通过权限对话框明确授予权限。
  • 设备位置信息不会传递到 Android 平台服务。实际情况如下:

    • LTZP 向时区检测器服务发送时区 ID,而不是设备的位置信息。这是支持位置信息时区检测时至少需要的 API。
    • 各个 LTZP 的操作由系统集成商决定。LTZP 实现可以使用完全保留在 Android 设备上的时区地图数据、利用服务器,或使用混合方法。

功能行为

time_zone_detector 服务会根据从检测源站那里收到的建议来确定何时更改设备的当前时区。

location_time_zone_manager 服务负责为 time_zone_detector location 源站生成建议。location_time_zone_manager 服务在系统服务器进程中运行。

location_time_zone_manager 服务不包含任何时区检测逻辑。它负责管理一个或两个名为位置信息时区提供程序 (LTZP) 的插件的生命周期。

如果不需要执行位置信息时区检测,LTZP 就不会启动。这意味着,位置信息时区检测系统不会要求 LTZP 跟踪设备的位置,除非明确要求。造成这一行为的一些原因如下:

  • 与在正常电话操作中被动接收的电话信号不同,位置信息时区检测系统可以主动向 Android 位置信息提供程序请求位置信息,这可能会消耗额外的电量。
  • 位置信息设置针对的是用户,Android 必须遵循当前用户的设置。
  • 获取设备的位置信息涉及隐私。

此外,location_time_zone_manager 服务会在当前用户发生切换后提供不确定的建议(如果需要),以免在用户之间共享位置信息。

由于这些选择,在将当前源站切换为 location 或切换当前用户后,通常需要几秒钟的时间才能检测到时区。这也取决于所用的 LTZP 的实现。

AOSP 位置信息时区检测实现最多允许使用两个 LTZP:一个主要 LTZP 和一个次要 LTZP,定义如下:

主要 LTZP
在用户允许位置信息时区检测功能运行后始终运行。
次要 LTZP
在下列情况下运行:主要 LTZP 报告时区不确定、报告永久性故障或在初始化期间超时。如果主要 LTZP 提交确定建议,则停止。

如图 1 所示,time_zone_detector 服务从 telephony 或 location 源站接收时区建议。location 源站会收到主要或次要 LTZP 的建议。

位置信息时区检测信息流程

图 1. 位置信息时区检测信息流程。

设备配置要求

如需支持位置信息时区功能,必须为设备配置其可以使用的 LTZP。设备要求至少启用和配置一个 LTZP,这样位置信息时区检测才能正常运行,并在“设置”中对用户可见。

设备配置

本部分介绍设备制造商如何配置设备来支持位置信息时区检测。

基本 AOSP 配置位于 frameworks/base/core/res/res/values/config.xml 中:

配置键 AOSP 值 说明
config_enableGeolocationTimeZoneDetection true 这是位置信息时区检测功能的主控件。

AOSP 中默认支持该功能。必须至少启用或配置一个 LTZP,用户才能使用该功能。

将值设置为 false 可完全停用该功能,以节省少量内存。
config_enablePrimaryLocationTimeZoneProvider false 这用于启用主要 LTZP。
config_primaryLocationTimeZoneProviderPackageName 将此项设置为主要提供程序服务所在的应用的软件包名称。
config_enableSecondaryLocationTimeZoneProvider false 这用于启用次要 LTZP。
config_secondaryLocationTimeZoneProviderPackageName 将此项设置为次要提供程序服务所在的应用的软件包名称。

默认情况下,AOSP 配置会将 config_enableGeolocationTimeZoneDetection 键设置为 true,从而支持位置信息时区检测功能。该功能最初对用户不可见,因为 AOSP 默认不包含 LTZP 配置。不过,借助此默认配置,设备制造商可以通过命令行启用和模拟 LTZP,以进行测试。(如需了解详情,请参阅调试和测试。)

位置信息时区提供程序的配置和部署

配置 LTZP 时,请阅读 frameworks/base/core/java/android/service/timezone/TimeZoneProviderService.java 源代码中的说明。Javadoc 注释提供了有关该服务、所需权限和其他配置的详细信息。

如需配置位置信息时区提供程序,设备制造商必须选择一个应用进程来托管 LTZP 的服务。为 LTZP 建立专用进程很耗费资源;理想情况下,所选应用进程应始终运行,例如系统服务器进程。

在带有模块化系统组件(模块)的设备上,考虑 LTZP 所用的地理位置数据与时区数据模块 (com.android.tzdata) 中执行的时区规则 (tzdb) 之间的交互。如果对其中一项进行更新,而不更新另一个,则可能会导致版本偏差问题。如需了解详情,请参阅功能采用方面的注意事项

AOSP 参考位置信息时区提供程序

AOSP 在 packages/modules/GeoTZ 下包含位置信息时区提供程序参考实现。此参考实现使用 AOSP API 确定设备的位置信息,并使用设备端数据文件将位置信息映射到一组时区 ID。

源自其他开源项目的参考数据集包含在源代码中。如需了解详情,请参阅 README.md 和各种许可文件。

调试和测试

以下部分介绍了用于调试和测试位置信息时区检测功能的 shell 命令。

与 location_time_zone_manager 服务交互

如果搭载 Android 12 或更高版本的设备支持 location 源站,Android 会在启动时实例化 location_time_zone_manager 服务。

如需转储 location_time_zone_manager 的当前状态,请使用以下命令:

adb shell cmd location_time_zone_manager dump

如需查看大量用于协助测试的命令行选项,请使用:

adb shell cmd location_time_zone_manager help

帮助输出还描述了 device_config 服务属性,它们可用于在测试环境或生产环境中影响 time_zone_detector 的行为。如需了解详情,请参阅使用 device_config 服务配置设备

LTZP 实现还可以提供自己的调试或测试支持。例如,当 AOSP 参考 LTZP 在系统服务器进程中注册之后,您可以使用以下命令对其进行调试。

adb shell dumpsys activity service android/com.android.timezone.location.provider.OfflineLocationTimeZoneProviderService