Kotlin Multiplatform
2.62K subscribers
84 photos
3 videos
407 links
Русскоязычный канал новостей о Kotlin Multiplatform
Download Telegram
Android Framework накладывает на android-разработчика множество ограничений из-за сложного жизненного цикла компонентов системы:
- Activity пересоздаются при поворотах экрана, при смене языка системы, что не происходит на iOS.
- Приложение может быть выключено системой почти в любой момент из-за нехватки памяти, но когда пользователь решит вернуться в приложение через "карусель" приложений - он должен попасть туда же, где и был (и фреймворк предлагает специальные механизмы под это).

Для передачи данных между пересозданиями Activity (или просто при переходе на новый экран) часто используется Parcelable - специальный механизм сериализации данных, разработанный для android. И android-разработчики часто его используют, а потому и в multiplatform библиотеке отказаться от него не хотелось бы. Об этом и пишет Ankush Gupta в своей статье - Using @Parcelize in Kotlin Multiplatform.

А для тех, кто хотел бы подключить себе готовую реализацию в проект - есть moko-parcelize.

#posts #libs
Вышла новая библиотека для работы со временем - island-time. Отличается она от существующих multiplatform библиотек тем, что планируется воспроизвести доступный в java.time функционал.

Что доступно:
* Работа с датами и временем, с учетом таймзон;
* Работа с таймзонами;
* Работа с периодами и отрезками времени;
* Парсинг строки в дату (включая и нестандартные форматы).

Пока нет:
* Стабильного релиза (сейчас активная фаза разработки с SNAPSHOT'ами);
* Форматирование даты в строку.

#libs
Kaskade - еще одна библиотека с архитектурными компонентами. Позволяет реализовывать unidirectional data flow.

Поддерживается последняя версия kotlin - 1.3.50, платформы JVM, iOS, JS. Имеет интеграции с coroutines, livedata, rxjava.

На примере android приложения разобрана работа с библиотекой в статье Managing states with Kaskade

#libs #posts
Советы из опыта

При компиляции Kotlin в iOS-framework нужно учитывать, что abstract class'ы станут в Objective-C (и Swift) обычными классами. Это происходит из-за того, что в Objective-C и Swift нет абстрактных классов. Поэтому Xcode при компиляции никак не проверит реализовал ли разработчик абстрактный метод или нет. Если абстрактный метод останется не реализованным то в рантайме будет выброшено исключение.

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

#tips
Для мобильных приложений бывает необходимо постоянно держать связь с сервером для обмена данными (трекинг геолокации, статусов заказов и прочее) и для этого используют socket'ы. Для Kotlin Multiplatform доступна библиотека kEasySocket, которая позволяет из общего кода работать с webscoket'ами.

Поддерживается Android и iOS, работает на актуальной версии Kotlin – 1.3.50, api на базе coroutines.

Помимо того, что библиотеку можно подключить себе в проект, в коде библиотеки можно посмотреть пример использования cinterop для подключения C-library OpenSSL в Kotlin/Native.

#libs
Kevin Galligan из Touchlab (автор экспериментальной поддержки generic'ов в kotlin/native) опубликовал несколько презентаций на тему Kotlin Multiplatform.

Kotlin Multiplatform Intro – обзорная презентация о том, что такое Kotlin Multiplatform, какой путь уже был пройден и что, по мнению автора, будет дальше.

Kotlin Multiplatform Libraries – про текущее состояние экосистемы kotlin mpp (что из библиотек есть, чего нет, в чем можно помочь), какие выводы сделаны были по опыту разработки FirestoreKMP (обертка над Firebase Storage для MPP), про ObjC interop (делали проброс Firebase iOS SDK в Kotlin), про крешрепорты в Crashlytics и bugsnap, про публикацию библиотек.

#slides
На Kotlin/Everywhere Venezia тоже рассказывают про Kotlin Multiplatform (можно использовать субтитры с автопереводом с итальянского в English - получается адекватный перевод).

В видео есть:
• сравнение с RN, Flutter;
• кратко о устройстве MPP;
• лайвкодинг с примером приложения-расписания для конференции (исходный код доступен на GitHub);
• для приложения был сделан и backend на kotlin, но с ним никакой код не шарится.

Презентация доступна по ссылке.

#videos #samples
HMRC делятся опытом использования Kotlin Multiplatform в продакшене. Как обычно, приведено сравнение с другими технологиями, что хотелось решить и что получилось.

Из интересного:
* Общая библиотека доступна на github;
* Подключение к iOS производится через Carthage, а на github лежит уже собранный framework для подключения к iOS;
* Логика покрыта юниттестами;
* Android приложение имеет 1,000,000+ установок;
* iOS приложение активно у 550,000 пользователей в месяц (из описания приложения).

Слайды доступны тут.

#videos #slides
На 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