Android Good Reads
4.1K subscribers
383 photos
16 videos
1 file
2.15K links
Самые интересные статьи, видео и новости, связанные с Android разработкой. Не больше трёх материалов в день.

Автор канала: @Lamprof

Размещение рекламы: @tanyasanovna
Download Telegram
Обновляем приложение через Github Releases без маркета

Все достаточно очевидно:
👉 Выкладываем приложение на GitHub как последний релиз
👉 Через api GitHub'а тянем последнюю версию и информацию о ней
👉 Вытягиваем из артефактов релиза apk
👉 Запрашиваем установку пакета у пользователя

Для публичных релизов необходимо, чтобы ваш проект был опенсорсным + весь флоу немного портит пользовательский опыт. Откат от app bundle к apk файлу тоже выглядит грустно
Из плюсов, если вы используете гитхаб, то этот способ отлично встроится в ваш релизный процесс и моментально раскатит приложение на ваших пользователей, избегая длительного процесса код-ревью.
🔥6🥴2
This media is not supported in your browser
VIEW IN TELEGRAM
Про 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 ⭐️)
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13👎8👍51🔥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
🔥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 значения или конкретной коллекции используем Atomic/ConcurrentCollections
👉 Для синхронизации suspend функций используем Dispatcher
👉 В ином случае synchronized
👉 В очень редких случаях когда важен порядок и скорость, а по другому никак - используем Mutex
👍7🤨5🔥21🗿1
val является immutable в kotlin
Anonymous Poll
54%
Правда
46%
Не правда
😁2🍌21👍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, только как переменную доступную только для чтения

Задачка со звездочкой. Как создать полностью неизменяемый обьект?
👏71🔥1
🎁 У нас получится разыграть 1 билет на Podlodka Android Crew. Чтобы участвовать в конкурсе, надо оставить комментарий к этому посту с ответом на самый популярных вопрос с поведенческой части интервью:

Самая большая ошибка, которую вы совершили в процессе разработки, и чему она вас научила?

Победитель будет выбран по самому большому числу реакций 15 сентября в 21:00
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
Что посмотреть сегодня вечером? - Фильм про kotlin!
Про то как создавался язык и как так вышло, что Android разработка стала Kotlin first!
🔥17👍3👏1😁1
📍 Команда Kotlin обновила свои планы!

👉 Работают над плагинами с поддержкой K2, будет быстрее и стабильнее
👉 Для KMM нас ждет первый релиз Swift Export. Будет лучше работать автокомплит и станет проще создавать новые kmm библиотеки
👉 Ставка на комьюнити! Упрощение процесса разработки и публикации библиотек, инструментов и фреймворков на Kotlin
👉 Дальнейшее улучшение самого языка Kotlin. Улучшение производительности, за счет более чистого кода

Подробнее тут: https://kotlinlang.org/docs/roadmap.html
Please open Telegram to view this post
VIEW IN TELEGRAM
👍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👍133🤩2👎1
Android Good Reads
Исправляем автоимпорт в Android Studio При автоимпорте на первое место часто всплывают ненужные пакеты. Например Modifier из java.lang.reflect, а не из compose или Flow из java.util.concurrent, а не из пакета с корутинами Как исправить: 👉 Alt/Opt + Enter…
Продолжаем тему удобства использования Android Studio. Улучшаем автокомплит в смешанных Java-Kotlin проектах

👉 Невероятно расстраивает видеть на первом месте .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/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81🔥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
🔥7👍3