2017-09-04 96 views
1

是否有可能从我的构建中去除乔达时间的时区文件?我只在发布版本中使用1,在调试版本中使用2以在测试中使用。Android:Joda删除时区原始文件

我的应用程序只在一个国家可用,减少2MB似乎是一个好主意让我围绕20MB标记。

回答

0

你可以得到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文件的格式。

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