Что посмотреть сегодня вечером? - Фильм про 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
❤1👍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
This media is not supported in your browser
VIEW IN TELEGRAM
Ink API, поддержка рисовалок для Android приложений
Корректная поддержка стилусов. Работает с API 21 (Android 5.0)
Возможности включают в себя кисти, обьекты, обработка отрисованной линии, чтобы она казалась более плавной. Не хватало этого во многих приложениях, особенно если ты пользуешься стилусом. Теперь поддержка стилуса является частью гайдлайнов гугла по созданию приложений. Глянуть и вдохновиться можно тут: https://developer.android.com/adaptive-apps
Корректная поддержка стилусов. Работает с API 21 (Android 5.0)
Возможности включают в себя кисти, обьекты, обработка отрисованной линии, чтобы она казалась более плавной. Не хватало этого во многих приложениях, особенно если ты пользуешься стилусом. Теперь поддержка стилуса является частью гайдлайнов гугла по созданию приложений. Глянуть и вдохновиться можно тут: https://developer.android.com/adaptive-apps
👍6🔥3❤1