Slide 1

Slide 1 text

Creating SDKs with Kotlin Multiplatform Rivu Chakraborty 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social https://courses.rivu.dev/

Slide 2

Slide 2 text

● India’s first GDE (Google Developer Expert) for ● More than 11 years in the Industry ● Mobile Architect @ JioCinema ● Previously ○ Byju’s ○ Paytm ○ Gojek ○ Meesho ● Author (wrote multiple Kotlin books) ● Speaker ● Mentor ● Community Person ● YouTuber (?) 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Who am I? 󰞦

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

What’s an SDK?

Slide 5

Slide 5 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social What’s an SDK? 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Software Development Kit. Library/SDK

Slide 6

Slide 6 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social What’s an SDK? 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Software Development Kit. Library/SDK

Slide 7

Slide 7 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social What’s an SDK? 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social A code block, that helps your or client apps reduce redundancy, by using this library / SDK

Slide 8

Slide 8 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Most Common SDK Use Cases 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social ● Analytics ● Chat / Conversation ● Ads ● Image Processing ● Audio-Video Processing

Slide 9

Slide 9 text

Rules for Developing SDK

Slide 10

Slide 10 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social

Slide 11

Slide 11 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social SDK Rules 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 0. Should be Plug and Play

Slide 12

Slide 12 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social SDK Rules 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 0. Should be Plug and Play 1. Should be easy to remove

Slide 13

Slide 13 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social SDK Rules 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 0. Should be Plug and Play 1. Should be easy to remove 2. Should not add unnecessary extra dependencies to the client app

Slide 14

Slide 14 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social SDK Rules 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 0. Should be Plug and Play 1. Should be easy to remove 2. Should not add unnecessary extra dependencies to the client app 3. Interaction should be straightforward for the client

Slide 15

Slide 15 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social SDK Rules 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 0. Should be Plug and Play 1. Should be easy to remove 2. Should not add unnecessary extra dependencies to the client app 3. Interaction should be straightforward for the client 4. Data Types should be interoperable

Slide 16

Slide 16 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social SDK Rules 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 0. Should be Plug and Play 1. Should be easy to remove 2. Should not add unnecessary extra dependencies to the client app 3. Interaction should be straightforward for the client 4. Data Types should be interoperable 5. [Optional] Should allow client apps to implement own UI

Slide 17

Slide 17 text

Building an SDK

Slide 18

Slide 18 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Building an SDK 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social ● Hire / Allocate Developers ● Define Requirements ● Plan Roadmap ● Develop, maintain and test SDK integration ● Cross Check Parity / Consistency across platforms ● Setup SDK release ● Maintain versioning across platforms

Slide 19

Slide 19 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Building an SDK 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social ● Hire / Allocate Developers ● Define Requirements ● Plan Roadmap ● Develop, maintain and test SDK integration ● Cross Check Parity / Consistency across platforms ● Setup SDK release ● Maintain versioning across platforms Android 1x

Slide 20

Slide 20 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Building an SDK 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social ● Hire / Allocate Developers ● Define Requirements ● Plan Roadmap ● Develop, maintain and test SDK integration ● Cross Check Parity / Consistency across platforms ● Setup SDK release ● Maintain versioning across platforms Android, iOS 2x

Slide 21

Slide 21 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Building an SDK 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social ● Hire / Allocate Developers ● Define Requirements ● Plan Roadmap ● Develop, maintain and test SDK integration ● Cross Check Parity / Consistency across platforms ● Setup SDK release ● Maintain versioning across platforms Android, iOS, Web 3x

Slide 22

Slide 22 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Building an SDK 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social ● Hire / Allocate Developers ● Define Requirements ● Plan Roadmap ● Develop, maintain and test SDK integration ● Cross Check Parity / Consistency across platforms ● Setup SDK release ● Maintain versioning across platforms Android, iOS, Web, tvOS ~4x

Slide 23

Slide 23 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Building an SDK 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social ● Hire / Allocate Developers ● Define Requirements ● Plan Roadmap ● Develop, maintain and test SDK integration ● Cross Check Parity / Consistency across platforms ● Setup SDK release ● Maintain versioning across platforms Android, iOS, Web, tvOS, Tizen & WebOS [HTML5 TV] ~5x

