Kotlin Multiplatform
2.64K subscribers
84 photos
3 videos
407 links
Русскоязычный канал новостей о Kotlin Multiplatform
Download Telegram
На github есть пример фуллстек проекта на kotlin-multiplatform – chat-app. Примечателен пример по нескольким причинам:
1. Используется актуальная версия kotlin - 1.3.50
2. common библиотека используется на android, ios и frontend
3. есть общий код между клиентской common библиотекой и бекенд приложением (логгер и модель сетевой сущности)
4. common код покрыт тестами (немного)
5. в ios таргет через плагин gradle-cocoapods подключена нативная библиотека SocketRocket
6. frontend сделан на react, но написан на kotlin

Так же автор проекта выступал с докладом про kotlin multiplatform.

#slides #samples
Информация для тех кто в Новосибирске:

Мы (IceRock) приглашаем всех Вас на наш первый открытый митап Kotlin/Everywhere, который состоится 24 ноября в лекторий-баре "Поток" (улица Депутатская 46 "СИТИЦЕНТР").
Сбор гостей в 10.00

На митапе выступят:

Илья Матвеев (спикер из JetBrains)
расскажет, как организованы мультиплатформенные проекты с позиции билд-системы.

Дмитрий Доловов (спикер из JetBrains)
поделится опытом, с какими задачами его команда столкнулась и какие решения использовала, чтобы сделать интеграцию Kotlin/Native с платформой возможной.

Андрей Ковалёв
расскажет об использовании KotlinMultiplatform IOS-разработчиком, об особенностях процессах разработки мультиплатформенных проектов, какие преимущества и планы по развитию Kotlin Multiplatform в компании.

Алексей Михайлов
в live-режиме (то есть прямо вместе с аудиторией) реализует небольшое приложение с использованием kotlin multiplatform на обе платформы.

Регистрация обязательна.

Активные участники могут выиграть лицензию на продукцию JetBrains, так что задавайте вопросы и общайтесь со спикерами.

Будем благодарны за шаринг постов:
vkontakte
facebook

#events
Coroutines хоть и доступны в kotlin multiplatform на всех платформах, но имеют разные ограничения – например на native нет поддержки смены потоков. Эта проблема связана с жесткими ограничениями по работе с памятью со стороны Kotlin/Native.

Kotlin/Native позволяет работать с мутабельными данными только с 1 потока, а с немутабельными - с множества потоков. Это сделано чтобы программа гарантированно не попала в deadlock или race condition, ведь алгоритм параллельной работы будет написан так, что эти состояния будут невозможны.
Для реализации такого подхода в Kotlin/Native stdlib доступны:
* Worker'ы - аналог потоков, worker'у можно дать данные на вход, он их обработает и потом можно забрать данные у него.
* механизм freeze - возможность заморозить объект. Заморозка означает что объект больше нельзя будет модифицировать, а значит его можно читать с любого потока.
* механизм DetachedObjectGraph - он позволяет переносить граф объектов между потоками без заморозки. Право чтения и изменения объекта перейдет с одного потока на другой (можно переносить сколько угодно раз).
Подробно можно почитать в разделе concurrency.

Сама концепция многопоточности K/N расходится с тем, как многопоточность делается в JVM, из-за этого уже больше года ожидается решение issue#462 - Support multi-threaded coroutines on Kotlin/Native. И с выходом kotlin 1.3.60 новый релиз coroutines предоставит нам поддержку смены потоков в Native, а значит и в общем коде.

Уже сейчас можно попробовать черновой вариант многопоточных coroutines, что уже попробовал сделать Kevin Galligan и успешно встроил их в Droidcon App (но на github не залил).

Новость хорошая, но важно помнить что ограничения Kotlin/Native не отменяются. Coroutines работают все в той же среде с запретом на шаринг мутабельного состояния и для написания многопоточных coroutines нужно помнить эти ограничения. В репозитории уже есть документация поясняющая, что передаваемые между потоками объекты будут автоматически заморожены. И чтобы не заморозить случайно то, что не должно было быть заморожено, лучше это пометить ensureNeverFrozen. А так же можно заметить что взаимодействие с многопоточным выполнением coroutines будет аналогичное как с Worker'ами (даем данные на вход, лямбду которая эти данные обработает и передаст результат наружу – вход и результат будут заморожены, а лямбда не должна вызывать ничего внешнего). И тем кто уже использует coroutineworker будет легко мигрировать на официальное решение.

