Navigation в Jetpack Compose
#compose
Использование правильно настроенной навигации в приложении — очень важная вещь, которая в будущем, при росте проекта, спасает от многих проблем.
И если в привычной Android-разработке уже существует несколько различных подходов, то с появлением Jetpack Compose приходится искать другие варианты.
Тут автор очень круто сравнивает текущие подходы к навигации и пытается подобрать идеальный вариант. В сравнение попали следующие библиотеки:
👉 Navigation-compose;
👉 Compose-navigation-reimagined;
👉 Voyager;
👉 Navigator-compose;
👉 Simple-stack-compose-integration;
У каждой из них он рассмотрел плюсы и минусы, в некоторых указал, как эти минусы разрешить.
🏆 В итоге, по мнению автора, победила библиотека Voyager, которая вот-вот выйдет в релизную версию.
#compose
Использование правильно настроенной навигации в приложении — очень важная вещь, которая в будущем, при росте проекта, спасает от многих проблем.
И если в привычной Android-разработке уже существует несколько различных подходов, то с появлением Jetpack Compose приходится искать другие варианты.
Тут автор очень круто сравнивает текущие подходы к навигации и пытается подобрать идеальный вариант. В сравнение попали следующие библиотеки:
👉 Navigation-compose;
👉 Compose-navigation-reimagined;
👉 Voyager;
👉 Navigator-compose;
👉 Simple-stack-compose-integration;
У каждой из них он рассмотрел плюсы и минусы, в некоторых указал, как эти минусы разрешить.
🏆 В итоге, по мнению автора, победила библиотека Voyager, которая вот-вот выйдет в релизную версию.
👍6🔥3👎1
Пара фич Android Studio
#android
Периодически попадаются статьи, которые рассказывают о редких, но довольно полезных фичах Android Studio, которые здорово экономят время. Да, чаще это весьма очевидные советы, но автор этой статьи удивил и порадовал нестандартными решениями.
1️⃣ Прячем ненужные файлы. При использовании библиотек, генерирующих много кода (например, Dagger) можно исключить эти файлы из поиска Android Studio при помощи кастомного Scope.
Для этого переходим:
Можно пойти дальше при помощи
2️⃣ Быстрые прототипы — крутая фича, которая позволяет быстро набросать или проверить какую-то идею прямо в проекте. Для этого можно использовать Scratch files: создать новый можно при помощи Cmd + Shift + N, выбираете нужный тип файла и получаете песочницу прямо внутри текущего проекта. Попробуйте, очень удобно.
3️⃣ Множественный курсор — известная мне ранее фича, которая позволяет редактировать несколько строк проекта одновременно. Очень полезно при рефакторинге, экономит много времени.
При помощи Control + G ставится курсор между одинаковыми частями кода, а при помощи Shift + Option + click поставить курсор вообще в любую область файла.
4️⃣ Расширенный Copy/Paste — крутая штука, которая позволяет видеть историю буфера обмена. Для этого надо использовать сочетание Cmd + Shift + V.
5️⃣ Восстановление из локальной истории — часто приходится восстановить те изменения, которые уже были добавлены в файл, но ещё не залиты в Git. Это можно сделать при помощи
👉 В статье есть ещё больше советов.
#android
Периодически попадаются статьи, которые рассказывают о редких, но довольно полезных фичах Android Studio, которые здорово экономят время. Да, чаще это весьма очевидные советы, но автор этой статьи удивил и порадовал нестандартными решениями.
1️⃣ Прячем ненужные файлы. При использовании библиотек, генерирующих много кода (например, Dagger) можно исключить эти файлы из поиска Android Studio при помощи кастомного Scope.
Для этого переходим:
Preferences -> Appearance & Behaviour -> Scopes -> + -> local и добавляем маску !file:*intermediates*/&&!file:*generated*/&&!file:R.java.Можно пойти дальше при помощи
Preferences -> Editor -> File Types -> Ignored Files and Folders, и скрыть из поиска целые директории, например /build, /generated, что может быть полезно в очень больших проектах.2️⃣ Быстрые прототипы — крутая фича, которая позволяет быстро набросать или проверить какую-то идею прямо в проекте. Для этого можно использовать Scratch files: создать новый можно при помощи Cmd + Shift + N, выбираете нужный тип файла и получаете песочницу прямо внутри текущего проекта. Попробуйте, очень удобно.
3️⃣ Множественный курсор — известная мне ранее фича, которая позволяет редактировать несколько строк проекта одновременно. Очень полезно при рефакторинге, экономит много времени.
При помощи Control + G ставится курсор между одинаковыми частями кода, а при помощи Shift + Option + click поставить курсор вообще в любую область файла.
4️⃣ Расширенный Copy/Paste — крутая штука, которая позволяет видеть историю буфера обмена. Для этого надо использовать сочетание Cmd + Shift + V.
5️⃣ Восстановление из локальной истории — часто приходится восстановить те изменения, которые уже были добавлены в файл, но ещё не залиты в Git. Это можно сделать при помощи
right-click -> Local History -> Show History, где можно восстановить требуемый код.👉 В статье есть ещё больше советов.
👍18🐳11👎1🌚1
Things every Kotlin Developer should know about Coroutines
#kotlin
Попался классный набор статей, где автор делится, фактически, полной информацией о
Получился здоровский аналог документации, который поможет вникнуть в тему, ну или напомнить себе о каких-то вещах, которые забылись.
Статей целых 5️⃣:
Part 1: CoroutineContext
Part 2: CoroutineScope
Part 3: Structured Concurrency
Part 4: Exception Handling
Part 5: Cancellation
#kotlin
Попался классный набор статей, где автор делится, фактически, полной информацией о
Coroutines, правда в структурированной и удобном для чтения виде.Получился здоровский аналог документации, который поможет вникнуть в тему, ну или напомнить себе о каких-то вещах, которые забылись.
Статей целых 5️⃣:
Part 1: CoroutineContext
Part 2: CoroutineScope
Part 3: Structured Concurrency
Part 4: Exception Handling
Part 5: Cancellation
🔥16👍3
Kotlin-Swift interopedia
#kmm
Полезнейшая таблица, которая показывает совместимость между методами в Kotlin и методами в Swift.
Подобная табличка есть также и в доке от Jetbrains, но лучше использовать обе.
Будет супер-полезно, если вы разрабатываете совместное API с iOS разработчиками и договариваетесь об использовании каких-то нужных вам фич.
👨💻 Ну и примеры кода для каждого кейса тоже очень радуют.
#kmm
Полезнейшая таблица, которая показывает совместимость между методами в Kotlin и методами в Swift.
Подобная табличка есть также и в доке от Jetbrains, но лучше использовать обе.
Будет супер-полезно, если вы разрабатываете совместное API с iOS разработчиками и договариваетесь об использовании каких-то нужных вам фич.
👨💻 Ну и примеры кода для каждого кейса тоже очень радуют.
🔥9❤1🤮1💩1
Kotlin Build Reports
#kotlin
Начиная с версии Kotlin 1.7.0 у нас появилась возможность создания отчётов о сборке. Там содержится информация о различных этапах сборки, а также почему невозможно использовать инкрементную компиляцию.
Штука крайне полезная, и её можно использовать, чтобы разобраться, почему сборка занимает так много времени.
👨💻 Пока что фича экспериментальная, но попробовать можно уже сейчас. Для этого надо:
1️⃣ В
2️⃣ На самом деле, этого достаточно, но есть пару опциональных свойств, которые можно добавить для удобства, детальнее лучше посмотреть тут.
#kotlin
Начиная с версии Kotlin 1.7.0 у нас появилась возможность создания отчётов о сборке. Там содержится информация о различных этапах сборки, а также почему невозможно использовать инкрементную компиляцию.
Штука крайне полезная, и её можно использовать, чтобы разобраться, почему сборка занимает так много времени.
👨💻 Пока что фича экспериментальная, но попробовать можно уже сейчас. Для этого надо:
1️⃣ В
gradle.properties добавляем kotlin.build.report.output=file. 2️⃣ На самом деле, этого достаточно, но есть пару опциональных свойств, которые можно добавить для удобства, детальнее лучше посмотреть тут.
👍6🔥4👎1
Spring & Fling анимации в Jetpack compose
#compose
Physics-based анимации — это тип анимаций, которые, по сравнению с обычными анимациями, дают более естественные и плавные эффекты.
В Android существует несколько разных типов подобных анимаций, и Jetpack Compose поддерживает некоторые из них.
Автор статьи рассказывает, как добавить Spring & Fling анимации в проект, сделав анимированной любую из написанных
#compose
Physics-based анимации — это тип анимаций, которые, по сравнению с обычными анимациями, дают более естественные и плавные эффекты.
В Android существует несколько разных типов подобных анимаций, и Jetpack Compose поддерживает некоторые из них.
Автор статьи рассказывает, как добавить Spring & Fling анимации в проект, сделав анимированной любую из написанных
View.❤5👎1
Glance Widget и Work Manager
#android
Совсем недавно Google решил переосмыслить поведение виджетов и у нас появилось новое API для их создания — Glance.
Очень круто, что всё работает в Jetpack Compose стиле, что подразумевает общее API и для виджетов, и для основных элементов экрана.
Вот неплохой пример создания виджета, где автор рассказывает то, как создать виджет со сменой изображения, используя WorkManager.
Сам API ещё в alpha, но видно, что идёт развитие и переосмысление виджетов. Правда, интересно, станут ли они снова популярными среди пользователей системы. 🤔
#android
Совсем недавно Google решил переосмыслить поведение виджетов и у нас появилось новое API для их создания — Glance.
Очень круто, что всё работает в Jetpack Compose стиле, что подразумевает общее API и для виджетов, и для основных элементов экрана.
Вот неплохой пример создания виджета, где автор рассказывает то, как создать виджет со сменой изображения, используя WorkManager.
Сам API ещё в alpha, но видно, что идёт развитие и переосмысление виджетов. Правда, интересно, станут ли они снова популярными среди пользователей системы. 🤔
👍3👎1
Screen response time
#android
Одной из важных метрик, связанных со скоростью работы приложения является то, как быстро рендерятся
Если посмотреть на наших коллег с Web, то там это одна из ключевых метрик и существует множество полезных инструментов для того, чтобы корректно её измерить.
С Android всё не так просто, но тем не менее есть парочку инструментов, которые могут нам помочь сделать приложения ещё более качественными.
🧑💻Автор статьи делится своими наблюдениями по оптимизации времени рендеринга экранов приложения.
Парочку советов из статьи:
1️⃣ Делайте Inflate layout асинхронно — особенно полезный совет в сложных экранах, где создание новых View довольно затратно. Например, можно использовать AsyncLayoutInflater, а тут можно взять AsyncLayoutInflater на основе Coroutines.
2️⃣ Делайте View плоскими — достаточно распространённый совет, который позволяет уменьшить количество фаз
3️⃣ Ленивая инициализация объектов — инициализация объектов довольно затратный процесс, поэтому правильно настроенное создание объектов может здорово помочь сэкономить при рендеринге.
В статье можно найти ещё несколько примеров, которые реально применить для любого проекта.
#android
Одной из важных метрик, связанных со скоростью работы приложения является то, как быстро рендерятся
View, да и в целом экран. Если посмотреть на наших коллег с Web, то там это одна из ключевых метрик и существует множество полезных инструментов для того, чтобы корректно её измерить.
С Android всё не так просто, но тем не менее есть парочку инструментов, которые могут нам помочь сделать приложения ещё более качественными.
🧑💻Автор статьи делится своими наблюдениями по оптимизации времени рендеринга экранов приложения.
Парочку советов из статьи:
1️⃣ Делайте Inflate layout асинхронно — особенно полезный совет в сложных экранах, где создание новых View довольно затратно. Например, можно использовать AsyncLayoutInflater, а тут можно взять AsyncLayoutInflater на основе Coroutines.
2️⃣ Делайте View плоскими — достаточно распространённый совет, который позволяет уменьшить количество фаз
onMeasure. 3️⃣ Ленивая инициализация объектов — инициализация объектов довольно затратный процесс, поэтому правильно настроенное создание объектов может здорово помочь сэкономить при рендеринге.
В статье можно найти ещё несколько примеров, которые реально применить для любого проекта.
👍13❤2👎1
Screenshot tests для Compose
#compose
Тестирование при помощи скриншотов — довольно эффективный способ тестирования UI. При использовании Jetpack Compose у нас есть аннотации
Есть библиотека Showkase, которая помогает преобразовать аннотированные методы в элементы UI для предварительного просмотра.
Автор статьи рассказывает о том, как он соединил эту либу с Screenshot testing library от Facebook.
Но он решил пойти чуть дальше и попробовал интегрировать Showkase с библиотекой Paparazzi, которая позволяет получить скриншоты приложения без физического устройства или эмулятора.
🤓 В результате у автора получилось вынести тестирование UI при помощи скриншотов на CI. Если скриншоты отличаются от тех, что были получены в новом PR, то создаётся ветка, где показывается diff между двумя ветками.
Тут автор рассказывает, как можно интегрировать подобный подход в своём приложении.
#compose
Тестирование при помощи скриншотов — довольно эффективный способ тестирования UI. При использовании Jetpack Compose у нас есть аннотации
@Preview, которые, по сути и являются слоем для UI.Есть библиотека Showkase, которая помогает преобразовать аннотированные методы в элементы UI для предварительного просмотра.
Автор статьи рассказывает о том, как он соединил эту либу с Screenshot testing library от Facebook.
Но он решил пойти чуть дальше и попробовал интегрировать Showkase с библиотекой Paparazzi, которая позволяет получить скриншоты приложения без физического устройства или эмулятора.
🤓 В результате у автора получилось вынести тестирование UI при помощи скриншотов на CI. Если скриншоты отличаются от тех, что были получены в новом PR, то создаётся ветка, где показывается diff между двумя ветками.
Тут автор рассказывает, как можно интегрировать подобный подход в своём приложении.
👍13👎1🔥1
Как устроен viewModelScope?
#android
При работе с
❓Давайте рассмотрим чуть детальнее, как он работает внутри.
Класс
Нам интересен метод
Подобное поведение можно было довольно просто организовать и самостоятельно, однако пришлось бы сделать кастомный
Ещё больше почитать о внутренней работе ViewModel можно тут.
#android
При работе с
coroutines мы частенько можем забыть отменить нужную нам джобу в тот момент, когда она нам больше не нужна. К счастью для нас, существует viewModelScope, который уничтожает ненужные coroutines в тот момент, когда уничтожается ViewModel.❓Давайте рассмотрим чуть детальнее, как он работает внутри.
Класс
ViewModel содержит внутри Map объектов, кототорые могут содержать любой тип объектов. Нам интересен метод
clear(), который вызывается перед методом onCleared() и который мы можем переопределить в нашей модели. Тут вызывается метод closeWithRuntimeException(), который как раз и завершает нужный нам Scope, так как он имплементирует интерфейс Closeable.Подобное поведение можно было довольно просто организовать и самостоятельно, однако пришлось бы сделать кастомный
Scope и завершить его в нужном нам месте. Разработчики Jetpack нам чуть-чуть упростили задачу.Ещё больше почитать о внутренней работе ViewModel можно тут.
👍17
App Quality Insights from Firebase Crashlytics
#android
Начиная с Android Studio Electric Eel у нас появилась возможность смотреть информацию из Crashlytics прямо внутри IDE.
Всё будет работать при помощи инструмента App Quality Insights и будет показываться стек вызовов, статистика, вызовы и всё, что мы смотрим внутри окна браузера.
Выглядит прям круто, с нетерпением жду хотя бы Beta-версии, чтобы попробовать все в деле. 🔥
#android
Начиная с Android Studio Electric Eel у нас появилась возможность смотреть информацию из Crashlytics прямо внутри IDE.
Всё будет работать при помощи инструмента App Quality Insights и будет показываться стек вызовов, статистика, вызовы и всё, что мы смотрим внутри окна браузера.
Выглядит прям круто, с нетерпением жду хотя бы Beta-версии, чтобы попробовать все в деле. 🔥
❤10❤🔥9
Ежегодный опрос команд российской разработки
В этом году начался ежегодный, уже шестой опрос про отечественные мобильные команды разработки. Из него можно узнать:
📖 откуда мобильщики получают новые знания;
💪 какие команды мобильной разработки самые сильные;
🌎 сколько человек решило уехать, а сколько – осталось;
🏡 сколько мобильщиков работает удаленно, а сколько – в офисе;
🌟 в каких компаниях мобильные разработчики хотят работать больше всего.
Вот результаты прошлого года, а поучаствовать в опросе этого года можно тут. Опрос займёт не больше минуты.
Не забудьте выбрать на одном из шагов также канал Android Live, для меня это очень важно 🤝.
В этом году начался ежегодный, уже шестой опрос про отечественные мобильные команды разработки. Из него можно узнать:
📖 откуда мобильщики получают новые знания;
💪 какие команды мобильной разработки самые сильные;
🌎 сколько человек решило уехать, а сколько – осталось;
🏡 сколько мобильщиков работает удаленно, а сколько – в офисе;
🌟 в каких компаниях мобильные разработчики хотят работать больше всего.
Вот результаты прошлого года, а поучаствовать в опросе этого года можно тут. Опрос займёт не больше минуты.
Не забудьте выбрать на одном из шагов также канал Android Live, для меня это очень важно 🤝.
🤮9❤6👍1
Lifecycle of Composables in Jetpack Compose
#compose #новичкам
Довольно подробный гайд о том, что из себя представляет Jetpack Compose. Будет сильно полезно новичкам, ну и, конечно, тем, кто не особо представляет, как фреимворк работает под капотом.
Тут и:
🔸 жизненный цикл composable-функции;
🔸 обновление одной composable-функции из другой;
🔸 логирование событий;
🔸 и о том, как корректно использовать рекомпозицию.
Ну и круто, что всё построено на одном примере, который вы вместе с автором можете построить. 👌🏻
Ссылка на туториал тут.
#compose #новичкам
Довольно подробный гайд о том, что из себя представляет Jetpack Compose. Будет сильно полезно новичкам, ну и, конечно, тем, кто не особо представляет, как фреимворк работает под капотом.
Тут и:
🔸 жизненный цикл composable-функции;
🔸 обновление одной composable-функции из другой;
🔸 логирование событий;
🔸 и о том, как корректно использовать рекомпозицию.
Ну и круто, что всё построено на одном примере, который вы вместе с автором можете построить. 👌🏻
Ссылка на туториал тут.
👍11🤔3
Абстракция для Strings
#android
Попался любопытный пример работы со строками в Android.
Дело в том, что при использовании строк в больших проектах может возникнуть архитектурная проблема с доступом к
Автор предлагает использовать sealed-класс для обработки подобных кейсов.
Его просто применять на любых уровнях абстракции. Подробнее в этой статье.
#android
Попался любопытный пример работы со строками в Android.
Дело в том, что при использовании строк в больших проектах может возникнуть архитектурная проблема с доступом к
Context и получению строк с его использованием.Автор предлагает использовать sealed-класс для обработки подобных кейсов.
sealed class TextResource {
companion object {
fun fromText(text : String) : TextResource = SimpleTextResource(text)
fun fromStringId(@StringRes id : Int) : TextResource = IdTextResource(id)
fun fromPlural(@PluralRes id: Int, pluralValue : Int) : TextResource = PluralTextResource(id, pluralValue)
}
}Его просто применять на любых уровнях абстракции. Подробнее в этой статье.
👍9👎3💩3
Зависимости в многомодульном приложении
#android
При написании многомодульных приложений одним из важных пунктов является управлением зависимостями, которые распространяются на весь проект.
Есть несколько хороших подходов для того, чтобы обновлять зависимости одновременно во всех модулях, и вот вам один из них, описанный в статье.
Автор использует Kotlin DSL с его более удобным синтаксисом для написания кода в gradle-файлах, и объединяет все зависимости при помощи кастомного buildSrc.
В итоге мы можем управлять зависимостями, используя только один файл, а добавлять в модуль таким образом:
#android
При написании многомодульных приложений одним из важных пунктов является управлением зависимостями, которые распространяются на весь проект.
Есть несколько хороших подходов для того, чтобы обновлять зависимости одновременно во всех модулях, и вот вам один из них, описанный в статье.
Автор использует Kotlin DSL с его более удобным синтаксисом для написания кода в gradle-файлах, и объединяет все зависимости при помощи кастомного buildSrc.
В итоге мы можем управлять зависимостями, используя только один файл, а добавлять в модуль таким образом:
implementation(Libs.Kotlin.stdlib)
implementation(Libs.AndroidX.appcompat)
implementation(Libs.AndroidX.coreKtx)👎4🔥4🤔3❤1
UDF с Kotlin Flow
#kotlin
Классный пример визуализации поведения Kotlin Flow в Android.
Автор рассмотрел основные кейсы работы
Получилась крутая визуализация, что будет полезно, если вы хотите лучше разобраться с
#kotlin
Классный пример визуализации поведения Kotlin Flow в Android.
Автор рассмотрел основные кейсы работы
Flow в контексте состояний, пользовательских действий и различных типов.Получилась крутая визуализация, что будет полезно, если вы хотите лучше разобраться с
Flow 🤓👍10🔥2❤1
OnBackPressed Deprecated и что использовать вместо него
#android
Если сейчас выставить targetSdk 33, то можно увидеть то, что OnBackPressed() метод в Activity — deprecated.
Это объясняется тем, что начиная с Android 10, когда была добавлена нативная поддержка навигации жестами, у пользователей были проблемы ложных срабатываний при свайпах. Получалось, что Android не мог корректно определить, был ли это просто свайп, или же пользователь действительно нажал назад.
💡Что использовать вместо onBackPressed?
Рекомендуется перейти на onBackPressedDispatcher, который надо будет зарегистрировать в Activity вместе с OnBackPressedCallback.
Вероятно, с Android 13 у пользователя немного поменяется навигация при помощи жестов, чтобы более корректно распознавать те жесты, которые он использовал.
👉 Чуть больше деталей и пример кода можно найти тут
#android
Если сейчас выставить targetSdk 33, то можно увидеть то, что OnBackPressed() метод в Activity — deprecated.
Это объясняется тем, что начиная с Android 10, когда была добавлена нативная поддержка навигации жестами, у пользователей были проблемы ложных срабатываний при свайпах. Получалось, что Android не мог корректно определить, был ли это просто свайп, или же пользователь действительно нажал назад.
💡Что использовать вместо onBackPressed?
Рекомендуется перейти на onBackPressedDispatcher, который надо будет зарегистрировать в Activity вместе с OnBackPressedCallback.
Вероятно, с Android 13 у пользователя немного поменяется навигация при помощи жестов, чтобы более корректно распознавать те жесты, которые он использовал.
👉 Чуть больше деталей и пример кода можно найти тут
👍18
Как ViewModel переживает configuration changes?
#android
Полезная статья, которая даёт базовое представление о том, как
Кстати, вопросы о том, как заставить
Да и в целом, полезно знать, какая "магия" происходит под капотом и для чего нужен
#android
Полезная статья, которая даёт базовое представление о том, как
ViewModel переживает состояние при повороте экрана. Кстати, вопросы о том, как заставить
ViewModel пережить своё состояние (или же ваш кастомный класс) частенько попадаются на собеседованиях. Да и в целом, полезно знать, какая "магия" происходит под капотом и для чего нужен
ViewModelStore🙃.❤5👎5👍3🤔1
Chrome Inspect
#android
Совсем недавно узнал о таком инструменте Chrome как
Он больше подходит, если вы пишите веб-приложения, однако, есть кейсы, когда он нужен и нам – Android-разработчикам: например, при отображении контента с
💡Пользоваться им очень просто:
1️⃣ Включаем режим разработчика на смартфоне (кажется, что вы все это сделали).
2️⃣ Ввводим в строку браузера
3️⃣ В целом, на этом всё: мы можем анализировать код, который приходит в нашу
Радует тот факт, что с нас не требуется установки никаких дополнительных зависимостей, ведь использовать его мы будем не очень часто.
#android
Совсем недавно узнал о таком инструменте Chrome как
chrome://inspect. Возможно, вы, как и я, услышите о нём впервые.Он больше подходит, если вы пишите веб-приложения, однако, есть кейсы, когда он нужен и нам – Android-разработчикам: например, при отображении контента с
WebView и его дебага.💡Пользоваться им очень просто:
1️⃣ Включаем режим разработчика на смартфоне (кажется, что вы все это сделали).
2️⃣ Ввводим в строку браузера
chrome://inspect и подключаемся к телефону.3️⃣ В целом, на этом всё: мы можем анализировать код, который приходит в нашу
WebView, ставить callbacks и анализировать логи.Радует тот факт, что с нас не требуется установки никаких дополнительных зависимостей, ведь использовать его мы будем не очень часто.
👍21💩3
Android Manifest placeholders
#android
Уверен, что большинство из вас слышали про то, что такое
Если нет, то по сути — это возможность объявить переменную внутри
Правда, вы не можете ссылаться на эту переменную внутри
💡Использовать его довольно просто: объявляем переменную через
Таким образом, мы можем настроить нужное нам поведение хоть на этапе сборки приложения, хоть для отдельного flavor. Берите на заметку. 😉
#android
Уверен, что большинство из вас слышали про то, что такое
buildConfigField.Если нет, то по сути — это возможность объявить переменную внутри
build.gradle и её дальнейшее использование внутри приложения.Правда, вы не можете ссылаться на эту переменную внутри
AndroidManifest. Самый типичный кейс — добавление идентификатора приложения для всяких сервисов, типа HMS или GMS. Но тогда на помощь приходит менее распространённый, но весьма крутой инструмент manifestPlaceholders.💡Использовать его довольно просто: объявляем переменную через
manifestPlaceholders.variable = "testVariable", а дальше получаем ссылку на неё в AndroidManifest при помощи: <meta-data
android:name="variable_name"
android:value="${testVariable}"/>Таким образом, мы можем настроить нужное нам поведение хоть на этапе сборки приложения, хоть для отдельного flavor. Берите на заметку. 😉
👍19❤3🔥2💩1
Релиз Android 13
#android
Как и в последней паре релизов, ближе к концу лета у нас появляется новая, стабильная версия Android, в этот раз — 13.
Скоро ещё больше смартфонов получат новое обновление, а нам, разработчикам, надо обновить targetSdk до 33 версии.
🤓 Давайте кратко пройдёмся по тем пунктам, которые важно проверить у себя перед релизом:
🍦Read Media Permission — теперь при использовании android.permission.READEXTERNALSTORAGE вам необходимо описать, к каким типам файлов вы хотите получить доступ. Например, если вам нужны только изображения, то необходимо указать: android.permission.READMEDIAIMAGES.
Но не спешите удалять старый READEXTERNALSTORAGE: ему можно указать android:maxSdkVersion="32", сохранив корректную работу на уже старых версиях Android.
🍦Android 13 Photo Picker — также, для получения изображений и других медиа-объектов, можно воспользоваться PhotoPicker, который вскоре будет работать на Android 11 и выше. Это на случай, если вам не нужно постоянно иметь доступ к галерее пользователя. Довольно удобно.
🍦Notifications runtime permission — теперь не получится показать уведомления без разрешения пользователя. Для начала добавим:
<uses-permission android:name="android.permission.POSTNOTIFICATIONS" /> в манифесте, а после нужно запросить разрешение у пользователя по аналогии с обычным запросом разрешений.
🍦* Google Play Advertising ID* — проверьте, используете ли вы рекламный идентификатор в своём приложении. Кстати, даже если ваше приложение напрямую его не использует, проверьте библиотеки для аналитики, часто именно они запрашивают этот идентификатор.
Если нашли — не забудьте заполнить форму в Google Play, а также добавить разрешение в манифест:
<uses-permission android:name="com.google.android.gms.permission.ADID"/>.
🍦и ещё парочку дополнений, таких как корректная окраска сайтов в WebView, оптимизаций батареи, Intent Filter Restrictions и т.д. Классная статья с подробным описанием тут.
В целом, я уже в ближайшее время планирую поднять targetSdk в своих проектах, и миграция пока не выглядит сложной.
#android
Как и в последней паре релизов, ближе к концу лета у нас появляется новая, стабильная версия Android, в этот раз — 13.
Скоро ещё больше смартфонов получат новое обновление, а нам, разработчикам, надо обновить targetSdk до 33 версии.
🤓 Давайте кратко пройдёмся по тем пунктам, которые важно проверить у себя перед релизом:
🍦Read Media Permission — теперь при использовании android.permission.READEXTERNALSTORAGE вам необходимо описать, к каким типам файлов вы хотите получить доступ. Например, если вам нужны только изображения, то необходимо указать: android.permission.READMEDIAIMAGES.
Но не спешите удалять старый READEXTERNALSTORAGE: ему можно указать android:maxSdkVersion="32", сохранив корректную работу на уже старых версиях Android.
🍦Android 13 Photo Picker — также, для получения изображений и других медиа-объектов, можно воспользоваться PhotoPicker, который вскоре будет работать на Android 11 и выше. Это на случай, если вам не нужно постоянно иметь доступ к галерее пользователя. Довольно удобно.
🍦Notifications runtime permission — теперь не получится показать уведомления без разрешения пользователя. Для начала добавим:
<uses-permission android:name="android.permission.POSTNOTIFICATIONS" /> в манифесте, а после нужно запросить разрешение у пользователя по аналогии с обычным запросом разрешений.
🍦* Google Play Advertising ID* — проверьте, используете ли вы рекламный идентификатор в своём приложении. Кстати, даже если ваше приложение напрямую его не использует, проверьте библиотеки для аналитики, часто именно они запрашивают этот идентификатор.
Если нашли — не забудьте заполнить форму в Google Play, а также добавить разрешение в манифест:
<uses-permission android:name="com.google.android.gms.permission.ADID"/>.
🍦и ещё парочку дополнений, таких как корректная окраска сайтов в WebView, оптимизаций батареи, Intent Filter Restrictions и т.д. Классная статья с подробным описанием тут.
В целом, я уже в ближайшее время планирую поднять targetSdk в своих проектах, и миграция пока не выглядит сложной.
👍23