Ra'Reilly - Заметки про Android и не только
前往频道在 Telegram
Каждую неделю (нет) тут появляются заметки. Пока я не сдуюсь. В основном про Андроид, но иногда и про тулинг залетает. Автор: @osipxd
显示更多俄罗斯844 407未指定类别
262
订阅者
无数据24 小时
无数据7 天
无数据30 天
帖子存档
А вы знали, что в IDEA (ну и в Android Studio) можно поменять иконку проекта?
Я не знал, а это возможно. Надо всего лишь... Нет, сода ни при чём. Надо на welcome-скрине нажать "Change Project Icon..." и выбрать иконку. Другой вариант — положить файл с названием
icon.svg или icon.png в папку .idea и ваш проект будет отличаться в списке проектов от всех остальных.
Интересно, что возможность такая есть уже давно. Я пытался найти когда она появилась, но нашёл только косвенные признаки, что в IDEA 2021 она уже была.
Всё, мне некогда, я пошёл ставить иконки всем проектам.
#idea🤨 Какие проблемы есть у Docker-образов с Android SDK?
Они тяжёлые.
Чаще всего публичные образа собираются по принципу "это тоже может понадобиться, и вот это надо добавить". Даже "минимальный образ" обычно содержит около 5 версий Android, ещё пяток версий build-tools, NDK, cmake, эмулятор и вот уже как минимум 5 гигов занято. А чтобы образ подошёл всем, можно докинуть ещё Node.js, Flutter SDK и Ruby с Fastlane 👍
Вес образов не проблема до тех пор пока ты их просто используешь as-is. Но в один прекрасный момент появляется потребность что-то добавить в образ, чтобы не ставить это "что-то" перед каждой сборкой и сэкономить на этом время.
Думаешь "возьму текущий образ как базовый и на его основе наклепаю свой", пишешь Dockerfile, пробуешь собрать локально и... Бац! Место кончилось — ну ничего, почистим диск. Бац! На M1 образ не собирается. И вот ты уже читаешь как собрать образ под определённую платформу и всё глубже погружаешься в недра докера.
Позже хочется ещё что-то поменять и становится понятно, что если хочешь образ в котором будет только то, что тебе нужно, собери его сам. Этот путь не легче и не в последнюю очередь потому что не понятно что нужно, а что нет, это следующая проблема.
Google не помогает.
Я не про поисковик, а про команду Android.
Эталонный официальный пример Docker-образа закрыл бы многие вопросы. Но такого образа нет и чем глубже ты погружаешься в тему создания своего образа, тем больше странностей и вопросов встречаешь:
👉 Зачем нужен каждый пакет в sdkmanager? Где взять их описание?
👉 Кто-нибудь знает для чего в Docker-образа ставят пакеты
extra;m2repository? Для чего скачивать локальный maven репозиторий, если мы его никак не подключаем в Gradle? Может AGP его подключает? Я тоже так подумал, но не нашёл этому никаких подтверждений. Убрал установку этих пакетов — ничего не сломалось 🤷
👉 Почему build-tools тянет за собой emulator? А, по ошибке видимо. Начиная с 31.0.0 уже не тянет.
👉 Блин. Сборка падает потому что llvm-rs-cc не может найти libncurses5. А, эту проблему тоже поправили начиная с build-tools 31.0.0
👉 Надо ли ставить несколько версий build-tools или можно поставить только самую новую? Есть ответ на SO, что версии обратно совместимы, но не звучит как авторитетный источник, да? Changelog крайне скупой, а реально полезную информацию можно найти разве что в исходниках. Для себя решил, что лучше использовать последнюю версию по причине из прошлых пунктов.
👉 Надо ли ставить platform-tools? Кажется что для сборки они не нужны, но AGP использует adb для всякого, так что подразумевает, что platform-tools установлены.
👉 Какие переменные окружения надо выставлять? Так... Надо выставить ANDROID_HOME... а погодите, она deprecated. Вместо неё надо выставлять ANDROID_SDK_ROOT. Стоп, она deprecated, и вместо неё надо выставлять... ANDROID_HOME. Ок.
👉 Надо ли устанавливать 32-битные версии библиотек? Хм.. Ничего не написано про то зачем они нужны, но кажется они нужны только для Android Studio. Убрал — ничего не сломалось.
Не всегда есть достаточное количество времени чтобы с этим всем разбираться, тем более если поддержка Dockerfile это не твоя прямая обязанность.
К сожалению, я не нашёл какого-то минимального образа, на базе которого можно было бы сделать свой образ не углубляясь во все эти дебри, поэтому — android-sdk:base в RedMadRobot/android-docker-images это как раз такой образ.
Стараюсь пояснять все неочевидные моменты комментами и в целом сохранять Dockerfile читаемым. Если вдруг что-то там не понятно — оставляйте комментарии к коммитам или открывайте issue.
Если всё-таки нужен образ, который может пережевать всё, рекомендую посмотреть на mingchen/docker-android-build-box.
#ciDocker-образа для сборки Android-приложений это какой-то ужас. Так я начал этот пост в прошлый понедельник, а потом пошёл за примерами "ужаса" и... застрял на неделю потому что:
- Во-первых, всё уже гораздо лучше чем было 3 года назад, когда я последний раз искал подходящий docker-образ
- Во-вторых, мои представления о "хорошем образе" немного устарели и образа могут быть ещё лучше 👇
Оказалось, что фича с адаптивными emoji, которые я исопльзовал в предыдущем посте, поддерживается не во всех клиентах. Я конечно завёл баги (macOS, Web K, Web Z), но хочется понять сколько людей затронула проблема (статистики по клиентам у меня нет).
За последние две недели вышло много крупных обновлений — Kotlin 1.8.20, AGP 8.0.0, Gradle 8.1 и новая Android Studio. Я пообещал себе не превращать канал в поток сообщений об обновлениях, но иногда изменения цепляют сердечко и я не могу устоять перед соблазном написать про них.
В этот раз порадовал Gradle.
👉 Во-первых, поддержку version catalogs в блоке
plugins {}, про которую я недавно писал, всё-таки включили в релиз 🎉
👉 Во-вторых, в Kotlin DSL завезли поддержку оператора = для lazy properties. То есть теперь можно писать так:
redmadrobot {
android {
// Вместо такого
minSdk.set(28)
// Вот так
minSdk = 28
}
}
Чтобы это всё заработало понадобится:
• Kotlin 1.8.20 (на самом деле достаточно 1.8.0, но в последней версии пофиксили важные баги)
• IntelliJ IDEA 2022.3+ (или Android Studio Giraffe)
• добавить в gradle.properties строчку systemProp.org.gradle.unsafe.kotlin.assignment=true
🪄 Как это работает в Kotlin?
В Groovy DSL, к слову, так можно было делать всегда. Но на то он и Groovy, чтобы делать всякую магию, нам же интересно как это работает в Kotlin.
После компиляции строка minSdk = 28 превращается в minSdk.assign(28), а реализация assign выглядит так:
fun <T> Property<T>.assign(value: T?) {
emitIncubatingLogMessage()
this.set(value)
}
За это превращение отвечает плагин компилятора assignment-plugin. Он позволяет пометить класс специальной аннотацией и у такого класса можно будет "переопределить" оператор присваивания.
Официальной документации на плагин нет, но если захотите применить у себя в проекте, я написал небольшую доку с примером применения, требованиями и ограничениями, которые удалось собрать из исходников. Например, для меня стало сюрпризом, что переопределённый оператор присваивания нельзя использовать с локальными переменными или параметрами функции. Из-за этого ограничения долго не мог понять почему плагин у меня не работает.
Возможно это не так, но есть ощущение, что плагин написан специально для Gradle. К тому же, Kotlin Gradle Plugin недавно переехал на lazy properties и такая фича будет как нельзя кстати, чтобы упростить миграцию для пользователей.
❓Использовать или нет?
Да. Может пугать то, что фича в экспериментальном статусе, но если вы используете свежий Gradle, Kotlin и IDE, не вижу причин не использовать.
Сам Gradle уже применяет assignment operator в своём проекте.
А если вы автор плагинов, у вас не осталось причин не использовать lazy properties, тем более что теперь пользователи даже не заметят этого и не увеличится разница между Kotlin и Groovy DSL.
Вообще, рекомендую прочитать список изменений Gradle 8.1, там ещё configuration cache стабилизировали, сделали более полезными сообщения об ошибках компиляции Kotlin DSL и т.д.
#gradle #kotlinСерёжа Чумиков сделал классный доклад про оптимизацию количества рекомпозиций в Compose. Если формат видео вам заходит больше чем статьи — вот оно!
По секрету скажу, что есть ещё одна запись доклада — про оптимизации анимаций. Надеюсь её тоже выложат.
#compose