#news #libs
Kotlin 1.3.60 Released!

Со стороны MPP новый релиз больше всего изменений приносит в Kotlin/Native:
• Обновление встроенных фреймворков до версии из Xcode 11 (iOS 13 sdk)
• Поддержка новых таргетов watchOS, tvOS, androidNative
• Улучшение производительности и исправления багов (например, утечки памяти на стыке kotlin и objc при многопоточной работе)

Так как Kotlin/Native не имеет обратной совместимости с библиотеками, собранными старой версией компилятора, нас ждет череда релизов обновлений библиотек до новой версии kotlin. Уже есть:
kotlinx.serialization 0.14.0
klock 1.8.0
multiplatform-settings 0.4.1

Но kotlinx.coroutines, ktor-client пока не получили релизы на финальной версии kotlin 1.3.60 (только eap), поэтому часть библиотек пока не могут обновиться из-за зависимости на них, а так же свои проекты пока рано переводить на новый релиз.

Тем временем у kotlinx.coroutines вышла development preview версия 1.3.2-native-mt-1, на которой можно ознакомиться с многопоточностью coroutines в Native. Роман Елизаров просит перед ознакомлением прочитать документацию.

#news
И из более нового - вчера на событии CocoaHeads Berlin был доклад Kotlin/Native at Careem: Experience Report.

Ребята перевели Android приложение на kotlin и выделили mpp-модуль, чтобы быстрее запустить iOS приложение. Описали, как выстроили у себя процесс работы с Kotlin MPP, в чем увидели плюсы, а что оказалось сложностью.

Приложение, о котором идет речь:
Careem Captain (Android) - 1,000,000+ установок
Careem Captain (iOS)

#slides
Еще одно выступление (на этот раз в Мадриде) на тему Kotlin Multiplatform - Building a library for Android & iOS using Kotlin Multiplatform.

О чем говорилось:
• Основы kotlin multiplatform (expect/actual и управление зависимостями);
• Подключение библиотеки к iOS проекту - ручное и через CocoaPods (только плагин неофициальный почему-то упомянут);
• Базовые библиотеки (coroutines, serialization, ktor, sqdelight);
• Тестирование, включая и тестирование кода с coroutines.

#videos
Shared Code at Quizlet: Deciding on Kotlin Multiplatform - большая и интересная статья про путь компании в теме переиспользования кода между платформами.

Разобрано как они поняли, что пора шарить код. Как проанализировали имеющиеся на тот момент решения, начали шарить код через JavaScript и чему там научились, а в завершение - как решили перейти на Kotlin Multiplatform и краткие итоги по результату перехода.

Это еще один большой продукт, применивший Kotlin Multiplatform.
Quizlet (Android) - 10 000 000+ установок
Quizlet (iOS)

#posts
Для Kotlin Multiplatform вышел аналог moko библиотек - набор библиотек trikot от компании mirego.

В наборе включено:
* trikot.foundation - небольшие полезные компоненты - таймеры, работа с датами, mpp AtomicReference, freeze и очереди для многопоточности;
* trikot.http - http клиент, использующий kotlinx.serialization. Аналог ktor-client;
* trikot.kword - мультиплатформенная локализация с использованием Accent;
* trikot.metaviews - абстракции UI в общем коде, для привязки данных из common кода;
* trikot.streams - реактивные потоки (о этой библиотеке уже упоминал в этом посте).

Так-же есть вводная статья от авторов - Our Next Step in Multiplatform Application Development: Trikot с разбором почему они выбрали Kotlin Multiplatform и для чего используют.

#libs #posts
VMWare тоже пробуют Kotlin Multiplatform и рассказывают о своем опыте в статье Adopting a Cross Platform Strategy for Mobile Apps.

Для их задач потребовался и cintrop-tool - они заинтегрировали нативную C++ библиотеку в ios kotlin код.

Используется Kotlin Multiplatform у них в приложениях Workspace ONE (по информации от участников нашего чата + в статье упоминается com.airwatch).

Touchlab так же написали свое мнение по части пунктов из статьи - Nice to See VMWare Adopting Kotlin Multiplatform.

#posts
Touchlab выпустили библиотеку CrashKiOS, улучшающую информацию о крешах на iOS.

Судя по залогированных крешах в нашем crashlytics - и без библиотеки креши отображаются нормально. Но, видимо, есть набор крешей, которые не отображаются нормально и именно для этих случаев сделана библиотека.

