iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0

Keyword: KMM Gradle,Kotlinx serialization

到Day9使用Kotlin DSL 管理依賴的Code放在
KMMDay9


我們要進行網路請求,以往在iOS上可能使用Maya,Android上使用Retrofit居多.
但Retrofit與Maya都不能給另外一個平台使用,所以需要為了各平台去獨立寫一份網路請求的程式碼.
而在KMM這邊,藉由官方提供的網路框架Ktor,可以實現雙平台共用同一份Code,進而減少開發成本.
我們將要學習如何去使用Ktor,不過在這之前,必須先引入Ktor,而這其中也有不少的眉角

什麼是Ktor

這是由JetBrain推出的框架Ktor,用於Web api開發與測試,而且Kotlin常用的Coroutine,DSL等等的特性,也有支援.利用Kotlin的跨平台特性,可以輕易地開發出不同版本使用.

對於我們Client端,也有特別開發出支援各Client端的支援,讓前後端都能在一個框架下進行溝通.

(在我剛開始學習KMM的時一直被官網的介紹所誤導,以為Ktor只有提供後端開發,

後來詢問Kotlin官方技術傳教士聖佑後,才了解到Client端也有一份專屬的內容)

Gradle 與依賴

要使用Ktor,就需要在Gradle內聲明依賴關係,如果是Android開發者應該對此熟悉.Gradle有許多功能,負責管理編譯流程,管理第三方庫使用,調整參數等等的.

這次主要是使用到依賴管理的功能.這也是gradle最常使用的部分

KMM的架構稍微複雜,在這個剛建起來的KMM專案內,build.gradle就有三個.分別是:

https://github.com/officeyuli/itHome2021/raw/main/day8/gradle.jpg

  1. 整個專案一起共用的build.gradle.kts(藍色)
  2. Shared部分使用的build.gradle.kts(紅色)
  3. android部分獨自使用的build.gradle.kts(綠色)

這三個Gradle負責管理不同的依賴,放錯位置可能會發生摸不著頭緒的問題.
以後會稱之為gradle(project) / gradle(shared) / gradle(android) 來分別代表這三個Gradle
要能夠成功使用ktor,這幾個gradle都需要做不同程度的修改,讓我們開始吧.

Ktor的依賴

由於Ktor是使用在共用的網路請求,這個網路請求通常不會因為平台不同而改變,所以首要修改的就是shared內的gradle,讓雙平台一起共用的部分.找到gradle(shared)內的sourceSets.

sourceSets分別管理各區塊的依賴,commonMain / androidMain / iosMain分別對應著 共通 / android專用 / iOS專用

而如果在建立專案時有選擇"建立預設test檔案",還會多出commonTest/ androidTest/ iosTest,看名字就能知道分別是 共通測試 / android專用測試 / iOS專用測試

在不同的區塊設定補上以下內容,通常來說,如果和平台沒有關係的功能就會在common引入,而和平台實作有關係的就會分別到各平台的模塊中.

sourceSets{
	val ktor_version = "1.6.3"
	val commonMain by getting {
        dependencies {
			...
			implementation("io.ktor:ktor-client-core:${ktor_version}" )
            implementation("io.ktor:ktor-client-json:${ktor_version}")
            implementation("io.ktor:ktor-client-logging:${ktor_version}")
            ...
        }
	}
	...
	val androidMain by getting {
      dependencies{
			...
            implementation("io.ktor:ktor-client-okhttp:${ktor_version}")
			...
        }
  }
...
	val iosMain by getting {
      dependencies{
			...
            implementation("io.ktor:ktor-client-ios:${ktor_version}")
			...
        }
  }
}

(注意:預設專案有些部分的getting後面沒有大括弧,需要自己補上大括弧以及"dependencies"字眼)

Kotlinx serialization的依賴

除了網路請求的框架,我們還需要把網路請求的回傳轉換成object,一般來說是使用Gson比較多,不過這次我們換換口味,使用Kotlin官方推出的Kotlinx serialization進行解析,Kotlinx serialization 不僅支援多平台,完美符合我們的需求.且由於不是使用反射進行序列化,因此可以提供更快速的效能.甚至還能支援protobuff格式.

要使用到Kotlinx serialization 同樣的,也需要在多個地方修改

首先是整個專案的gradle(project),在buildScript內補上Kotlinx serialization的來源

buildscript {
    repositories {
       ...
    }
    dependencies {
        val serialization_version = "1.5.21"
        ...
        classpath("org.jetbrains.kotlin:kotlin-serialization:$serialization_version")
    }
}

再來是共通部分的gradle(shared),除了在共通部分加入的依賴以外,plugin的地方也要加入Kotlinx serialization的plugin,才能在編譯時產生對應物件.

plugins {
    ...
    id("kotlinx-serialization")
    ...
}

sourceSets {
    ...
        val ktor_version = "1.6.3"
    ...
        val commonMain by getting {
           dependencies {
            ...
	        implementation("io.ktor:ktor-client-serialization:${ktor_version}")
	        ...
            }
        }
      ...
    }

由於KMM的區塊相當多元,所以需要在不同的Gradle裡面放入不同的依賴,一開始的時候會搞不大清楚這個依賴要放在哪裡,但是只要根據依賴的作用,就能了解所需要修改的位置

今天先把基礎依賴建好了,但是實際上使用這樣會很難管理版本,尤其在專案變大,或是像KMM這樣有多平台的專案.就更為複雜.所以明天我們先學習如何使用Kotlin DSL來管理依賴


上一篇
Day 7:How do you turn this on? KMM是如何做到的?
下一篇
Day 9: Kotlin DSL 管理雜亂依賴的好幫手
系列文
挑戰 Kotlin Multiplatform Mobile 跨平台開發,透過共同的Kotlin模組同時打造iOS與Android應用!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言