We Love Android
Open in Telegram
655
Subscribers
No data24 hours
+17 days
+2430 days
Posts Archive
Repost from Kotlin Adept Notes
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 #AnimationsRepost from Mobile Native ️️
Kotlin Multiplatform в мобильной разработке. Рецепты общего кода для Android и iOS
Статья про Kotlin Multiplatform, с примером как можно выносить код в общий модуль.
👉 Общий модуль в KMP
👉 Логика экранов (ViewModel)
👉 Навигация между экранами
👉 Работа с сетью
👉 DI
👉 Хранение данных
👉 Строковые ресурсы
👉 Нативные инструменты (датчики, переход в другие приложения)
👉 Пример фичи (обработка push-уведомлений)
Читать (Ru)
Repost from Mobile Native ️️
Kotlin под капотом: inline функции
Ещё одна крутая статья из цикла Kotlin под капотом, про inline функции.
• Популярное заблуждение: inline функции экономят стек вызовов
• Популярное заблуждение: inline функции экономят количество методов
• В профит inline функций
• Измерение профита от inline функций
• Crossinline
• Reified
А вообще, у Макса все статьи крутые. Если пропустили, рекомендую почитать 👇
• Измеряя sequences
• Оптимизируя sequences
• Kotlin под капотом: нюансы использования аннотаций
Читать (Ru)
Repost 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-е.
#ahtRepost from Mobile Developer
Интересные приемы, взятые из исходного кода Android SDK
https://github.com/evitwilly/android-under-the-hood/blob/main/articles/interesting_tricks_taken_from_Android_SDK_source_code.md
Да, это статья на GitHub, написана кстати нашим подписчиком. Если вы тоже пишете статьи (не важно где), можете скидывать их в чат, с удовольствием почитаем и возможно даже запостим)
Repost from Mobile Compose
#Docs #Blog #Modifier
Create custom modifiers
Ребята из Google выкатили новую документацию о том, как писать новые, а также мигрировать уже существующие кастомные модификаторы при помощи нового API Modifier.Node.
Repost from Мобильное Чтиво
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
Repost from Mobile Native ️️
Kotlin под капотом: нюансы использования аннотаций
Еще одна статья про внутрянку Kotlin, а именно про то, как применяются аннотации к полям класса.
Читать (Ru)
Repost from Android Live 🤖
Dynamic App Icon
#android
Новый год уже на носу, и настанет пора новогодних иконок в приложениях 😄.
Вот вам краткая статья, которая расскажет, как поменять иконку в приложении на любую нужную вам и обратно без релиза. Можете ещё парочку добавить в приложение и будет новая фича конечно же по подписке.
Вся фича завязана на
activity-alias, которые вы настраиваете в AndroidManifest и включаете и отключаете нужный вам.
Дока по алиасам тут, а вот и сама статья про добавление дополнительных иконок.Repost from Compose Broadcast
В Jetpack Compose переписывают текстовые поля и его уже можно попробовать в версии 1.6.0 - BasicTextField2
Серия статей от гуглера про причины появления второй версии и какие улучшения она принесет:
👉 Часть 1 (10 мин, EN, ссылка без VPN)
👉 Часть 2 (8 мин, EN, ссылка без VPN)
#compose
Repost from Android Broadcast
В официальной документации появилось руководство по тому как находить и исправлять ANR
Что там есть:
👉 Причины появления
👉 Как дебажить
👉 Мистические ANR
Repost from Kotlin Multiplatform Broadcast
Рассказали про ближайшее будущее Kotlin Multipaltform в 2024
Compose Multiplatform
🔥 Главный фокус - вывести Compose for iOS в Beta
👉 Сделать все Compose Core API доступными на всех платформах
👉 Интеграция Accessibility API с iOS и Desktop
🔥 Мультиплатформенная навигационная библиотека
👉 Вывод Compose for Web в Альфа
👉 Команда активно изучает возможность Compose for Web для Wasm (Web Assemble)
Инструментарии
👉 Миграция IDE на K2 компилятор
👉 Fleet - это и будет KMP IDE, так чтобы писать и отлаживать весь код в ней
👉 Расширенная поддержка Compose Multiplatform в Fleet (live preview и отладка UI)
Прочее
👉 Экпорт кода из Kotlin в Swift, минуя Objective-C
👉 Ускорение компиляции Kotlin/Native
👉 Улучшение интеграции CocoaPods
👉 Поддержка SwiftPM
👉 Улучшения опыта разработки библиотеки и удобства их распространения
#kotlin #compose #kmp
Repost from Android Security & Malware
BLE spam but for adult toys
Using Flipper Zero or nRF Connect app, it is possible to send Bluetooth LE advertisement packets (without being paired) to adult toys in vicinity and make them all vibrate. It is also possible to start Denial of Pleasure by continuously broadcasting the stop packet
https://www.whid.ninja/blog/denial-of-pleasure-attacking-unusual-ble-targets-with-a-flipper-zero
Repost from Мобильное Чтиво
Асинхронный map
Хочу поделиться таким приемчиком, как асинхронный map.
Когда мы делаем map для списка, то у нас трансформация будет происходить последовательно. Если эта трансформация не супер быстрая, то общий маппинг может стать не оптимальным.
Как это можно исправить? Через асинхронный map. Вот такая функция (asyncMap) запускает map каждого элемента асинхронно.
При этом:
- несмотря на то, что трансформации выполняются асинхронно, очередность элементов сохраняется
- трансформации выполняются в дочернем скоупе. Structured Concurrency работает, беспокоится не надо. Это означает, что отмена скоупа/джобы корректно отменят и все трансформации.
На примере выше, если бы мы сделали обычный map, то он завершился бы за 6 секунд (1000 + 3000 + 2000). Если мы сделаем asyncMap, то за 3 секунды.
#coroutines #map
Repost from Mobile Compose
#Medium #Article #Text
BasicTextField2: A TextField of Dreams (part 1 & 2)
Вечернего чтива вам.
Свежий материал из двух частей от Alejandra Stamato (бывшей Google DevRel из команды Jetpack Compose), посвященный "TextField-у нового поколения" — BasicTextField2.
Данный компонент появился в альфа-версии 1.6.0 foundation библиотеки и доступен в пакете .text2
Зеркало первой части 👉 тут
Зеркало второй части 👉 тут
——————————————
P.S. Ну а завтра уже выходит второй выпуск Compose Pathway 🚀
Repost from Mobile Developer
How to use Render Effects in Jetpack Compose for Stunning Visuals [EN]
https://blog.canopas.com/how-to-use-render-effects-in-jetpack-compose-for-stunning-visuals-01287d7f00db
Статья как рендерить крутые штуки с примесью базы
👉 Какие рендер эффекты бывают
👉 Что такое шейдер
👉 Примеры различных эффектов
👉 многое другое
Приятного чтения
Repost from Android Guards
Чтобы не копировать каждый раз базу данных с устройства можно воспользоваться утилитой входящей в Android Studio:
View -> Tool Windows -> App Inspection -> Database Inspector. Он покажет все базы данных с которыми работает приложение и даст возможность в них поковыряться. Единственный нюанс: приложение должно иметь флаг android:debuggable=true, иначе инспектор просто не увидит такое приложение. Установить этот флаг очень просто: разбираем приложение с помощью apktool, добавляем флаг в application и собираем заново.
#ahtRepost from Android Broadcast
В официальной документации появилось сравнение приложений на View и после миграции их на Compose. Критерии: размер APK, скорость сборки, скорость работы приложений.
#compose
Repost from Android Live 🤖
Repair IDE feature
#androidstudio
Возможно вы, как и я, не замечали фичу, которая не так давно появилась в Android Studio и IntelliJ IDEA — Repair IDE.
Иногда бывают ситуации, что Android Studio начинает бажить: отказывается собирать проект, хотя с кодом всё в порядке, ругается на кэш и т.д. У меня такое частенько бывает при переключении веток в Git.
Решение в лоб — сделать File -> Invalidate Caches с рестартом. Но вот теперь есть опция Repair IDE, которая призвана помочь по шагам восстановить состояние вашей IDE.
Я попробовал, из 4 кейсов сработало только в 2 😅. В конце всё равно предложила сделать Invalidate Caches.
Теперь у вас есть +1 фича в арсенале, вдруг будет полезна. Детальнее можно почитать тут.