Почитать детальнее можно в посте - Kotlin Native iOS Crash Reporting.

А еще в Kotlin 1.3.60 была улучшена поддержка отладочных символов и можно dSYM для релизных билдов получать, чтобы загрузить в fabric/appstore/еще куда-либо.

#libs #posts
Пачка новостей с KotlinConf:
1. Объявлены большие продукты использующие Kotlin Multiplatform для мобильной разработки (половина из них уже были в нашем канале);
2. в 2020 году будет добавлена поддержка запуска и отладки kotlin приложений на iOS через Android Studio;
3. JetBrains показали лендинг по mobile multiplatform - здесь и набор библиотек для старта, и компании которые используют KMP в продакшене, и плюсы данного подхода;
4. Мы (IceRock) показали свою опенсорс версию moko widgets (github);
5. Kotlin Product Manager запустил тред в твиттере, где рассказал на сколько серьезно JetBrains относятся к kotlin multiplatform и mobile multiplatform в частности, а так же указал ссылки на статьи о опыте продакшен разработки;
6. Так же были выступления о планах по KMP, о опыте мобильной мультиплатформы, о многопоточности.

Разбор выступлений, касающихся мобильной мультиплатформы, и ссылки на материалы буду кидать постепенно в следующие дни.

Так же недавно нами был проведен Kotlin/Everywhere Novosibirsk, который был полностью уделен Kotlin Multiplatform. Видео доступны здесь. Два выступления про разработку от нас и два выступления про kotlin gradle и kotlin/native от JetBrains - рекомендую посмотреть, очень интересная и понятная информация про commonizer в K/N.

А еще у нас есть twitter - @KotlinMPP, где публикуется информация прямиком с KotlinKonf, а так же новости по мобильной мультиплатформе.

#news
Начнем разбор выступлений с kotlinconf по mobile kotlin multiplatform. Каждый день будет по 2 выступления, что позволит тем, кто не смотрел трансляцию, ознакомиться, не перегружая себя информацией.

Главный доклад первого дня - Kotlin/Native Concurrency explained. Про самую горячую тему в Kotlin/Native - многопоточность.

Разобрано:
- Правила многопоточности K/N;
- Worker API;
- Illegal transfer state - что это и почему возникает;
- Заморозка объектов (freeze);
- InvalidMutabilityException - что это и в каких случаях возникает;
- ThreadLocal и SharedImmutable аннотации;
- Зачем нужен ensureNeverFrozen и где его можно использовать;
- AtomicReference и прочие Atomic***;
- DetachedObjectGraph;
- multithreaded coroutines (спикер уже попробовал сам текущую дев версию корутин с многопоточностью).

Все разобрано с наглядными и понятными примерами, показаны неочевидные кейсы.

Выступление обязательно к ознакомлению всем, кто интересуется multiplatform. Примеры кода из выступления доступны на github.

Второе выступление - Shipping multiplatform on iOS & Android. Опыт добавления мультиплатформы в Square (CashApp) и AutoDesk (PlanGrid) - продуктов с миллионами пользователей.

Рассказ включает:
- Что именно ушло в общую библиотеку (бизнеслогика, синхронизация данных, оффлайн режим, поиск);
- Почему выбрали KMP;
- Как работается с value type (например структуры, которых в iOS API много);
- Чем отличается Garbage Collector Kotlin/Native от GC JVM;
- Какое соотношение кода в common и platform-specific;
- Сетевое взаимодействие не через ktor-client;
- MPP freeze;
- Работа с крешами в Worker'ах;
- Варианты хранения кода в репозиториях при работе с общей библиотекой (монореп, копипаст, выделенный репозиторий с общей библиотекой).

Тоже годный доклад, который скорей всего даст вам новых знаний.

#videos
Effective Kotlin-Swift interoperability - про особенности на стыке Kotlin и Swift.

В выступлении:
- Синглтоны;
- Разные примитивы (int32, int64, ...);
- Автоматическое добавление _ в пересекающиеся имена функций/аргументов;
- Особенности с enum, sealed class;
- Поддержка Generic'ов;
- Value types;
- Build perfomance;
- Runtime perfomance;
- Доступные библиотеки с поддержкой iOS.

Рекомендую всем, кто использует Kotlin Framework из Swift кода.

#videos
Kotlin multiplatform - past, present, future - какой путь уже прошла мультиплатформа и что планируется в будущем.