Slide 24

Slide 24 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Building an SDK 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social ● Hire / Allocate Developers ● Define Requirements ● Plan Roadmap ● Develop, maintain and test SDK integration ● Cross Check Parity / Consistency across platforms ● Setup SDK release ● Maintain versioning across platforms Android, iOS, Web, tvOS, Tizen & WebOS [HTML5 TV], WatchOS, WearOS ~7x

Slide 25

Slide 25 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social

Slide 26

Slide 26 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Solution? 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Share Code across all Platforms

Slide 27

Slide 27 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Solution? 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Share Code across all Platforms

Slide 28

Slide 28 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Share Code across all Platforms 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social

Slide 29

Slide 29 text

Current Solutions for Sharing Code across Platforms

Slide 30

Slide 30 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Flutter 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social React Native Kotlin Multiplatform C/C++

Slide 31

Slide 31 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Flutter 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 0. Should be Plug and Play 1. Should be easy to remove 2. Should not add unnecessary extra dependencies to the client app 3. Interaction should be straightforward for the client 4. Data Types should be interoperable 5. [Optional] Should allow client apps to implement own UI

Slide 32

Slide 32 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social React Native 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 0. Should be Plug and Play 1. Should be easy to remove 2. Should not add unnecessary extra dependencies to the client app 3. Interaction should be straightforward for the client 4. Data Types should be interoperable 5. [Optional] Should allow client apps to implement own UI

Slide 33

Slide 33 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 0. Should be Plug and Play 1. Should be easy to remove 2. Should not add unnecessary extra dependencies to the client app 3. Interaction should be straightforward for the client 4. Data Types should be interoperable 5. [Optional] Should allow client apps to implement own UI ✓ C/C++

Slide 34

Slide 34 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Too Complicated to work with. Unless necessary. C/C++

Slide 35

Slide 35 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Kotlin Multiplatform 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 0. Should be Plug and Play 1. Should be easy to remove 2. Should not add unnecessary extra dependencies to the client app 3. Interaction should be straightforward for the client 4. Data Types should be interoperable 5. [Optional] Should allow client apps to implement own UI ✓

Slide 36

Slide 36 text

Why Kotlin Multiplatform [KMP/KMM]

Slide 37

Slide 37 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social ● Developed by Jetbrains ● Open Source ● Supported by Google for Android Development ● Supported by Spring for Server ● Has own framework (Ktor) for asynchronous client and server applications ● Has different targets for Different platforms. e.g. Kotlin/JVM, Kotlin/Native, Kotlin/JS, Kotlin/Wasm etc.

Slide 38

Slide 38 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Kotlin Multiplatform

Slide 39

Slide 39 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Kotlin Multiplatform 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Using Kotlin Code in projects to target more than one platform

Slide 40

Slide 40 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Kotlin Multiplatform 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social ● Idiomatic Kotlin Language for all platforms ● Low Risk ○ You decide what to share, what not ○ Option to use existing 3rd party libraries for each platform ● Interoperability ● Consistency across platforms ● Export platform native SDK builds ● Strong Community Support

Slide 41

Slide 41 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Current users of KMP 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social

Slide 42

Slide 42 text

Understanding Kotlin Multiplatform [KMP/KMM]

Slide 43

Slide 43 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social

Slide 44

Slide 44 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social The Structure 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social

Slide 45

Slide 45 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social The Structure 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Common JVM JS Native Android Server Apple Linux mingw iOS tvOS watchOS macOS linux_x64 linux_arm64 mingx64 iosX64 iosArm64 iosSimulatorArm64 tvosX64 tvosArm64 tvosSimulatorArm64 macosX64 macosArm64 watchosX64 watchosArm32 watchosArm64 watchosSimulatorArm64 watchosDeviceArm64

Slide 46

