ch
Feedback
Ra'Reilly - Заметки про Android и не только

Ra'Reilly - Заметки про Android и не только

前往频道在 Telegram

Каждую неделю (нет) тут появляются заметки. Пока я не сдуюсь. В основном про Андроид, но иногда и про тулинг залетает. Автор: @osipxd

显示更多
俄罗斯844 407未指定类别
262
订阅者
无数据24 小时
无数据7 天
无数据30 天
帖子存档
А вы знали, что в IDEA (ну и в Android Studio) можно поменять иконку проекта? Я не знал, а это возможно. Надо всего лишь... Н
А вы знали, что в 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. #ci

Docker-образа для сборки Android-приложений это какой-то ужас. Так я начал этот пост в прошлый понедельник, а потом пошёл за
Docker-образа для сборки Android-приложений это какой-то ужас. Так я начал этот пост в прошлый понедельник, а потом пошёл за примерами "ужаса" и... застрял на неделю потому что: - Во-первых, всё уже гораздо лучше чем было 3 года назад, когда я последний раз искал подходящий docker-образ - Во-вторых, мои представления о "хорошем образе" немного устарели и образа могут быть ещё лучше 👇

Оказалось, что фича с адаптивными emoji, которые я исопльзовал в предыдущем посте, поддерживается не во всех клиентах. Я конечно завёл баги (macOS, Web K, Web Z), но хочется понять сколько людей затронула проблема (статистики по клиентам у меня нет).
Anonymous voting

За последние две недели вышло много крупных обновлений — 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