We Love Android – Telegram
We Love Android
632 subscribers
259 photos
26 videos
4 files
630 links
Новости из мира Android-разработки
Download Telegram
Forwarded from Android Broadcast (Кирилл Розов)
В официальной документации появилось руководство по тому как находить и исправлять ANR

Что там есть:
👉 Причины появления
👉 Как дебажить
👉 Мистические ANR
👍2🔥2😱1
Forwarded from Compose Broadcast (Кирилл Розов)
В Jetpack Compose переписывают текстовые поля и его уже можно попробовать в версии 1.6.0 - BasicTextField2

Серия статей от гуглера про причины появления второй версии и какие улучшения она принесет:
👉 Часть 1 (10 мин, EN, ссылка без VPN)
👉 Часть 2 (8 мин, EN, ссылка без VPN)

#compose
👍2🔥2🤔1
Forwarded from Compose Broadcast (Кирилл Broadcast)
Capturable - библиотека для создания картинок из Composable функций
👍6🔥1🤔1
Forwarded from Android Live 🤖
Dynamic App Icon
#android

Новый год уже на носу, и настанет пора новогодних иконок в приложениях 😄.

Вот вам краткая статья, которая расскажет, как поменять иконку в приложении на любую нужную вам и обратно без релиза. Можете ещё парочку добавить в приложение и будет новая фича конечно же по подписке.

Вся фича завязана на activity-alias, которые вы настраиваете в AndroidManifest и включаете и отключаете нужный вам.

Дока по алиасам тут, а вот и сама статья про добавление дополнительных иконок.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1🫡1
Forwarded from Mobile Native ️️
Kotlin под капотом: нюансы использования аннотаций

Еще одна статья про внутрянку Kotlin, а именно про то, как применяются аннотации к полям класса.

Читать (Ru)
👍3🤔2
invalidate

Время идет. Уже все изучают Compose. А как работает старый добрый invalidate так многие и не знают.

Давайте расскажу кратко. А потом если тема пойдёт, то расскажу подробнее.

invalidate() - это метод View, который вызывает перерисовку (onDraw) вьюхи. Это примерно все знают. Но как это происходит? Когда? Если я вызову несколько раз подряд invalidate то перерисуется несколько раз?

Сейчас расскажу кратко путь от invalidate до реальной перерисовки вьюхи:
1. Вызываем invalidate у вьюхи
2. Вьюха вызывает у своего родителя invalidateChildInParent
3. И так invalidateChildInParent вызывается идя вверх по дереву пока не дойдем до ViewRootImpl - главного родителя нашей иерархии вьюх (она, кстати, сама вьюхой не является, а больше типо менеджера всего)
4. ViewRootImpl через класс Choreographer (мой любимчик) подписывается на следующий сигнал VSYNC. Или, простыми словами, подписывается на следующее событие отрисовки фрейма.
5. Не путайте - не просто кладет сообщение в мейн лупер, чтобы он выполнился как только сможет. А именно подписываемся на следующую отрисовку кадра.
6. Следующая отрисовка кадра произойдет как правило не позднее 16.6 мс с момента подписки.
7. Когда приходит VSYNC, то Choraographer вызывает метод doFrame и там по очереди обрабатывает запросы на: инпут, анимации, инсеты и, наконец, проход дерева и отрисовку.
8. И далее вниз по дереву спускается команда draw и вызывается наш колбек onDraw
9. Наша вьюха перерисовалась

Easy!

#android #view #ui #performance
👍12🔥4🤔2
Forwarded from Mobile Compose
#Docs #Blog #Modifier

Create custom modifiers

Ребята из Google выкатили новую документацию о том, как писать новые, а также мигрировать уже существующие кастомные модификаторы при помощи нового API Modifier.Node.
👍2🤔2
Forwarded from Mobile Developer (Pavel Kachan)
Интересные приемы, взятые из исходного кода Android SDK
https://github.com/evitwilly/android-under-the-hood/blob/main/articles/interesting_tricks_taken_from_Android_SDK_source_code.md

