位置时区检测

位置时区检测在 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_time_zone_manager服务运行在系统服务器进程中。

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

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

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

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

作为这些选择的结果,在将当前原点切换到位置之后,或者在切换当前用户之后,通常需要几秒钟才能检测到时区。这也取决于所使用的 LTZP 的实现。

AOSP 位置时区检测实现最多允许两个 LTZP,一个主 LTZP 和一个辅助 LTZP,如下所述:

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

如图 1 所示, time_zone_detector服务从电话或位置源接收时区建议。位置来源接收来自主要或次要 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 参考 Location Time Zone Provider

AOSP 在packages/modules/GeoTZ下包含一个参考 Location Time Zone Provider 实现。此参考实现使用 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