AOSP世界时间的更新
在 AOSP(Android Open Source Project)中,世界时间的更新主要涉及设备时区数据的管理和更新
,以确保设备能够正确显示全球各地的时间。AOSP 依赖 IANA 时区数据库(也称为 tzdata)来提供时区规则和世界时间数据,而这些数据的更新通常通过系统模块(如 Mainline 模块)或固件更新实现。
1. AOSP 中世界时间的数据来源
AOSP 使用 IANA 时区数据库(tzdata)来管理世界时间和时区信息:
- IANA tzdata:由国际互联网编号分配机构(IANA)维护的全球时区数据库,包含全球时区规则、夏令时变化、历史时区数据等。对时间和时区不够理解的可以查看这篇博文:Android时间相关的概念理解
- 存储位置:在 AOSP 源码中,
tzdata
文件通常位于system/timezone
目录,并被编译到系统镜像(system.img
)中的/system/usr/share/zoneinfo/
目录。 - 内容:包括时区规则(如
Asia/Shanghai
)、偏移量、夏令时(DST)切换时间等。
示例:/system/usr/share/zoneinfo/Asia/Shanghai
包含中国标准时间的规则(固定 UTC+8,无夏令时)。
2. 世界时间更新的机制
AOSP 中世界时间的更新主要通过以下方式实现:
(1) Mainline 模块更新(Android 10 及以上)MainLine简介
- 背景:从 Android 10 开始,
tzdata
被模块化为 APEX 模块(com.android.tzdata
),可以通过 Google Play 系统更新(Google Play System Updates)独立更新,而无需完整的 OTA 固件更新。 - 更新流程:
- Google 定期从 IANA 获取最新的
tzdata
数据。 - 编译为
com.android.tzdata
APEX 模块,推送到设备。 - 设备通过 Google Play 系统更新下载并安装模块(存储在
/apex/com.android.tzdata
)。 - 系统加载新的时区数据,应用到时间显示和计算。
- Google 定期从 IANA 获取最新的
- 优点:
- 快速更新:无需等待 OEM 的完整固件更新。
- 一致性:所有支持 Mainline 的设备使用相同的时区数据。
- 限制:
- 仅 Android 10 及以上设备支持。
- 需要 Google Play 服务支持,AOSP 纯净版设备可能无法直接获取。
(2) 系统固件更新(OTA)
- 对于不支持 Mainline 模块的设备(例如 Android 9 或更早版本),
tzdata
更新需要通过完整的系统固件更新(OTA):- OEM 或开发者将新的
tzdata
文件编译到system.img
中。 - 通过 OTA 推送更新,替换
/system/usr/share/zoneinfo/
目录中的数据。
- OEM 或开发者将新的
- 缺点:
- 更新速度慢,依赖 OEM 的适配和推送。
- 许多设备可能无法及时获取最新的时区数据。
(3) 手动更新(开发者或 Root 设备)
- 开发者或高级用户可以通过手动替换
tzdata
文件更新时区数据:- 从 IANA 官网(
https://www.iana.org/time-zones
)下载最新的tzdata
文件。 - 编译或直接替换
/system/usr/share/zoneinfo/
中的文件。 - 需要 Root 权限或修改系统分区,操作复杂且有风险。
- 从 IANA 官网(
3. 如何在 AOSP 中配置世界时间更新
(1) 单编
1. 下载最新的 IANA 时区数据
- 操作:
- 打开 AOSP 源码的
system/timezone/input_data/iana/
目录,查看当前tzdata
版本(例如tzdata2018e.tar.gz
和tzdata2018e.tar.gz.asc
)。 - 访问 IANA 官网,下载对应版本或更新的
tzdata*.tar.gz
和tzdata*.tar.gz.asc
文件。或者在AOSP的system/timezone下执行download-iana-files.py
下载相关文件(需要能够访问外部网络)
- 打开 AOSP 源码的
- 注意:
- 确保下载的版本与目标 Android 版本兼容(例如,Android 15 可能需要
tzdata2024a
或更新)。 .asc
文件是签名文件,用于验证tzdata
的完整性。
- 确保下载的版本与目标 Android 版本兼容(例如,Android 15 可能需要
2. 替换旧的时区数据
- 操作:
- 将下载的
tzdata*.tar.gz
和tzdata*.tar.gz.asc
放入system/timezone/input_data/iana/
目录。 - 删除目录中旧版本的
tzdata
文件(例如tzdata2018e.tar.gz
)。
- 将下载的
- 注意:
- 备份旧文件以防出错。
- 确保文件名和格式正确,避免编译错误。
3. 执行 update-tzdata.py
脚本
- 操作:
- 设置 AOSP 编译环境:
source build/envsetup.sh lunch aosp_divide-userdebug # 替换为你的设备目标,例如 aosp_divide
- 进入
system/timezone/
目录:cd system/timezone
- 运行
update-tzdata.py
脚本:python update-tzdata.py
- 设置 AOSP 编译环境:
- 输出:
- 脚本会在以下目录生成更新后的文件:
system/timezone/output_data/iana/tzdata
:最新的 IANA 时区数据库。system/timezone/output_data/icu_overlay/icu_tzdata.dat
:ICU 格式的时区数据。external/icu/icu4c/source/data/misc/zoneinfo64.txt
:ICU 时区元数据。external/icu/icu4c/source/stubdata/icudt60l.dat
:ICU 数据存根。external/icu/icu4j/main/shared/data/icutzdata.jar
:ICU Java 库的时区数据。
- 脚本会在以下目录生成更新后的文件:
- 注意:
- 确保 Python 环境正确(AOSP 通常使用 Python 2 或 3,视版本而定)。
- 脚本会根据
input_data/iana/tzdata*.tar.gz
更新所有相关文件。
4. 重新编译 AOSP打包刷机
(2) 在谷歌的gerrit上下载更新
Google会定期更新世界时间因此只需要在谷歌的gerrit上下载即可
https://android-review.googlesource.com/q/message:TZDB
谷歌每次更新一般都是对这三个目录下的文件进行修改
system/timezone
external/icu
external/cldr
然后将这三个目录下的所有文件下载
通过git 将这三个目录下是所有内容全部clone下来。然后使用对比工具,和项目内部的进行逐一对比,进而更新项目内部的文件。
设置添加新的时区
修改packages/apps/Settings/res/xml-xx-xx/timezones.xml (xx-xx表示不同的语言和区域),添加下面的内容:
<!-- timezones.xml 用于在setting中增加一个时区设置项 --><timezone id="Africa/Lagos">Lagos</timezone>
如果是多个国家和语言,则可以使用Android Studio 进行替换添加
可能会遇到的修改
修改NTP服务器地址 设备联网无法同步时间
在 frameworks/base/core/res/res/values/config.xml 文件中修改
<string-array translatable="false" name="config_ntpServers"><item>ntp://time.android.com</item><item>ntp7.aliyun.com</item></string-array>
设置默认时区
在device下的mk文件中添加
PRODUCT_PROPERTY_OVERRIDES += persist.sys.timezone=Asia/Shanghai