【问题标题】:Android: Joda remove Timezone raw filesAndroid:Joda 删除时区原始文件
【发布时间】:2018-02-12 15:44:37
【问题描述】:

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

我的应用程序仅在一个国家/地区可用,减少 2MB 似乎是个不错的主意,可以让我达到 20MB 大关。

【问题讨论】:

    标签: android performance timezone jodatime tzdata


    【解决方案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");
      

      这样,异常就消失了。


    选择您想要的时区

    如果您想使用其他时区而不仅仅是 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 文件的格式。

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

    【讨论】:

      猜你喜欢
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 2012-07-26
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      • 2011-01-29
      相关资源
      最近更新 更多