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] A code block, that helps your or client apps reduce redundancy, by using this library / SDK

Slide 7

Slide 7 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 8

Slide 8 text

Rules for Developing SDK

Slide 9

Slide 9 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 10

Slide 10 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 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 1. Should be easy to remove 2. Should not add unnecessary extra dependencies to the client app

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 2. Should not add unnecessary extra dependencies to the client app 3. Interaction should be straightforward for the client

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 3. Interaction should be straightforward for the client 4. Data Types should be interoperable

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 4. Data Types should be interoperable 5. [Optional] Should allow client apps to implement own UI

Slide 15

Slide 15 text

Building an SDK

Slide 16

Slide 16 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 17

Slide 17 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 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 Android, iOS 2x

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, iOS, Web 3x

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, Web, tvOS ~4x

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, tvOS, Tizen & WebOS [HTML5 TV] ~5x

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, Tizen & WebOS [HTML5 TV], WatchOS, WearOS ~7x

Slide 23

Slide 23 text

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

Slide 24

Slide 24 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 25

Slide 25 text

Current Solutions for Sharing Code across Platforms

Slide 26

Slide 26 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 27

Slide 27 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 28

Slide 28 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 29

Slide 29 text

Why Kotlin Multiplatform [KMP/KMM]

Slide 30

Slide 30 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 31

Slide 31 text

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

Slide 32

Slide 32 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 33

Slide 33 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 34

Slide 34 text

Understanding Kotlin Multiplatform [KMP/KMM]

Slide 35

Slide 35 text

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

Slide 36

Slide 36 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 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] The Structure jsMain import uuid actual fun getRandomUUID(): String = uuid.v4().toString()

Slide 43

Slide 43 text

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

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] The Structure Dependency Management val iosMain by getting { dependencies { implementation(libs.ktor.client.darwin) implementation(libs.sqlDelight.native) } }

Slide 47

Slide 47 text

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

Slide 48 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] The Structure Exported SDK files Android .aar iOS .xcframework JS Minified js / NPM

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] The Structure Setting up Distribution kmmbridge { spm() mavenPublishArtifacts() versionPrefix.set(SDKConfig.version) frameworkName.set(SDKConfig.sdkName) } https://kmmbridge.touchlab.co

Slide 51

Slide 51 text

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

Slide 52 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] The Structure 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, } @JsExport object UserTypeJS { val User = UserType.User val Admin = UserType.Admin }

Slide 53

Slide 53 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 54

Slide 54 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 55

Slide 55 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] Using the bundle in JS

Slide 56

Slide 56 text

🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] Using the XCFramework in iOS

Slide 57

Slide 57 text

IDEs and Tools

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

Thank You Rivu Chakraborty 🌐https://www.rivu.dev/ youtube.com/@rivutalks @rivuchakraborty @[email protected] https://courses.rivu.dev/