Slide 46 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social The Structure expect fun doSomething() actual fun doSomething() { //Platform specific logic here }

Slide 47

Slide 47 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social The Structure Directory Structure

Slide 48

Slide 48 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Expect/Actual expect fun getRandomUUID(): String commonMain

Slide 49

Slide 49 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Expect/Actual androidMain actual fun getRandomUUID(): String = UUID.randomUUID().toString()

Slide 50

Slide 50 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Expect/Actual iosMain actual fun getRandomUUID(): String = NSUUID().UUIDString()

Slide 51

Slide 51 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Expect/Actual jsMain import uuid actual fun getRandomUUID(): String = uuid.v4().toString()

Slide 52

Slide 52 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Dependency Management val commonMain by getting { dependencies { implementation(libs.bundles.common.ktor) implementation(libs.coroutines.core) implementation(libs.kotlinx.datetime) implementation(libs.koin.core) implementation(libs.skie) } }

Slide 53

Slide 53 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Dependency Management val jsMain by getting { dependencies { implementation(npm("uuid", "9.0.0")) implementation(libs.wire.runtime.js) } }

Slide 54

Slide 54 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Dependency Management val androidMain by getting { dependencies { implementation(libs.ktor.client.okHttp) implementation(libs.okhttp.loggingInterce ptor) implementation(libs.koin.android) implementation(libs.sqlDelight.android) } }

Slide 55

Slide 55 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social val iosMain by getting { dependencies { implementation(libs.ktor.client.darwin) implementation(libs.sqlDelight.native) } } Dependency Management

Slide 56

Slide 56 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Shared Common Code class EventsRepository( private val eventsRemoteDS: EventsRemoteDS, private val eventsLocalDS: EventsLocalDS, ) { suspend fun trackEvent( eventData: EventData, eventName: String, ) { //Logic to track Events ... } }

Slide 57

Slide 57 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Exported SDK files Android .aar iOS .xcframework JS Minified js / NPM

Slide 58

Slide 58 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Setting up iOS Distribution XCFramework val xcFramework = XCFramework("IndiaConferences") listOf( iosX64(), iosArm64(), iosSimulatorArm64(), ).forEach { it.binaries.framework { xcFramework.add(this) baseName = SDKConfig.sdkName } }

Slide 59

Slide 59 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social SPM kmmbridge { spm() mavenPublishArtifacts() versionPrefix.set(SDKConfig.version) frameworkName.set(SDKConfig.sdkName) } https://kmmbridge.touchlab.co Setting up iOS Distribution

Slide 60

Slide 60 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Taking care of Interoperability https://skie.touchlab.co/ data class User @DefaultArgumentInterop.Enabled constructor( val id: String, val firstName: String, val lastName: String, val userType: UserType = UserType.User ) @EnumInterop.Enabled enum class UserType { User, Admin, }

Slide 61

Slide 61 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social https://skie.touchlab.co/ data class User @DefaultArgumentInterop.Enabled constructor( val id: String, val firstName: String, val lastName: String, val userType: UserType = UserType.User ) @EnumInterop.Enabled enum class UserType { User, Admin, } @JsExport object UserTypeJS { val User = UserType.User val Admin = UserType.Admin } Taking care of Interoperability

Slide 62

Slide 62 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Versioning object LibraryConfig { val version = "1.0.0" const val groupId = "dev.rivu.kmp.sdkDemo" const val artifactIdSdk = "core" val sdkName = "demo-sdk" }

Slide 63

Slide 63 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Reducing Size in JS js { browser { dceTask { keep("shared.dev.rivu.MyClass") } binaries.executable() } }

Slide 64

Slide 64 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Using the bundle in JS

Slide 65

Slide 65 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social Using the XCFramework in iOS

Slide 66

Slide 66 text

IDEs and Tools

Slide 67

Slide 67 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social IDEs and Tools

Slide 68

Slide 68 text

Resources ● https://speakerdeck.com/aldefy/a-hitchhikers-guide-to-kotlin-multiplatform ● https://github.com/joreilly/PeopleInSpace ● https://github.com/joreilly/Confetti ● https://kotlinlang.org/docs/multiplatform.html ● https://courses.rivu.dev ● https://leanpub.com/thecomposebook

Slide 69

Slide 69 text

Thank You Rivu Chakraborty 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @rivu@androiddev.social https://courses.rivu.dev/