Самая большая ошибка, которую вы совершили в процессе разработки, и чему она вас научила?
Победитель будет выбран по самому большому числу реакций 15 сентября в 21:00
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
Что посмотреть сегодня вечером? - Фильм про kotlin!
Про то как создавался язык и как так вышло, что Android разработка стала Kotlin first!
Про то как создавался язык и как так вышло, что Android разработка стала Kotlin first!
YouTube
Beyond The Success Of Kotlin / The Documentary by EngX
Almost 15 years ago, a small engineering team at JetBrains embarked on what seemed like a crazy endeavor — to create their own programming language and succeed with it. In the early 2010s, Java was one of the most popular languages, used by millions of engineers.…
🔥17👍3👏1😁1
👉 Работают над плагинами с поддержкой K2, будет быстрее и стабильнее
👉 Для KMM нас ждет первый релиз Swift Export. Будет лучше работать автокомплит и станет проще создавать новые kmm библиотеки
👉 Ставка на комьюнити! Упрощение процесса разработки и публикации библиотек, инструментов и фреймворков на Kotlin
👉 Дальнейшее улучшение самого языка Kotlin. Улучшение производительности, за счет более чистого кода
Подробнее тут: https://kotlinlang.org/docs/roadmap.html
Please open Telegram to view this post
VIEW IN TELEGRAM
Kotlin Help
Kotlin roadmap | Kotlin
👍9🎉6🔥3
Одна из причин перейти на Kotlin 2.0 это уменьшение количества кода ради кода. ExplicitBackingFields, как хороший пример
class SomeViewModel {
val city: StateFlow<String>
field = MutableStateFlow("")
fun updateCity(newCity: String) {
city.value = newCity // обрабатывается как MutableStateFlow
}
}
fun outside(vm: SomeViewModel) {
vm.city // обрабатывается как StateFlow, вызов геттера
}🔥46👍13❤3🤩2👎1
Android Good Reads
Исправляем автоимпорт в Android Studio При автоимпорте на первое место часто всплывают ненужные пакеты. Например Modifier из java.lang.reflect, а не из compose или Flow из java.util.concurrent, а не из пакета с корутинами Как исправить: 👉 Alt/Opt + Enter…
Продолжаем тему удобства использования Android Studio. Улучшаем автокомплит в смешанных Java-Kotlin проектах
👉 Невероятно расстраивает видеть на первом месте
👉 Нужно сделать плагин с реализацией CompletionContributor со своим собственным списком приоритетов
👉 Сам плагин для студии и уже готовым фиксом можно скачать тут
👉 Невероятно расстраивает видеть на первом месте
.component1(), .component2() при обращении к data class из Java кода👉 Нужно сделать плагин с реализацией CompletionContributor со своим собственным списком приоритетов
👉 Сам плагин для студии и уже готовым фиксом можно скачать тут
❤7🔥4👍2😁2👌2
Compiler Explorer в связке с Android
Чем дольше вы работаете, тем чаще встречаете баги которые лежат не на поверхности. Для этого надо заглянуть под капот и посмотреть что происходит с кодом, который вы написали, после всех преобразований компилятора.
Инструмент Compiler Explorer (16k+⭐️ ) покажет по шагам превращение вашего кода в байткод. Чтобы попробовать - не забудьте выбрать в левом окошке Android Kotlin вместо C++.
Более прикладной пример - то как выглядит минификация приложения. R8 удаляет мертвый код, оптимизирует байткод и обфусцирует его. В целом, результат можно увидеть и в APK Analyzer, но не отдельные кусочки кода, как тут: https://godbolt.org/
Чем дольше вы работаете, тем чаще встречаете баги которые лежат не на поверхности. Для этого надо заглянуть под капот и посмотреть что происходит с кодом, который вы написали, после всех преобразований компилятора.
Инструмент Compiler Explorer (16k+
Более прикладной пример - то как выглядит минификация приложения. R8 удаляет мертвый код, оптимизирует байткод и обфусцирует его. В целом, результат можно увидеть и в APK Analyzer, но не отдельные кусочки кода, как тут: https://godbolt.org/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1🔥1
Визуальный гайд по структуре мультиплатформенных проектов
Хотите быстро объяснить коллеге, как устроить архитектуру с KMP/CMP? Это лучший вариант!
👉 Compose MP c разделением по слоям
👉 Kotlin MP с общим presentation слоем. Странный вариант, есть идеи когда это выигрывает?
👉 Kotlin MP c общим data слоем.
👉 Kotlin MP, как общий модуль для нативных приложений. На мой взгляд это самый лучший вариант, но продать эту идею iOS команде еще не получалось
👉 Стандартный вид CMP предлагаемый из шаблонов
Больше возможных архитектурных шаблонов с KMP/CMP: https://github.com/TheSetox/kmp-sample-diagrams
Хотите быстро объяснить коллеге, как устроить архитектуру с KMP/CMP? Это лучший вариант!
👉 Compose MP c разделением по слоям
👉 Kotlin MP с общим presentation слоем. Странный вариант, есть идеи когда это выигрывает?
👉 Kotlin MP c общим data слоем.
👉 Kotlin MP, как общий модуль для нативных приложений. На мой взгляд это самый лучший вариант, но продать эту идею iOS команде еще не получалось
👉 Стандартный вид CMP предлагаемый из шаблонов
Больше возможных архитектурных шаблонов с KMP/CMP: https://github.com/TheSetox/kmp-sample-diagrams
🔥7👍3
Устали писать обслуживающий код? Автоматизируем все с помощью KSP
В кратце, автор генерирует вспомогательные класса для навигации, которая с последними обновлениями стала слишком тяжелой. Все работает благодаря самописным аннотациям и генератору. Используете ли вы нечто похожее?
В кратце, автор генерирует вспомогательные класса для навигации, которая с последними обновлениями стала слишком тяжелой. Все работает благодаря самописным аннотациям и генератору. Используете ли вы нечто похожее?
Medium
Kotlin KSP — how to automate everything in the world
Not long ago, Google rolled out a super cool update for automating boilerplate generation. Of course, I’m talking about Kotlin Symbol…
👍8👎2🔥1🥴1
Красивое решение для LazyList с канала мобильное чтиво. Многие в процессе миграции с xml на compose, так что берите элегантный хак на заметку!
Telegram
Мобильное Чтиво
Очень серьезный канал про мобильную разработку. Веду канал я — @maxkachinkin
❤3👍3
Forwarded from Мобильное Чтиво (Maxim Kachinkin)
This media is not supported in your browser
VIEW IN TELEGRAM
🎨 Главное — чтобы было красиво!
Тесты, шместы, архитектура — это всё прекрасно. Но в итоге главное — чтобы было красиво! Я вот вспомнил одну нашу фичу, где надо было сделать кастомный контрол типа табов, которые плавно анимировались, центрировались на выбранном, а потом обратно схлопывались. Всё на Compose, конечно. 💻
И что вы думаете? Контентные паддинги в LazyRow не помогли, игры с отступами тоже. Даже использование horizontalScroll не дало результата. Пришлось думать дальше. 🤔
А как в итоге сделали? Ну, это можно назвать костылём (или нормальным решением, если вам так больше нравится). Добавили "фейковые" элементы в начале и в конце списка и анимировали их размер. 🙃
Используем LazyRow и делаем первый и последний item просто прозрачные Spacer, чтобы создать видимость отступов. Плавно и красиво анимируем их ширину, и всё! 💫 На самом деле не совсем всё: это тянет за собой много всего, чтобы учитывать эти элементы по-особенному (чтобы не кликались, не анимировались, не участвовали в выборе и т.д.).
Как заметили в комментариях, это создает дополнительные рекомпозиции 🫣, что не может не радовать. Такой трейдофф решили взять. Но в итоге всё выглядит плавно, аккуратно, ну и просто красиво! 🌟
В комментах я добавлю скриншот кода и видосик — там видно, как это анимируется и центрируется. 🎥
А у вас какие были проблемы из-за красоты? Поделитесь! 😎
#android #compose #ui #lazyrow
Тесты, шместы, архитектура — это всё прекрасно. Но в итоге главное — чтобы было красиво! Я вот вспомнил одну нашу фичу, где надо было сделать кастомный контрол типа табов, которые плавно анимировались, центрировались на выбранном, а потом обратно схлопывались. Всё на Compose, конечно. 💻
И что вы думаете? Контентные паддинги в LazyRow не помогли, игры с отступами тоже. Даже использование horizontalScroll не дало результата. Пришлось думать дальше. 🤔
А как в итоге сделали? Ну, это можно назвать костылём (или нормальным решением, если вам так больше нравится). Добавили "фейковые" элементы в начале и в конце списка и анимировали их размер. 🙃
Используем LazyRow и делаем первый и последний item просто прозрачные Spacer, чтобы создать видимость отступов. Плавно и красиво анимируем их ширину, и всё! 💫 На самом деле не совсем всё: это тянет за собой много всего, чтобы учитывать эти элементы по-особенному (чтобы не кликались, не анимировались, не участвовали в выборе и т.д.).
Как заметили в комментариях, это создает дополнительные рекомпозиции 🫣, что не может не радовать. Такой трейдофф решили взять. Но в итоге всё выглядит плавно, аккуратно, ну и просто красиво! 🌟
В комментах я добавлю скриншот кода и видосик — там видно, как это анимируется и центрируется. 🎥
А у вас какие были проблемы из-за красоты? Поделитесь! 😎
#android #compose #ui #lazyrow
👏11🤯1
В понедельник утром оптимизируем загрузку изображений в compose и kotlin MP
Сохраню вам время. Общий посыл - используйте landscapist (2100+⭐️ ) Шустрый плагин, совместимый с coil, fresco и glide.
Работает как с последним coil3, превьюхами Android Studio и wasm. Используем?
Сохраню вам время. Общий посыл - используйте landscapist (2100+
Работает как с последним coil3, превьюхами Android Studio и wasm. Используем?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
А еще compose 1.7.0-rc01 с большим количеством оптимизаций и исправлений для Compose Multiplatform проектов. iOS версия нашего проекта стала значительно бодрее. Хотя в альфе, версии к версии, не все работало хорошо.
Please open Telegram to view this post
VIEW IN TELEGRAM
👏7🔥5👍2
Как Uber мигрирует нетворк слой на gRPC
Знакомая боль всех мобильный разработчиков с миграцией чего либо на слое данных. Как решает проблему Uber:
👉 Protocol Buffers вместо JSON, HTTP/2 без откатов к HTTP/1.1
👉 Использование gRPC, на который мигрировали постепенно.
С помощью shadow calls проверяли скорость работы и PoC. Это позволило провести небольшое исследование на проде и увидеть результаты без больших затрат.
Поэтапно переводили API, по принципу A/B тестирования и откату к старой REST версии в случае возникновения проблем. Круто же!
👉 Эксперимент привел к снижению нагрузки на 45% и уменьшению задержки запросов на 27%
У компаний сейчас большой запрос на оптимизацию затрат, и это одно из технических решений которые вы можете предложить! Чуть больше по поводу gRPC и Android разработке: https://developer.android.com/guide/topics/connectivity/grpc
Знакомая боль всех мобильный разработчиков с миграцией чего либо на слое данных. Как решает проблему Uber:
👉 Protocol Buffers вместо JSON, HTTP/2 без откатов к HTTP/1.1
👉 Использование gRPC, на который мигрировали постепенно.
С помощью shadow calls проверяли скорость работы и PoC. Это позволило провести небольшое исследование на проде и увидеть результаты без больших затрат.
Поэтапно переводили API, по принципу A/B тестирования и откату к старой REST версии в случае возникновения проблем. Круто же!
👉 Эксперимент привел к снижению нагрузки на 45% и уменьшению задержки запросов на 27%
У компаний сейчас большой запрос на оптимизацию затрат, и это одно из технических решений которые вы можете предложить! Чуть больше по поводу gRPC и Android разработке: https://developer.android.com/guide/topics/connectivity/grpc
👍17🔥3💯1
❤2👍1
Разбираемся с FileProvider
Банальная вещь, но сэкномит вам время
👉 Базово в манифесте определяем провайдер. Решаем нужно ли давать разрешениями на пользование нашими данными другим приложениям (
👉 Определяем
👉 Не забываем про permissions. Можно обойтись без прямого доступа к файловой системе:
Пример использования для того чтобы пошарить картинку из кэша в email без выгрузки bitmap:
Банальная вещь, но сэкномит вам время
👉 Базово в манифесте определяем провайдер. Решаем нужно ли давать разрешениями на пользование нашими данными другим приложениям (
grantUriPermissions, exported)👉 Определяем
<paths>:<files-path> Для файлов внутреннего хранилища ([pm]/files/)<cache-path> Для кэша ([pm]/cache/)<external-path> Внешнее хранилище (/storage/emulated/0/). Учитывайте, что доступ сюда будет иметь любое приложение и без вашего ведома<external-files-path> Внешнее приватное хранилище (/storage/emulated/0/Android/data/[package_name]/files/)<external-cache-path> Внешний приватный кэш (/storage/emulated/0/Android/data/[package_name]/cache/)<root-path> Доступ напрямую из корня. Тут надо осторожно, у вашего приложения может не быть прав на запись 👉 Не забываем про permissions. Можно обойтись без прямого доступа к файловой системе:
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Пример использования для того чтобы пошарить картинку из кэша в email без выгрузки bitmap:
val imagePath = File(context.getCacheDir(), "images")
val newFile = File(imagePath, "image.png")
val contentUri = FileProvider.getUriForFile(context, "com.example.myapp.fileprovider", newFile)
if (contentUri != null) {
val shareIntent = Intent()
shareIntent.setAction(Intent.ACTION_SEND)
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
shareIntent.setDataAndType(contentUri, context.getContentResolver().getType(contentUri))
shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri)
startActivity(Intent.createChooser(shareIntent, "Choose an app"))
}
👍14🫡6🔥2