This directory contains code, tools and data related to time zone rules data
and updates.

Directory structure
===================

apex
  - Code related to the Android time zone update APEX file that can be used
    to update time zone rules on Android devices.

debug_tools
  - Contains tools useful for debugging time zone issues on Android devices.

distro
  - Code related to "distros", the collection of files that can be used to
    update time zone rules on Android devices. See distro/README for details.

input_data
  - Contains files that provide inputs to the time zone rules update process.
    Some files come from external sources and some are mastered in Android.
    See also download-iana-data.py.

input_tools
  - Contains tools that generate Android time zone files.

output_data
  - Contains some derived files from the time zone rules update process and
    used in the Android system image, distros and APEX files. Some files are
    also held by ICU - see also update-tzdata.py

testing
  - Contains tools and scripts related to testing time zone update code. See
    testing/data/README for details.

tzdatacheck
  - This is for the "time zone updates via APK" feature.
    Source code for a binary executed during boot and used to ensure that a
    device doesn't boot with incompatible/outdated time zone data installed
    in /data (as could happen if the device has just received an OTA upgrade).
    It is also responsible for committing staged install/uninstalls.



Data file update tools
======================

download-iana-files.py
  - A helper script run before update-tzdata.py.
    It downloads the latest tzdata and/or tzcode files from IANA and puts them
    in the input_data/iana and input_tools/iana directories for use by the
    update-tzdata.py script. See download-iana-files.py --help for more.

update-tzdata.py
  - Regenerates the external/icu and system/timezone/output_data timezone
    data files.

See update instructions below for how these tools are used.

IANA rules data changes
=======================

When IANA release new time zone rules, the update process is:

1) Run "download-iana-files.py --data" to update the input_data/iana file.
2) Make manual modifications to input_data/android files as needed.
3) There are sometimes code and metadata changes associated with tzdata updates
  that should be applied to Android's copy of ICU.
  e.g. see http://bugs.icu-project.org/trac/search?q=2015d
4) Run update-tzdata.py to regenerate the system/timezone/output_data,
  system/timezone/testing/data, external/icu runtime files and testing equivalents.
5) Build/flash a device image with the changes and run CTS:
    cts-tradefed
    run cts -m CtsLibcoreTestCases
    run cts -m CtsIcuTestCases
   (And any others that you think may have been affected)
6) Upload, review, submit the changes from external/icu and system/timezone.

REMINDER: Any prebuilt apks of OEM-specific time zone data apps .apk files
(i.e. ones that that contain distro files) will also need to be regenerated
with a new version code / string and any OEM-specific tests should be run.
APEX files containing time zone data files will also need to be regenerated.

IANA tools changes
==================

Occasionally it might be necessary / desirable to update the version of zic
used to generate Android's tzdata file. For example, if IANA introduce new
syntax to the text rules files (e.g. asia, north_america, etc.) or adds useful
command-line arguments to zic. This should be needed very rarely.

It is recommended that this is done independently of a data update to help
isolate unexpected changes to behavior.

Note that updating the version of zic used to create the tzdata file is
independent of the copy of zic used by ICU. Also, bionic contains
a copy of tzcode (e.g. localtime.c) which is based on yet another IANA
release so compatibility and consistency is a consideration.

The steps for updating IANA tools are similar to updating IANA data except
you can use "download-iana-files.py --tools" instead of "--data" and testing
should be more rigorous.

REMINDER: As above, having updated the tooling then all binaries that contain
tzdata should also be regenerated. e.g. APK and APEX files.


Time Zone Data Set Versioning
=============================

Android needs various files to be updated to take a time zone data update.
These files come from various sources and we needed a concise shorthand
to indicate compatibility between a set of files and an Android release. This is
known as the "Time Zone Data Set Version". Currently we expect to increment this
version with every dessert release, though this may change in future.

The idea of a single version to describe time zone data updates was first
introduced in O-MR1 with the concept of a "distro" which could be delivered by
an APK. The Android time zone "distro" is a zip archive containing the files
needed to update a device's time zone rules by overlaying files into locations
in /data. See distro/ for details.

The "distro" concept will be removed in a future release of Android as it is
being replaced by an APEX file containing the same data. As the APEX contains
the same files we continue to use a shorthand version code. See apex/ for
details.

Time Zone Data Set Versions have a major and minor version number:

- Major version numbers are mutually incompatible. e.g. v2 is not compatible
  with a v1 or a v3 device.
- Minor version numbers are backwards compatible. e.g. a v2.2 distro will work
  on a v2.1 device but not a v2.3 device.
- The minor version is reset to 1 when the major version is incremented.

The most obvious/common change that can occur between Android releases is an
ICU upgrade, which currently requires a major version increment: Android uses
the ICU4C's native file format for both ICU4C and ICU4J time zone code which is
tied to the ICU major version. The main .dat file used by ICU is held in
external/icu and will naturally be updated when ICU is updated. Less obviously,
the time zone data set version code and files must be updated as well.

Other examples of changes that affect format versioning:

Major version increment:
- A non-backwards compatible change to the tzdata or tzlookup.xml files used
  by bionic / com/android/i18n/timezone code.
- Removal of an existing file from the distro.

Minor version increment:
- Backwards compatible changes:
  - A new file in the distro.
  - Additional required data in an existing file (e.g. a backwards compatible
    change to tzdata / tzlookup.xml).


Changing the Time Zone Data Set Version
---------------------------------------

1) Modify android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/TzDataSetVersion.java
  - CURRENT_FORMAT_MAJOR_VERSION, CURRENT_FORMAT_MINOR_VERSION
2) Run update-tzdata.py to regenerate the system/timezone/output_data,
   system/timezone/testing/data, external/icu runtime files and testing equivalents.
3) Build/flash a device image with the changes and run CTS tests:
    atest CtsHostTzDataTests
    atest CtsIcuTestCases
4) Run non-CTS test cases:
    atest FrameworksServicesTests:com.android.server.timezone
5) Upload, review, submit the changes from system/timezone and external/icu/.

REMINDER: Any prebuilt apks / apex files (i.e. ones that that contain time zone files)
will also need to be regenerated after this change.