Почему выпуск .apk меньше th отладочного .apk - PullRequest
0 голосов
/ 04 марта 2020

В примере моего приложения apk отладки составляет 20 Мб (из 13 Мб после обновления версии Gradle и версии плагина Gradle), а apk выпуска - всего 5 Мб. Почему это так?

В файле build.gradle часть buildTypes осталась неизменной, поэтому не было никаких оптимизаций или сжатия ни компилятором R8, ни ProGuard.

android {
    ...
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

РЕЛИЗ: image 2.6Mb lib ---> 1.7Mb">

ОТЛАДКА: image 3.4Mb lib ---> 32.2Mb">

Вы можете увидеть большую разницу в размерах в lib папка, среди прочих.

1 Ответ

1 голос
/ 04 марта 2020

Во время релизных сборок происходит больше оптимизаций, кроме ProGuard и R8. Согласно документации https://developer.android.com/studio/build/shrink-code.html

При сборке проекта с использованием Android Gradle plugin 3.4.0 или выше , плагин больше не использует ProGuard для оптимизации кода во время компиляции. Вместо этого плагин работает с компилятором R8 для обработки следующих задач во время компиляции:

Сокращение кода (или расшатывание дерева): обнаруживает и безопасно удаляет неиспользуемые классы, поля , методы и атрибуты из вашего приложения и его библиотечных зависимостей (что делает его ценным инструментом для обхода ограничения в 64 КБ). Например, если вы используете только несколько API-интерфейсов библиотечной зависимости, сжатие может идентифицировать библиотечный код, который не используется вашим приложением, и удалить только этот код из вашего приложения. Чтобы узнать больше, go к разделу о том, как уменьшить ваш код.

Сокращение ресурсов: удаляет неиспользуемые ресурсы из вашего упакованного приложения, включая неиспользуемые ресурсы в зависимостях библиотеки вашего приложения. Он работает в сочетании с сокращением кода таким образом, что после удаления неиспользуемого кода любые ресурсы, на которые больше нет ссылок, также можно безопасно удалить. Чтобы узнать больше, go к разделу о том, как уменьшить ваши ресурсы.

Запутывание: сокращает имена классов и членов, что приводит к уменьшению размеров файлов DEX. Чтобы узнать больше, go к разделу о том, как запутать ваш код.

Оптимизация: проверяет и переписывает ваш код, чтобы еще больше уменьшить размер DEX-файлов вашего приложения. Например, если R8 обнаруживает, что ветвь else {} для данного оператора if / else никогда не берется, R8 удаляет код для ветки else {}. Чтобы узнать больше, go к разделу об оптимизации кода.

...