Android: Joda удаляет сырые файлы Timezone
Можно ли удалить файлы часового пояса из Joda-Time из моей сборки? Я использую только 1 в сборках релиза и 2 в сборках отладки для использования в тесте.
Мое приложение доступно только в одной стране, и сокращение на 2 МБ кажется хорошей идеей, чтобы получить около 20 МБ.
1 ответ
Вы можете получить исходный код Joda-Time, а затем у вас есть несколько альтернатив.
Не используйте часовой пояс
Когда вы строите проект (mvn clean package
), он генерирует joda-time-2.9.9-no-tzdb.jar
файл, который является файлом JAR без каких-либо данных о часовом поясе. Использование этого потребует некоторых адаптаций:
- Используя эту банку, единственный доступный часовой пояс - UTC. Так
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
Выполните и прокомментируйте файлы, которые вы не хотите включать в банку. В этом примере я держу только 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
файл).
При этом полученная банка будет содержать только зоны Южной Америки и UTC. Если часовой пояс по умолчанию JVM не является одним из южноамериканских, DateTimeZone.getDefault()
вернет UTC.
Если вы хотите еще больше уменьшить файлы зон, вы можете редактировать их вручную. Но вы должны быть осторожны, чтобы не удалить важные данные из часовых поясов, которые вы хотите сохранить. Вот учебник о формате tz-файлов IANA.
Просто имейте в виду, что удаление данных о часовых поясах я бы не рекомендовал. Все исторические данные важны, и (почти) всегда есть какой-то часовой пояс, действующий за кулисами. Вам нужно будет выполнить множество тестов, чтобы убедиться, что это не повлияет на какой-либо аспект вашего приложения (некоторые ошибки, связанные с датами, особенно связанные с часовыми поясами, могут быть сложными и сложными для отладки). Удачи!