Обновляем приложение через Github Releases без маркета
Все достаточно очевидно:
👉 Выкладываем приложение на GitHub как последний релиз
👉 Через api GitHub'а тянем последнюю версию и информацию о ней
👉 Вытягиваем из артефактов релиза apk
👉 Запрашиваем установку пакета у пользователя
Для публичных релизов необходимо, чтобы ваш проект был опенсорсным + весь флоу немного портит пользовательский опыт. Откат от app bundle к apk файлу тоже выглядит грустно
Из плюсов, если вы используете гитхаб, то этот способ отлично встроится в ваш релизный процесс и моментально раскатит приложение на ваших пользователей, избегая длительного процесса код-ревью.
Все достаточно очевидно:
👉 Выкладываем приложение на GitHub как последний релиз
👉 Через api GitHub'а тянем последнюю версию и информацию о ней
👉 Вытягиваем из артефактов релиза apk
👉 Запрашиваем установку пакета у пользователя
Для публичных релизов необходимо, чтобы ваш проект был опенсорсным + весь флоу немного портит пользовательский опыт. Откат от app bundle к apk файлу тоже выглядит грустно
Из плюсов, если вы используете гитхаб, то этот способ отлично встроится в ваш релизный процесс и моментально раскатит приложение на ваших пользователей, избегая длительного процесса код-ревью.
🔥6🥴2
This media is not supported in your browser
VIEW IN TELEGRAM
Про
Если не знаете что-либо из списка ниже - смело открывайте статью. Подойдет больше для подготовки к теоретической части собеседований:
👉 Coroutine
👉 Отличия между
👉 Зачем нужен
Coroutine и DispatchersЕсли не знаете что-либо из списка ниже - смело открывайте статью. Подойдет больше для подготовки к теоретической части собеседований:
👉 Coroutine
Scope, Coroutine Context, Job👉 Отличия между
Dispatchers.Default, Dispatchers.Main, Dispatchers.IO и Dispatchers.Unconfined👉 Зачем нужен
newSingleThreadContext👍12💯2
This media is not supported in your browser
VIEW IN TELEGRAM
А вот и пример Server Driven Compose! Внутри:
👉 Классическая архитектура с UDF и разделением по слоям
👉 Модульность
👉 Версионирование компонентов
👉 Стандартный технологический стек Hilt, Compose, ksp, Glide, Coroutines
👉 Экспертиза от GDE по Android и Kotlin
Github: https://github.com/skydoves/server-driven-compose (128⭐️ )
👉 Классическая архитектура с UDF и разделением по слоям
👉 Модульность
👉 Версионирование компонентов
👉 Стандартный технологический стек Hilt, Compose, ksp, Glide, Coroutines
👉 Экспертиза от GDE по Android и Kotlin
Github: https://github.com/skydoves/server-driven-compose (128
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13👎8👍5❤1🔥1👾1
Хорошая новость прошедшей недели!
Android 15 доступен в AOSP, а значит скоро появится на большем числе девайсов
👉 Улучшили разные API, писал про это тут
👉 Новые шрифты для японского, корейского и китайского языка, и расширение возможностей работы со шрифтами для разработчиков
👉 Более тонкая программная настройка камеры
👉 Изменения в связанные с безопасностью и приватностью
Upgrade assistant уже доступен
Проверить совместимость вашего приложения тут: https://developer.android.com/about/versions/15/reference/compat-framework-changes
Все нововведения тут: https://developer.android.com/about/versions/15
Android 15 доступен в AOSP, а значит скоро появится на большем числе девайсов
👉 Улучшили разные API, писал про это тут
👉 Новые шрифты для японского, корейского и китайского языка, и расширение возможностей работы со шрифтами для разработчиков
👉 Более тонкая программная настройка камеры
👉 Изменения в связанные с безопасностью и приватностью
Upgrade assistant уже доступен
Проверить совместимость вашего приложения тут: https://developer.android.com/about/versions/15/reference/compat-framework-changes
Все нововведения тут: https://developer.android.com/about/versions/15
🔥3👍1
Исправляем автоимпорт в Android Studio
При автоимпорте на первое место часто всплывают ненужные пакеты.
Например
Как исправить:
👉
👉 Исправить на уровне проекта для всей вашей команды: добавить файл
При автоимпорте на первое место часто всплывают ненужные пакеты.
Например
Modifier из java.lang.reflect, а не из compose или Flow из java.util.concurrent, а не из пакета с корутинами Как исправить:
👉
Alt/Opt + Enter на предлагаемом пакете импорта и нажимаем на Exclude xxx from completion👉 Исправить на уровне проекта для всей вашей команды: добавить файл
codeInsightSettings.xml в .idea вашего проекта и заполнить его ненужными импортами. Ниже пример для стандартного проекта Jetpack Compose + Kotlin Flow + Dagger/Hilt:
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaProjectCodeInsightSettings">
<excluded-names>
<name>android.graphics.Canvas</name>
<name>android.graphics.Color</name>
<name>android.graphics.Paint</name>
<name>android.graphics.drawable.Icon</name>
<name>android.inputmethodservice.Keyboard.Row</name>
<name>android.text.Layout.Alignment</name>
<name>android.view.Surface</name>
<name>android.widget.Button</name>
<name>android.widget.GridLayout.Alignment</name>
<name>androidx.core.content.pm.ShortcutInfoCompat.Surface</name>
<name>java.lang.reflect.Modifier</name>
<name>java.nio.file.WatchEvent.Modifier</name>
<name>java.time.format.TextStyle</name>
<name>javax.annotation.concurrent.Immutable</name>
<name>org.threeten.bp.format.TextStyle</name>
<name>org.w3c.dom.Text</name>
<name>java.util.concurrent.Flow</name>
<name>org.intellij.lang.annotations.Flow</name>
<name>jakarta.inject.Inject</name>
</excluded-names>
</component>
</project>
1👍47🔥12
Немного про синхронизацию в современном kotlin
👉 Для синхронизации 1 значения или конкретной коллекции используем
👉 Для синхронизации
👉 В ином случае
👉 В очень редких случаях когда важен порядок и скорость, а по другому никак - используем
👉 Для синхронизации 1 значения или конкретной коллекции используем
Atomic/ConcurrentCollections👉 Для синхронизации
suspend функций используем Dispatcher👉 В ином случае
synchronized👉 В очень редких случаях когда важен порядок и скорость, а по другому никак - используем
Mutex👍7🤨5🔥2❤1🗿1
😁2🍌2❤1👍1
Разбираемся дает ли val обьекту свойство Immutable
Имутабельность нам нужна для:
👉 Многопоточки
👉 Предстказуемого поведения обьекта и отстутсвия сайд эффектов
👉 Корректного описания состояния обьекта
Что гарантирует нам постоянство ссылки, но не обьекта
Тоже валидный код, где мы переопределяем
Документация нигде не определяет
Задачка со звездочкой. Как создать полностью неизменяемый обьект?
Имутабельность нам нужна для:
👉 Многопоточки
👉 Предстказуемого поведения обьекта и отстутсвия сайд эффектов
👉 Корректного описания состояния обьекта
val в байт коде выглядит вот так:
private final Ljava/lang/String; text
@Lorg/jetbrains/annotations/NotNull;() // invisible
Что гарантирует нам постоянство ссылки, но не обьекта
Тоже валидный код, где мы переопределяем
val как var
interface State<out T> {
val value: T
}
interface MutableState<T> : State<T> {
override var value: T
operator fun component1(): T
operator fun component2(): (T) -> Unit
}
val state: State<String> = remember { mutableStateOf("text") }
(state as MutableState<String>).value = "changed"
Документация нигде не определяет
val как immutable, только как переменную доступную только для чтенияЗадачка со звездочкой. Как создать полностью неизменяемый обьект?
👏7❤1🔥1
Самая большая ошибка, которую вы совершили в процессе разработки, и чему она вас научила?
Победитель будет выбран по самому большому числу реакций 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