Slide 1

Slide 1 text

Creating SDKs with Kotlin Multiplatform Rivu Chakraborty 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 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 @[email protected] 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 @[email protected] What’s an SDK? 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] Software Development Kit. Library/SDK

Slide 6

Slide 6 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] What’s an SDK? 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] Software Development Kit. Library/SDK

Slide 7

Slide 7 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] What’s an SDK? 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 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 @[email protected] Most Common SDK Use Cases 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] ● 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 @[email protected] 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected]

Slide 11

Slide 11 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] SDK Rules 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 0. Should be Plug and Play

Slide 12

Slide 12 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] SDK Rules 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 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 @[email protected] SDK Rules 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 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 @[email protected] SDK Rules 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 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 @[email protected] SDK Rules 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 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 @[email protected] SDK Rules 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 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 @[email protected] Building an SDK 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] ● 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 @[email protected] Building an SDK 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] ● 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 @[email protected] Building an SDK 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] ● 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 @[email protected] Building an SDK 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] ● 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 @[email protected] Building an SDK 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] ● 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 @[email protected] Building an SDK 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] ● 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 @[email protected] Building an SDK 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] ● 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 @[email protected]

Slide 26

Slide 26 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] Solution? 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] Share Code across all Platforms

Slide 27

Slide 27 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] Solution? 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] Share Code across all Platforms

Slide 28

Slide 28 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] Share Code across all Platforms 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected]

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 @[email protected] Flutter 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] React Native Kotlin Multiplatform C/C++

Slide 31

Slide 31 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] Flutter 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 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 @[email protected] React Native 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 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 @[email protected] 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 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 @[email protected] 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] Too Complicated to work with. Unless necessary. C/C++

Slide 35

Slide 35 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] Kotlin Multiplatform 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 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 @[email protected] 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] ● 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 @[email protected] 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] Kotlin Multiplatform

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] Kotlin Multiplatform 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] ● 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 @[email protected] Current users of KMP 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected]

Slide 42

Slide 42 text

Understanding Kotlin Multiplatform [KMP/KMM]

Slide 43

Slide 43 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected]

Slide 44

Slide 44 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] The Structure 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected]

Slide 45

Slide 45 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] The Structure 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 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 @[email protected] 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 @[email protected] The Structure Directory Structure

Slide 48

Slide 48 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] Expect/Actual expect fun getRandomUUID(): String commonMain

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 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 @[email protected] 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 @[email protected] 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 @[email protected] 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 @[email protected] 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 @[email protected] 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 @[email protected] Exported SDK files Android .aar iOS .xcframework JS Minified js / NPM

Slide 58

Slide 58 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 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 @[email protected] 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 @[email protected] 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 @[email protected] 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 @[email protected] 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 @[email protected] 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 @[email protected] Using the bundle in JS

Slide 65

Slide 65 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] 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 @[email protected] 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 @[email protected] https://courses.rivu.dev/