Android:Joda删除Timezone原始文件

时间:2017-09-04 11:51:12

标签: android performance timezone jodatime tzdata

是否可以从我的构建中删除Joda-Time中的时区文件?我只在发布版本中使用1,在调试版本中使用2在测试中使用。

我的应用程序仅在一个国家/地区提供,减少2MB似乎是一个好主意让我获得20MB标记。

1 个答案:

答案 0 :(得分:1)

你可以获得Joda-Time's source code然后你有一些选择。

不要使用任何时区

当您构建项目(mvn clean package)时,它会生成一个joda-time-2.9.9-no-tzdb.jar文件,这是一个没有任何时区数据的jar文件。使用它需要一些调整:

  1. 使用此jar,唯一可用的时区是UTC。所以DateTimeZone.getAvailableIDs()DateTimeZone.getDefault()只返回UTC。您无法在其他时区之间进行转换,因为UTC是唯一可用的时区。
  2. 在调用某些方法时,我会遇到一些异常(Resource not found: "org/joda/time/tz/data/ZoneInfoMap")。要摆脱它,我必须将默认时区提供程序设置为UTC:

    System.setProperty("org.joda.time.DateTimeZone.Provider", "org.joda.time.tz.UTCProvider");
    

    这样,例外情况就不复存在了。

  3. 选择您想要的时区

    如果你想使用另一个时区而不仅仅是UTC,那么还有另一种选择。

    pom.xml文件中,查找compile-tzdb执行并评论您不想包含在jar中的文件。在这个例子中,我只保留southamerica文件:

    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.4.0</version>
            <executions>
                <execution>
                    <id>compile-tzdb</id>
    ... lots of lines ...
    
    <!-- Commenting the TZ files I don't want -->
    <!-- <argument>africa</argument> -->
    <!-- <argument>antarctica</argument> -->
    <!-- <argument>asia</argument> -->
    <!-- <argument>australasia</argument> -->
    <!-- <argument>europe</argument> -->
    <!-- <argument>northamerica</argument> -->
    <argument>southamerica</argument>
    <!-- <argument>pacificnew</argument> -->
    <!-- <argument>etcetera</argument> -->
    <!-- <argument>backward</argument> -->
    <!-- <argument>systemv</argument> -->
    

    然后用:

    构建它
    mvn clean package -Dmaven.test.skip=true
    

    我正在跳过测试,因为其中一些测试使用的是南美文件中没有的时区(例如Europe/London)。当然你也可以根据需要改变测试,但是我选择了最快的方式(我通常不会在生产版本中跳过测试,不要评判我)

    然后,joda-time-2.9.9.jar文件将仅包含南美时区文件。如果要包含同义词(某些区域的名称已更改,但旧名称保留并成为backward文件中的同义词),您可以选择在构建中包含backward文件。

    有了这个,生成的jar将只包含南美洲区域和UTC。如果JVM默认时区不是南美时区之一,DateTimeZone.getDefault()将返回UTC。

    如果您想减少更多区域文件,可以手动编辑它们。但是,您必须小心不要从要保留的时区中删除重要数据。 Here's a tutorial关于IANA tz文件的格式。

    请记住,删除时区数据不是我建议的。所有历史数据都很重要,并且(几乎)总是在幕后扮演一些时区。您必须进行大量测试以确保它不会影响应用程序的任何方面(某些与日期相关的错误,特别是涉及时区,可能很棘手且难以调试)。祝你好运!