2017-09-04 151 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文件的格式。

請記住,刪除時區數據不是我會推薦的。所有的歷史數據都很重要,並且(幾乎)總是有一些時區在幕後操作。您必須進行大量測試,以確保它不會影響應用程序的任何方面(某些與日期相關的錯誤,特別是時區,可能會非常棘手且難以調試)。祝你好運!