Да, это статья на GitHub, написана кстати нашим подписчиком. Если вы тоже пишете статьи (не важно где), можете скидывать их в чат, с удовольствием почитаем и возможно даже запостим)
👍5🔥2🤔2
Forwarded from Android Guards
Продолжим тему секретных кодов. Я покажу один из возможных способов их извлечения через dumpsys. Тут придется немного погрепать или что-то заскриптовать чтобы выглядело красиво, но в базовом варианте команда будет выглядеть так: adb shell dumpsys package -f | grep -A 5 "android.provider.Telephony.SECRET_CODE". Далее можно или бездумно вводить каждый код, пытаясь понять почему же он не работает, или исследовать receiver который этот код слушает.

В самих же кодах нет никакой магии. Например код *#*#225#*#* отправленный из звонилки приведет к отправке intent-а с URI: android_secret_code://225, который и будет разбирать целевой receiver. А это значит, что можно отправить такой intent из своего приложения, и если в receiver-е нет проверки на action, то он будет обработан. Так можно проэксплуатировать какую-нибудь уязвимость в receiver-е.
#aht
👍3🔥1
Forwarded from Mobile Native ️️
Kotlin под капотом: inline функции

Ещё одна крутая статья из цикла Kotlin под капотом, про inline функции.

• Популярное заблуждение: inline функции экономят стек вызовов
• Популярное заблуждение: inline функции экономят количество методов
• В профит inline функций
• Измерение профита от inline функций
• Crossinline
• Reified

А вообще, у Макса все статьи крутые. Если пропустили, рекомендую почитать 👇

• Измеряя sequences
• Оптимизируя sequences
• Kotlin под капотом: нюансы использования аннотаций

Читать (Ru)
👍2🔥2
Forwarded from Mobile Native ️️
Kotlin Multiplatform в мобильной разработке. Рецепты общего кода для Android и iOS

Статья про Kotlin Multiplatform, с примером как можно выносить код в общий модуль.

👉 Общий модуль в KMP
👉 Логика экранов (ViewModel)
👉 Навигация между экранами
👉 Работа с сетью
👉 DI
👉 Хранение данных
👉 Строковые ресурсы
👉 Нативные инструменты (датчики, переход в другие приложения)
👉 Пример фичи (обработка push-уведомлений)

Читать (Ru)
👍7🔥2😐2
Forwarded from Kotlin Adept Notes (Alex Panov)
This media is not supported in your browser
VIEW IN TELEGRAM
Compose withAnimation

В SwiftUI есть очень классная фича withAnimation, позволяющая сделать анимацию вьюшки просто путем изменения состояния, а сама анимация произойдет как по волшебству.


@State private var showDetail = false

var body: some View {
VStack {
Button("Show details") {
withAnimation {
showDetail.toggle()
}
}

if showDetail {
Text("Details")
}
}
}


Не справедливо, что такого механизма нет из коробки в Compose, и инженер из Google решил исправить это недоразумение. Он сделал свой аналог withAnimation и реализовал это с помощью Snapshot API, про который мы говорили ранее.

Как это работает?

1. Создается пустой словарь состояний для анимации
2. Выполняется лямбда блок внутри Snapshot, в этой лямбде могут происходить изменения стейта
3. У Snapshot вызывается writeObserver при каждой записи в State и заполняется информация для анимации
4. Данные мапятся в другой тип, откуда достаются измененные значения
5. Уничтожается Snapshot, чтобы не допустить утечек памяти, при этом изменения не применяются глобально! «Все что произошло в снапшоте, остается в снапшоте»©
6. Анимируются значения


