Подтвердить что ты не робот

"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, чтобы включить сокращение кода",
4b9b3361

Ответ 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 без неиспользуемого кода, чтобы сжать его.