Команда SuperAwesome разработала мобильное приложение Rukkaz для видео стримингового сервиса с использованием kotlin multiplatform. Про это они рассказали в своей статье – How we developed our new video platform Rukkaz as a cross-platform mobile app.
Само приложение можно скачать и посмотреть:
iOS
Android
Немного поглядев внутри apk, можно заметить, что используется как минимум ktor-client и coroutines, а это подсказывает что в общей библиотеке находится как минимум сетевой слой.
#cases #posts
Само приложение можно скачать и посмотреть:
iOS
Android
Немного поглядев внутри apk, можно заметить, что используется как минимум ktor-client и coroutines, а это подсказывает что в общей библиотеке находится как минимум сетевой слой.
#cases #posts
Medium
How we developed our new video platform Rukkaz as a cross-platform mobile app
While developing natively for iOS and Android we realised we were writing the same functionalities twice. So we stopped.
Для упрощения поиска и подключения библиотек к kotlin проектам (и multiplatform в том числе) JetBrains выпустили плагин Package Search. Он позволяет прямо в конфигурации gradle запустить генерацию кода подключения зависимости с поиском нужной зависимости прямо в IDE. Цель – упростить поиск библиотек по примеру опыта NuGet.
На данный момент вышла EAP версия и нам доступно:
- Поддержка только groovy gradle (kotlin dsl в планах);
- Поиск по модулям, опубликованным на mavenCentral (в дальнейшем планируют расширить количество репозиториев);
- Индексация автоматическая – автору библиотеки не надо специально куда-то добавлять самому (но надо на поддерживаемый репозиторий залить – сейчас mavenCentral);
- В списке библиотек сразу выводится пометка о поддержке multiplatform;
- В multiplatform библиотеках перечисляются все поддерживаемые таргеты;
- Индексируется и информация с github - ссылка на репозиторий, звезды, форки, ридми, лицензия и прочее.
Пока не понятно как это будет работать с объявлением зависимостей в buildSrc, а так же для удобства работы с Kotlin/Native очень не хватает информации о версии kotlin, которую поддерживает выбранная версия библиотеки. А лучше и фильтры по версии, чтобы не искать среди кучи библиотек какая поддерживает используемую на проекте версию котлина.
#news
На данный момент вышла EAP версия и нам доступно:
- Поддержка только groovy gradle (kotlin dsl в планах);
- Поиск по модулям, опубликованным на mavenCentral (в дальнейшем планируют расширить количество репозиториев);
- Индексация автоматическая – автору библиотеки не надо специально куда-то добавлять самому (но надо на поддерживаемый репозиторий залить – сейчас mavenCentral);
- В списке библиотек сразу выводится пометка о поддержке multiplatform;
- В multiplatform библиотеках перечисляются все поддерживаемые таргеты;
- Индексируется и информация с github - ссылка на репозиторий, звезды, форки, ридми, лицензия и прочее.
Пока не понятно как это будет работать с объявлением зависимостей в buildSrc, а так же для удобства работы с Kotlin/Native очень не хватает информации о версии kotlin, которую поддерживает выбранная версия библиотеки. А лучше и фильтры по версии, чтобы не искать среди кучи библиотек какая поддерживает используемую на проекте версию котлина.
#news
Скорей всего уже всем известно, что для работы с сетью в kotlin multiplatform доступна библиотека ktor. С ее помощью мы можем выполнять любые http запросы.
Если рассмотреть более специализированные решения, типа библиотек для REST API, то можно вспомнить про генерацию кода для ktor-client в moko-network из OpenAPI (Swagger) спецификации.
Еще помимо REST API есть популярный подход - GraphQL. И для этого тоже есть готовое решение - kgql позволяет из gql спецификации сгенерировать код для kotlinx.serialization, а далее останется только написать код вызова запроса (endpoint'ов то у graphql обычно как раз не много).
#libs
Если рассмотреть более специализированные решения, типа библиотек для REST API, то можно вспомнить про генерацию кода для ktor-client в moko-network из OpenAPI (Swagger) спецификации.
Еще помимо REST API есть популярный подход - GraphQL. И для этого тоже есть готовое решение - kgql позволяет из gql спецификации сгенерировать код для kotlinx.serialization, а далее останется только написать код вызова запроса (endpoint'ов то у graphql обычно как раз не много).
#libs
GitHub
GitHub - ktorio/ktor: Framework for quickly creating connected applications in Kotlin with minimal effort
Framework for quickly creating connected applications in Kotlin with minimal effort - ktorio/ktor
На каком этапе знакомства с kotlin multiplatform (в контексте мобильной разработки) вы находитесь?
Anonymous Poll
17%
Не интересовался до этого, сейчас стало интересно
50%
Просто интересуюсь, бывает читаю статьи
6%
Пробую сам в своих домашних проектах, все ок
11%
Попробовал сам, столкнулся с проблемами
4%
Пробуем на работе и обсуждаем возможное внедрение в активный проект
2%
Попробовали на работе и отказались
5%
Интегрируем в существующий активный проект
6%
Разрабатываем новые проекты на этой технологии
Опрос показал, что половина участников пока только знакомится с информацией и статьями, но не пробовали kotlin multiplatform в разработке мобильных приложений.
На грядущие выходные есть полезные материалы для этой половины:
1. На github доступен шаблон проекта moko-template, который позволяет быстро начать разработку мобильного приложения с mpp внутри, имеет подключенные moko-библиотеки и пример из пары фич (архитектура проекта многомодульная, что положительно сказывается на времени пересборки ios-таргета);
2. В дополнение к moko-template доступны codelab'ы, в которых разобрано создание приложения просмотра списка GIF'ок на основе moko-template;
3. На kmp.icerock.dev можно найти множество ссылок на полезные статьи, важные блоки документации kotlin про mpp, полезные библиотеки как официальные так и от сообщества, проекты примеры.
Надеюсь эти материалы помогут вам попробовать технологию и упростят изучение.
Ошибки/предложения по можно писать в issues на github (moko-template, codelabs, kmp).
#tips
На грядущие выходные есть полезные материалы для этой половины:
1. На github доступен шаблон проекта moko-template, который позволяет быстро начать разработку мобильного приложения с mpp внутри, имеет подключенные moko-библиотеки и пример из пары фич (архитектура проекта многомодульная, что положительно сказывается на времени пересборки ios-таргета);
2. В дополнение к moko-template доступны codelab'ы, в которых разобрано создание приложения просмотра списка GIF'ок на основе moko-template;
3. На kmp.icerock.dev можно найти множество ссылок на полезные статьи, важные блоки документации kotlin про mpp, полезные библиотеки как официальные так и от сообщества, проекты примеры.
Надеюсь эти материалы помогут вам попробовать технологию и упростят изучение.
Ошибки/предложения по можно писать в issues на github (moko-template, codelabs, kmp).
#tips
GitHub
GitHub - icerockdev/moko-template: Template project of a Mobile (Android & iOS) Kotlin MultiPlatform project with the MOKO libraries…
Template project of a Mobile (Android & iOS) Kotlin MultiPlatform project with the MOKO libraries and modularized architecture - icerockdev/moko-template
Советы из опыта
suspend-функции в публичном интерфейсе библиотеки, которая компилируется в iOS framework, автоматически стираются. Это происходит потому что в objective-c (и swift) нет аналога suspend-функций. По этой причине рекомендуется держать всю работу с kotlin-coroutines внутри kotlin.
Если же требуется вызывать suspend-функцию из swift/objective-c, то можно в ios-specific коде сделать экстеншен-функцию принимающую callback, а внутри функции запускать корутину например на GlobalScope. При чем это можно делать не вручную, а использовать плагин, генерирующий такую функцию автоматически, например - Recast, kotlin-native-suspend-function-callback.
#tips
suspend-функции в публичном интерфейсе библиотеки, которая компилируется в iOS framework, автоматически стираются. Это происходит потому что в objective-c (и swift) нет аналога suspend-функций. По этой причине рекомендуется держать всю работу с kotlin-coroutines внутри kotlin.
Если же требуется вызывать suspend-функцию из swift/objective-c, то можно в ios-specific коде сделать экстеншен-функцию принимающую callback, а внутри функции запускать корутину например на GlobalScope. При чем это можно делать не вручную, а использовать плагин, генерирующий такую функцию автоматически, например - Recast, kotlin-native-suspend-function-callback.
#tips
Android Framework накладывает на android-разработчика множество ограничений из-за сложного жизненного цикла компонентов системы:
- Activity пересоздаются при поворотах экрана, при смене языка системы, что не происходит на iOS.
- Приложение может быть выключено системой почти в любой момент из-за нехватки памяти, но когда пользователь решит вернуться в приложение через "карусель" приложений - он должен попасть туда же, где и был (и фреймворк предлагает специальные механизмы под это).
Для передачи данных между пересозданиями Activity (или просто при переходе на новый экран) часто используется Parcelable - специальный механизм сериализации данных, разработанный для android. И android-разработчики часто его используют, а потому и в multiplatform библиотеке отказаться от него не хотелось бы. Об этом и пишет Ankush Gupta в своей статье - Using @Parcelize in Kotlin Multiplatform.
А для тех, кто хотел бы подключить себе готовую реализацию в проект - есть moko-parcelize.
#posts #libs
- 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
Что доступно:
* Работа с датами и временем, с учетом таймзон;
* Работа с таймзонами;
* Работа с периодами и отрезками времени;
* Парсинг строки в дату (включая и нестандартные форматы).
Пока нет:
* Стабильного релиза (сейчас активная фаза разработки с SNAPSHOT'ами);
* Форматирование даты в строку.
#libs
GitHub
GitHub - erikc5000/island-time: A Kotlin Multiplatform library for working with dates and times
A Kotlin Multiplatform library for working with dates and times - erikc5000/island-time
Kaskade - еще одна библиотека с архитектурными компонентами. Позволяет реализовывать unidirectional data flow.
Поддерживается последняя версия kotlin - 1.3.50, платформы JVM, iOS, JS. Имеет интеграции с coroutines, livedata, rxjava.
На примере android приложения разобрана работа с библиотекой в статье Managing states with Kaskade
#libs #posts
Поддерживается последняя версия kotlin - 1.3.50, платформы JVM, iOS, JS. Имеет интеграции с coroutines, livedata, rxjava.
На примере android приложения разобрана работа с библиотекой в статье Managing states with Kaskade
#libs #posts
GitHub
GitHub - gumil/Kaskade: [INACTIVE] Simplifying state management
[INACTIVE] Simplifying state management. Contribute to gumil/Kaskade development by creating an account on GitHub.
Советы из опыта
При компиляции Kotlin в iOS-framework нужно учитывать, что abstract class'ы станут в Objective-C (и Swift) обычными классами. Это происходит из-за того, что в Objective-C и Swift нет абстрактных классов. Поэтому Xcode при компиляции никак не проверит реализовал ли разработчик абстрактный метод или нет. Если абстрактный метод останется не реализованным то в рантайме будет выброшено исключение.
Рекомендуется просто не выносить абстрактные классы в публичный интерфейс. Их можно использовать внутри kotlin, а наружу можно выдать интерфейс, который требуется с нативной стороны реализовать.
#tips
При компиляции 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
Поддерживается Android и iOS, работает на актуальной версии Kotlin – 1.3.50, api на базе coroutines.
Помимо того, что библиотеку можно подключить себе в проект, в коде библиотеки можно посмотреть пример использования cinterop для подключения C-library OpenSSL в Kotlin/Native.
#libs
GitHub
GitHub - luca992/kEasySocket
Contribute to luca992/kEasySocket development by creating an account on GitHub.
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 Multiplatform Intro – обзорная презентация о том, что такое Kotlin Multiplatform, какой путь уже был пройден и что, по мнению автора, будет дальше.
Kotlin Multiplatform Libraries – про текущее состояние экосистемы kotlin mpp (что из библиотек есть, чего нет, в чем можно помочь), какие выводы сделаны были по опыту разработки FirestoreKMP (обертка над Firebase Storage для MPP), про ObjC interop (делали проброс Firebase iOS SDK в Kotlin), про крешрепорты в Crashlytics и bugsnap, про публикацию библиотек.
#slides
Speaker Deck
Kotlin Multiplatform Intro
Introduction to Kotlin Multiplatform, at Oredev.
На Kotlin/Everywhere Venezia тоже рассказывают про Kotlin Multiplatform (можно использовать субтитры с автопереводом с итальянского в English - получается адекватный перевод).
В видео есть:
• сравнение с RN, Flutter;
• кратко о устройстве MPP;
• лайвкодинг с примером приложения-расписания для конференции (исходный код доступен на GitHub);
• для приложения был сделан и backend на kotlin, но с ним никакой код не шарится.
Презентация доступна по ссылке.
#videos #samples
В видео есть:
• сравнение с RN, Flutter;
• кратко о устройстве MPP;
• лайвкодинг с примером приложения-расписания для конференции (исходный код доступен на GitHub);
• для приложения был сделан и backend на kotlin, но с ним никакой код не шарится.
Презентация доступна по ссылке.
#videos #samples
YouTube
Kotlin Multiplatform | Kotlin/Everywhere Venezia 2019
ITA: Amanti di Kotlin (ma non solo) a rapporto! L'argomento di questo talk e' Kotlin Multiplatform ed in particolare vedremo come e' possibile creare un'applicazione Android ed iOs che condivide una parte del codice (es. business logic, network, etc.). Ma…
HMRC делятся опытом использования Kotlin Multiplatform в продакшене. Как обычно, приведено сравнение с другими технологиями, что хотелось решить и что получилось.
Из интересного:
* Общая библиотека доступна на github;
* Подключение к iOS производится через Carthage, а на github лежит уже собранный framework для подключения к iOS;
* Логика покрыта юниттестами;
* Android приложение имеет 1,000,000+ установок;
* iOS приложение активно у 550,000 пользователей в месяц (из описания приложения).
Слайды доступны тут.
#videos #slides
Из интересного:
* Общая библиотека доступна на github;
* Подключение к iOS производится через Carthage, а на github лежит уже собранный framework для подключения к iOS;
* Логика покрыта юниттестами;
* Android приложение имеет 1,000,000+ установок;
* iOS приложение активно у 550,000 пользователей в месяц (из описания приложения).
Слайды доступны тут.
#videos #slides
YouTube
Kotlin Multiplatform at HMRC
We were extremely lucky to have a talk by George Herbert from Capgemini where he discussed how Kotlin Multiplatform (KMP) was implemented at HMRC.
During this talk, he talked about the reasons behind the use of KMP and how he made it work with iOS, Android…
During this talk, he talked about the reasons behind the use of KMP and how he made it work with iOS, Android…
На 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
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
GitHub
GitHub - felipehjcosta/chat-app: Chat Multiplatform for Web, Android, iOS and Apple Watch
Chat Multiplatform for Web, Android, iOS and Apple Watch - felipehjcosta/chat-app
Информация для тех кто в Новосибирске:
Мы (IceRock) приглашаем всех Вас на наш первый открытый митап Kotlin/Everywhere, который состоится 24 ноября в лекторий-баре "Поток" (улица Депутатская 46 "СИТИЦЕНТР").
Сбор гостей в 10.00
На митапе выступят:
Илья Матвеев (спикер из JetBrains)
расскажет, как организованы мультиплатформенные проекты с позиции билд-системы.
Дмитрий Доловов (спикер из JetBrains)
поделится опытом, с какими задачами его команда столкнулась и какие решения использовала, чтобы сделать интеграцию Kotlin/Native с платформой возможной.
Андрей Ковалёв
расскажет об использовании KotlinMultiplatform IOS-разработчиком, об особенностях процессах разработки мультиплатформенных проектов, какие преимущества и планы по развитию Kotlin Multiplatform в компании.
Алексей Михайлов
в live-режиме (то есть прямо вместе с аудиторией) реализует небольшое приложение с использованием kotlin multiplatform на обе платформы.
Регистрация обязательна.
Активные участники могут выиграть лицензию на продукцию JetBrains, так что задавайте вопросы и общайтесь со спикерами.
Будем благодарны за шаринг постов:
• vkontakte
• facebook
#events
Мы (IceRock) приглашаем всех Вас на наш первый открытый митап Kotlin/Everywhere, который состоится 24 ноября в лекторий-баре "Поток" (улица Депутатская 46 "СИТИЦЕНТР").
Сбор гостей в 10.00
На митапе выступят:
Илья Матвеев (спикер из JetBrains)
расскажет, как организованы мультиплатформенные проекты с позиции билд-системы.
Дмитрий Доловов (спикер из JetBrains)
поделится опытом, с какими задачами его команда столкнулась и какие решения использовала, чтобы сделать интеграцию Kotlin/Native с платформой возможной.
Андрей Ковалёв
расскажет об использовании KotlinMultiplatform IOS-разработчиком, об особенностях процессах разработки мультиплатформенных проектов, какие преимущества и планы по развитию Kotlin Multiplatform в компании.
Алексей Михайлов
в live-режиме (то есть прямо вместе с аудиторией) реализует небольшое приложение с использованием kotlin multiplatform на обе платформы.
Регистрация обязательна.
Активные участники могут выиграть лицензию на продукцию JetBrains, так что задавайте вопросы и общайтесь со спикерами.
Будем благодарны за шаринг постов:
• vkontakte
#events
icerock.timepad.ru
Kotlin/Everywhere / События на TimePad.ru
24 ноября проводим митап, посвященный разработке на Kotlin - разработка под Android, Kotlin Multiplatform, Kotlin/Native.
Kotlin Multiplatform
Kevin Galligan из Touchlab (автор экспериментальной поддержки generic'ов в kotlin/native) опубликовал несколько презентаций на тему Kotlin Multiplatform. Kotlin Multiplatform Intro – обзорная презентация о том, что такое Kotlin Multiplatform, какой путь уже…
Продолжение поста о презентациях Touchlab.
Для презентации Kotlin Multiplatform Intro опубликовали видео-запись - Kevin Galligan - Intro to Kotlin Multiplatform
#videos
Для презентации Kotlin Multiplatform Intro опубликовали видео-запись - Kevin Galligan - Intro to Kotlin Multiplatform
#videos
Telegram
Kotlin Mobile MultiPlatform Russia
Kevin Galligan из Touchlab (автор экспериментальной поддержки generic'ов в kotlin/native) опубликовал несколько презентаций на тему Kotlin Multiplatform.
Kotlin Multiplatform Intro – обзорная презентация о том, что такое Kotlin Multiplatform, какой путь…
Kotlin Multiplatform Intro – обзорная презентация о том, что такое Kotlin Multiplatform, какой путь…
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/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
Со стороны 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
The JetBrains Blog
Kotlin 1.3.60 Released | The Kotlin Blog
We’re happy to present the new release today, Kotlin 1.3.60. In addition to the quality improvements, this version focuses on:
Optimizing the comparison of inline classes.
Tooling improvements fo
Optimizing the comparison of inline classes.
Tooling improvements fo
Kotlin Multiplatform
Kevin Galligan из Touchlab (автор экспериментальной поддержки generic'ов в kotlin/native) опубликовал несколько презентаций на тему Kotlin Multiplatform. Kotlin Multiplatform Intro – обзорная презентация о том, что такое Kotlin Multiplatform, какой путь уже…
Продолжение поста о выступлениях Kevin Galligan из Touchlab.
Для презентации Kotlin Multiplatform Libraries опубликовано видео выступления.
#videos
Для презентации Kotlin Multiplatform Libraries опубликовано видео выступления.
#videos
Telegram
Kotlin Mobile MultiPlatform Russia
Kevin Galligan из Touchlab (автор экспериментальной поддержки generic'ов в kotlin/native) опубликовал несколько презентаций на тему Kotlin Multiplatform.
Kotlin Multiplatform Intro – обзорная презентация о том, что такое Kotlin Multiplatform, какой путь…
Kotlin Multiplatform Intro – обзорная презентация о том, что такое Kotlin Multiplatform, какой путь…
И из более нового - вчера на событии CocoaHeads Berlin был доклад Kotlin/Native at Careem: Experience Report.
Ребята перевели Android приложение на kotlin и выделили mpp-модуль, чтобы быстрее запустить iOS приложение. Описали, как выстроили у себя процесс работы с Kotlin MPP, в чем увидели плюсы, а что оказалось сложностью.
Приложение, о котором идет речь:
Careem Captain (Android) - 1,000,000+ установок
Careem Captain (iOS)
#slides
Ребята перевели Android приложение на kotlin и выделили mpp-модуль, чтобы быстрее запустить iOS приложение. Описали, как выстроили у себя процесс работы с Kotlin MPP, в чем увидели плюсы, а что оказалось сложностью.
Приложение, о котором идет речь:
Careem Captain (Android) - 1,000,000+ установок
Careem Captain (iOS)
#slides
Speaker Deck
Kotlin/Native at Careem: Experience Report
At Careem we've been using Kotlin/Native to share business logic between iOS and Android apps, it's time to share our experience.