internal suspend fun withAnimation(
adapterRegistry: StateObjectAdapterRegistry,
animationSpec: AnimationSpec<Any?>,
block: () -> Unit
) {
val statesToAnimate = mutableMapOf<Any, StateObjectAdapter>() // 1
val snapshot = Snapshot.takeMutableSnapshot(
writeObserver = { changedState ->
statesToAnimate[changedState] = checkNotNull(adapterRegistry.getAdapterFor(changedState)) // 3
}
)
val targetValues = snapshot.enter {
block() // 2
buildTargetValues(statesToAnimate) // 4
}
snapshot.dispose() // 5

animateValues(targetValues, animationSpec) // 6
}


Если у вас есть еще идеи как можно применить снапшоты, делитесь своими мыслями в комментариях👇

#Compose #Snapshots #Animations
🔥4👍2🐳1
FlexibleBottomSheet - это расширенный нижний экран для Jetpack Compose, который позволяет реализовать сегментированный размер и немодальный тип, подобно Google Maps. Он также предлагает дополнительные удобства, включая указание размеров листа, отслеживание его состояния и другие настройки.

FlexibleBottomSheet на GitHub: https://github.com/skydoves/FlexibleBottomSheet
Платформа: Android
⭐️: 194
👍4🔥2
Простота. Наглядность. Красота.
😁124👍3🤯1🤩1
Forwarded from Mobile Developer (Алексей Гладков)
Kotlin Antipatterns [EN]
https://proandroiddev.com/kotlin-unknotting-from-realizing-anti-patterns-to-becoming-a-better-developer-c1dfa6c3bab6

Часто в работе вижу как люди используют весьма странные конструкции вроде
val name: String? = person?.name?.let { it } ?: ""


В этой статье разобраны некоторые такие анти-паттерны и что лучше делать вместо этого
👍32🔥2🤡1
📚 Реальные задачи на System Design собеседовании для мобильного разработчика

В этом посте расскажу что ожидать от секции System Design мобильному разработчику.
Если погуглить - то первое что вы увидите, это вопросы как спроектировать поиск или известный мессенджер. Однако, собеседование для мобильного разработчика и бэкенд очень сильно отличаются, поэтому цель поста именно сконцентрироваться на задачах для мобильных разработчиков.

Итак, какого типа задачи ожидать на System Design интервью для мобильного разработчика? Это реальные задачи которые я видел:

📌 Спроектировать приложение прогноз погоды.
📌 Спроектировать банковское приложение для отслеживания котировок акций.
📌 Спроектировать приложение для отслеживания заказа.
📌 Спроектировать приложение редактор картинок

Таким образом, на позиции мобильного разработчика от вас никто не ждет что вы сможете спроектировать высоконагруженный бэкенд, однако иметь представление о сетевом слое все-таки необходимо. Вы должны уметь рассказать о плюсах и минусах например REST API vs GraphQL и доказать почему именно REST подойдет вашему приложению которое вы проектируете.

О чем еще неплохо порассуждать и показать что вы знаете о чем говорите:

📌 Реляционные БД vs No-SQL решения
📌 Server-Driven UI
📌 Способы тестирования и плюсы минусы тех или иных подходов
📌 MVP vs MVVM vs MVI.

Сказать что я всегда использую MVVM и поэтому буду использовать его на новом проекте - это красный флаг. Вы должны описать достоинства и недостатки и исходя из вашего опыта предложить оптимальное решение.

Ну и напоследок, самое главное что от вас ожидают на System Design интервью - это способность задать уточняющие вопросы, предложить идеи. Не начинайте рисовать диаграммы пока не спросите 5-10 вопросов. Если молча начать проектировать архитектуру - это красный флаг.

Вообще тема System Design большая и я планирую в ближайшее время большую статью об этом, а пока вот вам немного полезных ресурсов если хотите подготовиться.

- Набор примеров задач для System Design Interview
- System Design. Подготовка к сложному интервью. Автор:Алекс Сюй
- System Design Template
- System Design CheatSheet
7👍1🔥1