Розыгрыш билета на Подлодку
Мы с командой в очередной раз подготовили для вас новый сезон Podlodka Android Crew, который стартует уже 15 сентября.
В этот раз будем говорить про архитектуру, которая выходит за рамки экранов и навигации.
В программе:
🟢 Бинарная совместимость. Абакар Магомедов расскажет всё про бинарную совместимость: что это такое и как её соблюдать при разработке собственной библиотеки.
🟢 Интервью с мобильным архитектором. Вместе с Эдуардом Некрутовым узнаем, чем занимается архитектор мобильных приложений. Разберём реальные кейсы, типичные задачи и главные вызовы этой роли.
🟢 Архитектура Ktor для Android-разработчика. Разработчик библиотеки Ktor Осип Фаткуллин расскажет, как устроена библиотека под капотом, и покажет, как проектировать расширения для неё.
🟢 Что лежит под капотом удобного SDK? Игорь Рыбаков рассмотрит лучшие практики проектирования SDK для Android-приложений.
Это, разумеется, не все сессии, другие тоже определённо заслуживают вашего внимания!
🫴 Итак, давайте разыграем проходку. Для участия в розыгрыше нужно оставить комментарий под этим постом и написать про самую интересную архитектурную задачу в вашей практике. Итоги розыгрыша подведём ровно через неделю, удачи!
А те, кто не хочет участовать в розыгрыше, ловите промокод на скидку для покупки билета на сайте:android_crew_14_8RuHEz
Мы с командой в очередной раз подготовили для вас новый сезон Podlodka Android Crew, который стартует уже 15 сентября.
В этот раз будем говорить про архитектуру, которая выходит за рамки экранов и навигации.
В программе:
Это, разумеется, не все сессии, другие тоже определённо заслуживают вашего внимания!
А те, кто не хочет участовать в розыгрыше, ловите промокод на скидку для покупки билета на сайте:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥3🥱3❤1
Мой архитектурный факап
Пока вы делитесь историями о самых интересных задачах, расскажу про ошибку проектирования, которая нам дорого обошлась.
Адаптируя Decompose в одно из наших приложений, мне пришла в голову гениальная идея: раз Decompose позволяет разом менять весь стек экранов, то почему бы не сделать навигацию по стейту из бизнес-логики?
Я слушал условно глобальный стейт и полностью заменял стек экранов. Поначалу это выглядело даже красиво, до появления в приложении диплинков...
В чём проблема? Если мы сразу обработаем диплинк и перейдём на нужный экран, то он тут же перетрётся изменением глобального стейта после загрузки данных.
Я не стал ничего менять и просто откладывал обработку диплинков до полной загрузки данных. Выглядело это уже не лучшим образом, а с ростом количества разных диплинков всё превратилось в полный хаос. Когда я передал проект другому разработчику, каждое новое изменение в этом коде ломало предыдущую функциональность, и поддерживать его стало невозможно.
Поэтому мы отрефакторили навигацию, отказались от подхода с навигацией по стейту, и жить стало гораздо проще.
А о каких решениях в архитектуре пожалели вы?
#Navigation #Decompose
Пока вы делитесь историями о самых интересных задачах, расскажу про ошибку проектирования, которая нам дорого обошлась.
Адаптируя Decompose в одно из наших приложений, мне пришла в голову гениальная идея: раз Decompose позволяет разом менять весь стек экранов, то почему бы не сделать навигацию по стейту из бизнес-логики?
Я слушал условно глобальный стейт и полностью заменял стек экранов. Поначалу это выглядело даже красиво, до появления в приложении диплинков...
В чём проблема? Если мы сразу обработаем диплинк и перейдём на нужный экран, то он тут же перетрётся изменением глобального стейта после загрузки данных.
Я не стал ничего менять и просто откладывал обработку диплинков до полной загрузки данных. Выглядело это уже не лучшим образом, а с ростом количества разных диплинков всё превратилось в полный хаос. Когда я передал проект другому разработчику, каждое новое изменение в этом коде ломало предыдущую функциональность, и поддерживать его стало невозможно.
Поэтому мы отрефакторили навигацию, отказались от подхода с навигацией по стейту, и жить стало гораздо проще.
А о каких решениях в архитектуре пожалели вы?
#Navigation #Decompose
👍24❤1
Как поменять ключ подписи приложения
Я удивился, что мало кто знает, и некоторые даже не верят, что возможно поменять сертификат для ключа подписи вашего приложения.
⚠️ Работает это только для App Bundle, и в случае Google Play придётся использовать Google Play App Signing.
При этом не стоит путать ключ загрузки и ключ подписи: иногда это один и тот же ключ, но по умолчанию Google предлагает сгенерировать свой ключ подписи, а ключ загрузки нужен, чтобы идентифицировать, что сборка подписана вами. Отсюда следует, что поменять ключ загрузки вообще не проблема, так как итоговый APK всё равно будет подписан другим ключом.
Но как изменить ключ подписи? Ведь система просто не даст установить приложение с одним package id и разными ключами🤔
На самом деле это возможно, начиная с Android N (API 24). Вы можете сделать это вручную с помощью apksigner, для этого вам потребуется доступ к старому и новому ключам:
Но в случае обновления приложения в Google Play нужно делать это через консоль. Переходим по ссылке и запрашиваем обновление ключа подписи, для этого придётся загрузить приватную часть сертификата в консоль. Сделать это можно только раз в год.
Как это работает?
Все существующие пользователи продолжат получать обновления со старым ключом, а для новых пользователей, у которых версия Android 13 и выше, подпись уже будет другая. Подробнее здесь.
Когда может понадобиться?
🔘 Если предыдущий ключ был скомпрометирован.
🔘 Вы выбрали автоматическое подписание в Google Play, а теперь хотите сделать одну подпись приложения для всех сторов.
🔘 Вы подписывали приложения разными ключами, но теперь хотите использовать один ключ для безопасного обмена данными между приложениями.
#GooglePlay #AppSigning
Я удивился, что мало кто знает, и некоторые даже не верят, что возможно поменять сертификат для ключа подписи вашего приложения.
При этом не стоит путать ключ загрузки и ключ подписи: иногда это один и тот же ключ, но по умолчанию Google предлагает сгенерировать свой ключ подписи, а ключ загрузки нужен, чтобы идентифицировать, что сборка подписана вами. Отсюда следует, что поменять ключ загрузки вообще не проблема, так как итоговый APK всё равно будет подписан другим ключом.
Но как изменить ключ подписи? Ведь система просто не даст установить приложение с одним package id и разными ключами
На самом деле это возможно, начиная с Android N (API 24). Вы можете сделать это вручную с помощью apksigner, для этого вам потребуется доступ к старому и новому ключам:
apksigner sign --in ${INPUT_APK} \
--out ${OUTPUT_APK} \
--ks ${ORIGINAL_KEYSTORE} \
--ks-key-alias ${ORIGINAL_KEY_ALIAS} \
--next-signer --ks ${UPGRADED_KEYSTORE} \
--ks-key-alias ${UPGRADED_KEY_ALIAS} \
--lineage ${LINEAGE}
Но в случае обновления приложения в Google Play нужно делать это через консоль. Переходим по ссылке и запрашиваем обновление ключа подписи, для этого придётся загрузить приватную часть сертификата в консоль. Сделать это можно только раз в год.
Как это работает?
Все существующие пользователи продолжат получать обновления со старым ключом, а для новых пользователей, у которых версия Android 13 и выше, подпись уже будет другая. Подробнее здесь.
Когда может понадобиться?
#GooglePlay #AppSigning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥7❤1
Как с пользой провести День программиста?
Конечно, посмотреть доклад моего коллеги Евгения Мельцайкина о том, как мы делали медиаленту, решали проблемы синхронизации контента и как нам во всём этом помог Decompose🌳
Женя выступает на IT-фестивале KODE WAVES, доклад начнётся уже совсем скоро, в 11:30 МСК.
🔴 Ссылка на прямую трансляцию
Конечно, посмотреть доклад моего коллеги Евгения Мельцайкина о том, как мы делали медиаленту, решали проблемы синхронизации контента и как нам во всём этом помог Decompose
Женя выступает на IT-фестивале KODE WAVES, доклад начнётся уже совсем скоро, в 11:30 МСК.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14
Manual DI
DI-фреймворки продолжают появляться как грибы после дождя. Теперь рекомендуют использовать Metro, но всё чаще можно услышать, что люди принципиально отказываются от каких-либо библиотек для реализации DI. Так как в моей команде мы в основном делаем переиспользуемые общие модули, мы тоже давно отказались от DI-фреймворков. И знаете что? Мы вообще не испытываем из-за этого каких-либо проблем.
Тут я вспомнил про свой KMP-сэмпл и решил, что будет круто показать всё это на примере и заменить Koin в проекте. Но хорошо, что я не начал делать это раньше времени: буквально на докладе про сравнение DI-фреймворков с Podlodka Android Crew я узнал, что Александр Власюк уже всё сделал раньше и даже заслал pull request🌐
Примечательно, что Manual DI не только даёт compile-time safety по сравнению с Koin (без всяких плагинов), но даже количество строк кода в проекте сократилось😲
Понятно, что это всего лишь пример. Если использовать Koin глобально, то кода с Manual DI придётся писать больше. Однако я придерживаюсь подхода, при котором DI должен быть изолирован внутри модуля, а зависимости должны быть объявлены явно, чтобы можно было легко переиспользовать этот модуль где угодно.
А вы что думаете, стоят ли DI-фреймворки, чтобы их изучать и постоянно мигрировать проект на все более новые решения❓
#DI #Kotlin #KMP
DI-фреймворки продолжают появляться как грибы после дождя. Теперь рекомендуют использовать Metro, но всё чаще можно услышать, что люди принципиально отказываются от каких-либо библиотек для реализации DI. Так как в моей команде мы в основном делаем переиспользуемые общие модули, мы тоже давно отказались от DI-фреймворков. И знаете что? Мы вообще не испытываем из-за этого каких-либо проблем.
Тут я вспомнил про свой KMP-сэмпл и решил, что будет круто показать всё это на примере и заменить Koin в проекте. Но хорошо, что я не начал делать это раньше времени: буквально на докладе про сравнение DI-фреймворков с Podlodka Android Crew я узнал, что Александр Власюк уже всё сделал раньше и даже заслал pull request
Примечательно, что Manual DI не только даёт compile-time safety по сравнению с Koin (без всяких плагинов), но даже количество строк кода в проекте сократилось
Понятно, что это всего лишь пример. Если использовать Koin глобально, то кода с Manual DI придётся писать больше. Однако я придерживаюсь подхода, при котором DI должен быть изолирован внутри модуля, а зависимости должны быть объявлены явно, чтобы можно было легко переиспользовать этот модуль где угодно.
А вы что думаете, стоят ли DI-фреймворки, чтобы их изучать и постоянно мигрировать проект на все более новые решения
#DI #Kotlin #KMP
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍20🔥6🗿3
Как выстроить актуальную IT-инфраструктуру проекта в 2026?
Мнение экспертов и реальные кейсы на Selectel Tech Day
8 октября в Москве пройдет Selectel Tech Day — флагманская конференция одного из ведущих облачных провайдеров. В программе: доклады об актуальных технологиях, реальный опыт построения гибкой и устойчивой IT-инфраструктуры и нетворкинг.
Присоединяйтесь, чтобы узнать о главных технологических трендах и обменяться опытом с экспертами из крупных IT-компаний.
Место встречи — Москва, Цифровое деловое пространство. Участие в конференции бесплатное, нужно зарегистрироваться →
Реклама. АО "Селектел". erid:2W5zFJaTqC4
Мнение экспертов и реальные кейсы на Selectel Tech Day
8 октября в Москве пройдет Selectel Tech Day — флагманская конференция одного из ведущих облачных провайдеров. В программе: доклады об актуальных технологиях, реальный опыт построения гибкой и устойчивой IT-инфраструктуры и нетворкинг.
Присоединяйтесь, чтобы узнать о главных технологических трендах и обменяться опытом с экспертами из крупных IT-компаний.
Место встречи — Москва, Цифровое деловое пространство. Участие в конференции бесплатное, нужно зарегистрироваться →
Реклама. АО "Селектел". erid:2W5zFJaTqC4
👍2
Изменение конфигурации в прошлом
Еще пару лет назад я заметил, что если в AndroidManifest явно прописать все варианты изменения конфигурации в configChanges, то Compose сможет самостоятельно подхватить подавляющее большинство изменений без какого-либо дополнительного кода. Но тогда я был непонят сообществом, и никто это всерьез не воспринял😨
Теперь же об этом заговорили инженеры из Google, рекомендую посмотреть доклад с Droidcon🟥 . Начиная с compileSdk 36, можно одной строчкой игнорировать все текущие и будущие причины пересоздания Activity из-за изменения конфигурации.
Это позволит нам полностью избавиться от андроидовской ViewModel и инкапсулировать нашу логику в обычных классах. При этом это не значит, что Activity никогда не будет пересоздаваться, изменение конфигурации лишь одна из причин. Но в таких случаях состояние можно сохранить только с помощью SavedInstanceState, ViewModel здесь бы не помогла.
А вы что думаете, готовы ли вы забыть об изменении конфигурации в Android и о ViewModel в частности?
#Android #Compose
Еще пару лет назад я заметил, что если в AndroidManifest явно прописать все варианты изменения конфигурации в configChanges, то Compose сможет самостоятельно подхватить подавляющее большинство изменений без какого-либо дополнительного кода. Но тогда я был непонят сообществом, и никто это всерьез не воспринял
Теперь же об этом заговорили инженеры из Google, рекомендую посмотреть доклад с Droidcon
Это позволит нам полностью избавиться от андроидовской ViewModel и инкапсулировать нашу логику в обычных классах. При этом это не значит, что Activity никогда не будет пересоздаваться, изменение конфигурации лишь одна из причин. Но в таких случаях состояние можно сохранить только с помощью SavedInstanceState, ViewModel здесь бы не помогла.
А вы что думаете, готовы ли вы забыть об изменении конфигурации в Android и о ViewModel в частности?
#Android #Compose
Please open Telegram to view this post
VIEW IN TELEGRAM
👍28👎6✍4🔥4😎3😁1
Как часто вы видели качественные толстовки для айтишников, да еще и с тематикой Kotlin? Бренд Rybe делает по-настоящему классные худи, которые не стыдно носить 🤩
🔘 Плотный 100% хлопок — мягкий, тёплый, но без перегрева.
🔘 Люверсы для пропуска.
🔘 Карман на металлических кнопках.
🔘 Салфетка для очков или экрана в кармане.
🔘 Карман внутри для наушников, чтобы они не болтались и не терялись.
В общем, если искали реально удобную толстовку без кривых швов и дурацких надписей, вот она 👈
В общем, если искали реально удобную толстовку без кривых швов и дурацких надписей, вот она 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16🤡15😢8👍3🥴3😁2👎1🗿1😎1
Проблема KSP
Kotlin Symbol Processing — современная технология для генерации кода, но насколько безопасно использовать библиотеки с KSP в проекте?
При обновлении зависимостей мы попали в следующую ловушку: не все библиотеки, которые мы используем, поддержали KSP2, и при этом новая версия Room крашится, если явно отключить поддержку KSP2 в gradle.properties. Сейчас ещё можно обойти проблему, понизив версии, но начиная с AGP 9 и Kotlin 2.3.0 KSP1 перестанет работать.
Что с этим делать?
🔘 Можно включить режим ждуна и мониторить, когда авторы сторонних библиотек добавят поддержку, но не факт, что это произойдёт.
🔘 Форкнуть библиотеку и реализовать поддержку самостоятельно, что может оказаться нетривиальной задачей, если раньше с KSP вы не работали.
🔘 Избавиться от зависимости на такую библиотеку. Если она не глубоко интегрирована в проект, то проще выбрать этот путь, тогда при очередном обновлении зависимостей проблем не возникнет.
А используете ли вы в своих проектах библиотеки с KSP, кроме Room и Dagger?
#KSP #Android
Kotlin Symbol Processing — современная технология для генерации кода, но насколько безопасно использовать библиотеки с KSP в проекте?
При обновлении зависимостей мы попали в следующую ловушку: не все библиотеки, которые мы используем, поддержали KSP2, и при этом новая версия Room крашится, если явно отключить поддержку KSP2 в gradle.properties. Сейчас ещё можно обойти проблему, понизив версии, но начиная с AGP 9 и Kotlin 2.3.0 KSP1 перестанет работать.
Что с этим делать?
А используете ли вы в своих проектах библиотеки с KSP, кроме Room и Dagger?
#KSP #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🤔1
Советы по работе с AI-агентами для начинающих
На днях посмотрел отличный доклад от Евгения Сатурова на Podlodka AI Crew о страхах разработчиков и типичных ошибках при работе с AI-агентами.
Я делал точно такие же ошибки, поэтому поделюсь советами с вами:
🔘 Выбирайте лучшую доступную модель на сегодня, не используйте auto-режим в Cursor и подобных инструментах.
🔘 Не пишите задачи напрямую. Формулируйте мета-промпт с описанием задачи для модели, чтобы она составила вам подробный таск-промпт.
🔘 В мета-промпте пишите, что вы хотите сделать, а не как, избегайте чрезмерной специфики.
🔘 Прикладывайте весь необходимый контекст. Плохо, когда модель начинает делать семантический поиск по проекту.
🔘 Не дробите задачу слишком сильно — это неэффективно. Современные модели могут достаточно долго работать автономно, главное не вылезти за контекст. По возможности используйте сабагентов.
🔘 Не вступайте в споры с моделью и не правьте код руками. Просто откажитесь от сгенерированного кода, обновите таск-промпт, правила проекта и попробуйте снова.
💬 Делитесь в комментариях своими лучшими практиками по работе с AI-агентами.
#AI
На днях посмотрел отличный доклад от Евгения Сатурова на Podlodka AI Crew о страхах разработчиков и типичных ошибках при работе с AI-агентами.
Я делал точно такие же ошибки, поэтому поделюсь советами с вами:
#AI
Please open Telegram to view this post
VIEW IN TELEGRAM
1🤡16👍15😡2🥴1