【发布时间】:2018-02-12 15:44:37
【问题描述】:
是否可以从我的构建中删除 Joda-Time 中的时区文件?我只在发布版本中使用 1 个,在调试版本中使用 2 个用于测试。
我的应用程序仅在一个国家/地区可用,减少 2MB 似乎是个不错的主意,可以让我达到 20MB 大关。
【问题讨论】:
标签: android performance timezone jodatime tzdata
是否可以从我的构建中删除 Joda-Time 中的时区文件?我只在发布版本中使用 1 个,在调试版本中使用 2 个用于测试。
我的应用程序仅在一个国家/地区可用,减少 2MB 似乎是个不错的主意,可以让我达到 20MB 大关。
【问题讨论】:
标签: android performance timezone jodatime tzdata
你可以得到Joda-Time's source code然后你有一些选择。
在构建项目(mvn clean package)时,它会生成一个joda-time-2.9.9-no-tzdb.jar 文件,这是一个没有任何时区数据的 jar 文件。使用它需要一些调整:
DateTimeZone.getAvailableIDs() 和DateTimeZone.getDefault() 只返回UTC。您将无法在其他时区之间进行转换,因为 UTC 是唯一可用的。在调用某些方法时,我遇到了一些异常 (Resource not found: "org/joda/time/tz/data/ZoneInfoMap")。为了摆脱它,我不得不将默认时区提供程序设置为 UTC:
System.setProperty("org.joda.time.DateTimeZone.Provider", "org.joda.time.tz.UTCProvider");
这样,异常就消失了。
如果您想使用其他时区而不仅仅是 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 文件的格式。
请记住,我不建议删除时区数据。所有的历史数据都很重要,并且(几乎)总是有一些时区在幕后起作用。您必须进行大量测试以确保它不会影响应用程序的任何方面(一些与日期相关的错误,特别是涉及时区的错误可能很棘手且难以调试)。祝你好运!
【讨论】: