位置时区检测

位置时区检测,在 Android 12 及更高版本上可用,是一项可选的自动时区检测功能,允许设备使用其位置和时区地图数据来确定时区。

位置时区检测是电话通讯时区检测的替代机制。由于此功能不需要电话通讯,因此除了移动电话通讯设备之外,各种外形尺寸的设备都可以支持此功能。

位置时区检测功能在 AOSP 平台中包含以下组件

  • 系统服务器中的时区检测逻辑
  • Android 12 中引入的设置中的用户可访问选项,允许用户在电话通讯和位置时区检测机制之间进行选择

  • 用于执行位置检测和时区映射的组件的插件系统。该插件称为位置时区提供程序 (LTZP),一个设备上最多可以有两个。平台提供必须用于实现 LTZP 的系统 API。

  • 参考 LTZP 实现。

  • 主机工具,用于从 Open Street Map (OSM) 数据生成可以与参考实现一起使用的参考数据集。

用户隐私

位置时区检测包括以下用户隐私功能

  • 当存在用于选择位置算法的切换开关时,用户可以随时关闭位置算法。

  • 位置派生的时区建议不会在设备上的用户之间共享。

  • 用户可以通过日期和时间设置屏幕显式控制用于时区检测的位置检测。用户无需通过权限对话框显式授予权限。

  • 设备位置信息不会传递给 Android 平台服务。而是发生以下情况

    • 时区检测器服务接收由 LTZP 发送的时区 ID,而不是设备的位置。这是支持位置时区检测所需的最小 API。
    • 系统集成商控制各个 LTZP 的运行。LTZP 实现可以使用完全保存在 Android 设备上的时区地图数据、使用服务器或使用混合方法。

功能行为

time_zone_detector 服务根据从检测算法接收到的建议,确定何时更改设备的当前时区。

location_time_zone_manager 服务负责为 time_zone_detector 的位置算法生成建议。location_time_zone_manager 服务在系统服务器进程中运行。

location_time_zone_manager 服务不包含任何时区检测逻辑。此服务负责管理一个或两个 LTZP 插件的生命周期。

当不需要位置时区检测时,LTZP 不会启动。这意味着位置时区检测系统不会要求 LTZP 跟踪设备的位置,除非明确要求这样做。此行为的一些原因包括以下几点

  • 与作为正常电话通讯操作的一部分被动接收的电话通讯信号不同,位置可以从 Android 位置提供程序主动请求,并可能消耗额外的电量。
  • 位置设置是用户范围的,Android 必须尊重当前用户的设置。
  • 获取设备的位置是隐私敏感的。

此外,当当前用户更改设置为避免在用户之间共享位置信息时,location_time_zone_manager 服务会发出不确定的建议(如果需要)。

由于这些选择,在将当前算法切换到位置或切换当前用户后,需要几秒钟才能检测到时区。这也取决于正在使用的 LTZP 的实现。

AOSP 位置时区检测实现允许最多两个 LTZP,即主要和辅助 LTZP,定义如下

主要 LTZP
当用户允许位置时区检测功能运行时,始终运行。
辅助 LTZP
如果主要 LTZP 报告时区不确定、报告永久性故障或在初始化期间超时,则运行。如果主要 LTZP 提交确定的建议,则停止。

如图 1 所示,time_zone_detector 服务接收来自电话通讯或位置算法的时区建议。位置算法接收来自主要或辅助 LTZP 的建议。

Location time zone detection information flow

图 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 状态 API

在 Android 14 中,LTZP API 支持 LTZP 报告状态信息。这使 LTZP 能够报告平台自身可能无法检测到的问题,因为平台时区检测组件未直接参与位置算法中的位置或时区检测。

当支持电话通讯后备模式时,报告 LTZP 的行为已因设备环境而降级的功能非常有用。例如,如果依赖于自定义设置或权限才能使其位置检测正常工作的第三方 LTZP 在降级模式下运行或被当前设备设置禁用,则 LTZP 可以通过 reportSuggestion 方法向设置应用等内部平台组件报告此状态信息。然后,设置应用可以通过可自定义的字符串或自定义项通知用户,必须更改某些设置才能使位置算法良好或完全正常工作。

有关 LTZP 可以报告的状态的更多信息,请参阅 TimeZoneProviderStatus

LTZP 配置和部署

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

要配置 LTZP,设备制造商必须选择一个应用进程来托管 LTZP 的服务。为 LTZP 提供专用进程的开销很高;理想情况下,选择的应用进程是始终运行的进程,例如系统服务器。

在具有模块化系统组件(模块)的设备上,请考虑 LTZP 使用的地理数据与 时区数据模块 (com.android.tzdata) 中携带的时区规则 (tzdb) 之间的交互。对其中一个进行更新而不同时更新另一个很可能会导致版本偏差问题。有关更多信息,请参阅功能采用注意事项

AOSP 参考 LTZP

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

源代码中包含从其他开源项目派生的参考数据集。有关更多详细信息,请参阅README.md 和各种 LICENSE 文件。

调试和测试

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

与 location_time_zone_manager 服务交互

当在运行 Android 12 及更高版本的设备上支持位置算法时,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

帮助输出还描述了可用于影响 time_zone_detector 行为以进行测试或在生产中使用的 device_config 服务属性。有关更多信息,请参阅使用 device_config 服务配置设备

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

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