Часть выступления это история развития, с какими проблемами сталкивалась команда, а так же пример - как выглядит мультиплатформа сейчас (снаружи и внутри).

Описана идея hierarhical multiplatform projects и зачем это нужно, а так же почему это так долго и тяжело реализуется.

На примере posix показали ад мультиплатформы (разница API в мелких деталях увеличивается с каждой подключенной платформой) и инструмент, который должен решить задачу шаринга платформенных библиотек - Commonizer (про этот инструмент так же рассказывал Дмитрий Доловов на Kotlin/Everywhere Nsk). А так же задели упрощение работы с зависимостями через gradle metadata (об этом более детально говорил Илья Матвеев так же на Kotlin/Everywhere Nsk).

На будущее планируют больше обучающих материалов и больше кейсов что и как шарилось (начали с mobile) и улучшать экосистему инструментов.

Выступление несет мало технических деталей и расчитано на массовую аудиторию для ознакомления, чего-либо нового не несет (упоминание commonizer'а только, но не детально - детали есть в выступлении с Kotlin/Everywhere Nsk).

#videos
Kotlin Multiplatform in action: more than 10 projects for iOS and Android with shared code - наше (IceRock) выступление.

В выступлении:
- Как вводили MPP в работу;
- Как масштабировали на всю компанию (хронологически);
- Что вынесли в опенсорс из внутренних разработок компании (moko библиотеки);
- Показали moko-widgets в работе, на нескольких примерах. Библиотека позволяет построить все приложение из общего кода (сейчас тестируется внедрением в боевой проект).

Так же есть запись live-coding'а с использованием moko-widgets на примере более старой версии библиотеки.

#videos #libs
Your Multiplatform Kaptain has Arrived - Careem делятся деталями о использовании Kotlin Multiplatform.

25k строк расшаренного кода, год в продакшене на Android и 7 месяцев на iOS. 5 iOS и 11 Android разработчиков в команде.

Решились на переписывание бизнес-логики, на Kotlin, на новой архитектуре (MVI).

Сначала попробовали добавление iOS платформы через переписывание kotlin в swift код, но это не удалось поддерживать в дальнейшем, поэтому пошли в KMP.

Что поняли:
1. Нужно избегать Android Driven Development (iOS разработчики должны так же принимать участие в разработке общей логики, чтобы лучше понимать что и как делается в приложении и получать оптимальный для обеих платформ API);
2. Общение команд Android и iOS должно быть плотнее, чем при чистой нативной разработке, мерж реквесты должны проверяться представителями обеих платформ, большие фичи должны обсуждаться сообща;
3. Разработка общей библиотеки требует иного понимания разработки приложения.
4. Шарить между платформами то, что комфортно шарить для обеих платформ.

Так же упомянуты некоторые технические особенности, например изменение имен классов при дублировании, экспорт классов из зависимостей в фреймворк. А так же что потерялось из-за интеропа с ObjC, вместо Swift.

В конце зачитан стих посвященный kotlin mpp, это надо видеть :)
Не только конец надо видеть, а все выступление - оно достаточно информативное.

#videos
I walk the line - What parts of an app should be in Kotlin/Native - and what parts shouldn't? - опыт разработки небольшого проекта с шарингом кода между Android и iOS.

В выступлении:
- Чем отличается Kotlin от обычной кроссплатформы;
- Выбор архитектуры;
- Интеграция с swift ui;
- Генерация цветов из общего описания для android и iOS ресурсов;
- Мнение когда имеет смысл использовать Kotlin/Native.

Код проекта доступен на github. Действительно интересная была часть про генерацию цветов и про стык с swift ui (но там немного).

#videos
Kotlin in Space - использование kotlin в новом проекте JetBrains - Space. Kotlin там везде.

В выступлении:
- Kotlin на мобилках, фронте, бекенде, плагинах к IDEA;
- Шарили data model, view model, валидацию, утилсы и т.д.;
- Не шарили UI и Storage;
- Exposed для работы с DB;
- Ktor для client-server взаимодействия;
- WebSocket RPC на базе Ktor;
- Документирование Rest API;
- Kotlin-React для фронта;
- Тесты;
- Система автоматизации (заявленная поддержка kotlin-script для своих кастомных операций в Space).

Стоит посмотреть, чтобы увидеть возможности kotlin multiplatform в масштабном проекте.

#videos