Вообще, большинство разрабов просто ленивы, и поэтому приложения сейчас занимают какое-то ненормальное количество места. Я постоянно стараюсь с этим бороться, но и тут не без проблем.
В первую очередь, гугл говорит, что для оптимизации требуется добавить:
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"))
Действительно, эти три строки сжимают размеры в 5-10 раз, попутно ускоряя приложение. Горе-разрабы уже тут делают пук-среньк, так как не у всех это активировано - люди просто не смогли прочитать довольно популярную статью с официального сайта разработчиков.
Далее предлагается вычищать лишние языки:
resourceConfigurations.addAll(listOf("en", "ru"))Библиотеки автоматически добавляют переводы каких-то редких кусков приложения на 87 языков. В теории вещь полезная, но на практике их никто никогда не увидит или вовсе введёт в диссонанс - вырезаем.
После этого, вероятно, захочется указать, какие языки присутствуют в приложении. Гугл предлагает создать эти данные автоматически:
androidResources.generateLocaleConfig = true
unqualifiedResLocale=en
Но эта фича сломана при вырезании лишних языков! Поэтому указываем всё вручную:
<?xml version="1.0" encoding="utf-8"?>
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
<locale android:name="en-US"/>
<locale android:name="ru"/>
</locale-config>
android:localeConfig="@xml/locales_config"
С этого момента предложения гугла закончились. Но внезапно оказывается, что
isShrinkResources не работает - в .apk всё ещё лежат картинки и строки, которые не должны были появиться. Приходится копать дальше и узнавать, что для нормальной очистки нужно в res/raw создать keep.xml с таким содержанием:<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:shrinkMode="strict"/>
После этого неиспользованные ресурсы, наконец-то, начнут удаляться. Но вот только об этой фиче никто не знает, поэтому приложение может начать вылетать, так как не все разработчики пометили через
tools:keep ресурсы, к которым они обращаются через рефлексию. В моём случае это одна библиотека, два строковых ресурса - написал разрабам, сказали что починят.Короче, существование
tools:shrinkMode="strict" обнаружил только вчера. В моём приложении уже несколько релизов лежали дебажные ресурсы, которые никак не использовались. Об shrinkMode действительно никто не знает, даже те, кому стоило бы - создателям библиотек и больших приложений.Например, в банковских приложениях я заметил дублирование картинок по 5 раз. Дело в том, что до поддержки векторных картинок (до времён пятого андроида) приходилось создавать множество растровых картинок для разных экранов. Но блин, эти приложения уже давно не поддерживают ничего ниже 7-ого андроида, то есть там тонны говн, которые не использует система! И это всё можно вырезать, но гугл никак не сообщает о такой возможности. Да и в общем-то разработчики могли вручную вырезать, но им лень.
Наверное, сейчас вам кажется, что так много места занимают исключительно ненужные картинки. Но, естественно, это не так - в основном всё же проблема в разрабах, которые не парятся по качеству. Большинство проблем из-за тяжёлых внешних библиотек, которые при переписывании на стандартные для платформы ЯП позволили бы сократить некоторые специфичные супераппы (те же банки) в 2-4 раза. Естественно, такие зависимости нужно по максимуму избегать, но в корпорате это не всегда возможно.
Например раньше, до тряски по импортозамещению, приложения использовали системные карты (от гугла), которые не занимают места. Сейчас все боятся использовать забугорное при наличии нашенских аналогов - гугл карты подменяются картами 2гис и яндексом, пакет приложения мгновенно увеличивается минимум на 25 МБ. Такова цена, заплатите вы :).
В общем, вот такие вот будни разработчика, который сам потихоньку улучшает качество проектов, но вокруг себя такого же поведения не замечает. Хотя о проблеме говорят многие.