"minifyEnabled" против "shrinkResources" - какая разница? и как получить сохраненное пространство?
Фон
Согласно веб-странице "Ресурс сокращения" в документах Andriod (здесь), вы можете минимизировать размер приложения через файл build.gradle, используя следующие строки:
android {
...
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
И они говорят, что при его использовании он также расскажет вам, сколько было сохранено в процессе:
При включении shrinkResources создание вашего приложения должно отображаться как во время сборки:
... Удалены неиспользуемые ресурсы: данные двоичных ресурсов сокращены с 2570 КБ до 1711KB: Удалено 33%
Вопросы
Я не могу найти ответы на эти вопросы:
- При использовании Android-Studio для создания подписанного приложения, где я могу найти информацию о том, сколько было сохранено и какие файлы были удалены/изменены?
- Что именно "shrinkResources" делает, что "minifyEnabled" нет? И почему "shrinkResources" зависит от "minifyEnabled"?
- Может ли какой-либо из этих параметров влиять на размер и/или качество файлов изображений?
- Не является ли Proguard ответственным за сокращение исходного кода? Я спрашиваю об этом, потому что он говорит: "Вы должны включить minifyEnabled, чтобы включить сокращение кода",
Ответы
Ответ 1
Посмотрим
При использовании Android-Studio для создания подписанного приложения, где я могу найти информацию о том, сколько было сохранено и какие файлы были удалены/изменены?
Они войдут в журнал gradle. Внутри студии Android я считаю, что они отображаются в окне Messages
(рядом с окнами Android, Run, TODO).
Что именно означает "shrinkResources", что "minifyEnabled" нет? И почему "shrinkResources" зависит от "minifyEnabled"?
minify
запускается ProGuard. shrink
удалить ресурсы, которые ProGuard отмечены как неиспользуемые.
Может ли какой-либо из этих параметров влиять на размер и/или качество файлов изображений?
Нет!
Не является ли Proguard ответственным за сокращение исходного кода? Я спрашиваю об этом, потому что он говорит: "вы должны включить minifyEnabled, чтобы включить сокращение кода",
ProGuard сжимается ТОЛЬКО КОДА; shrinkResources
это просто материал из папки /res/
. shrinkResources
зависит от выхода журнала из ProGuard для запуска. ProGuard - это тот, кто фактически анализирует код, чтобы знать, что не используется.
изменить
Я только что нашел очень хорошее сообщение в блоге. CommonsWare отправил его на другой вопрос stackOverlow: http://cyrilmottier.com/2014/08/26/putting-your-apks-on-diet/
это прекрасно объясняет ваш следующий вопрос:
почему одно зависит от другого?
из сообщения:
Proguard работает на стороне Java. К сожалению, он не работает на стороне ресурсов. Как следствие, если изображение my_image в res/drawable не используется, Proguard только разделяет его ссылку в классе R, но сохраняет связанное изображение на месте.
это означает, что shrinkResources
сравнивается только в том случае, если drawable находится в папке, но не в классе R
.
Ответ 2
Ответы на вопросы 2 и 4 можно найти в этом видео с Android Dev Summit 2015 вместе с другой полезной информацией по этой теме.
Обзор рассмотренных вопросов:
-
shrinkResources
учитывается, только если minifyEnabled
истинно
-
minifyEnabled
сокращает код, а shrinkResources
сокращает ресурсы, на которые не ссылаются код
-
По умолчанию shrinkResources
работает в режиме safe
. Если вы переключите его на strict
, вы можете предоставить флаги tools:keep
и tools:discard
вручную, чтобы повлиять на сокращение ресурса.
Ответ 3
- shrinkResources полезно уменьшить размер вашего сгенерированного APK, удалив неиспользуемый ресурс.
- minifiedEnabled просто запускает Proguard, который помогает плагину android для упаковки APK без неиспользуемого кода, чтобы сжать его.