Kotlin 實戰指南 | 如何在大型應用中新增 Kotlin
作者 / 宋立心 (Tiem Song), Android 軟體工程師
每次參加開發者大會,開發者最常問我的一個問題就是: "我該如何在現有 Android 應用中新增 Kotlin? 最好的方法是什麼?" 如果您工作的團隊規模較大,轉於用新的開發語言確實會比較複雜。漸漸的,我給的迴應越來越詳細,而且也會根據其他開發者的心得體會 (Google 內部和外部均有) 以及我自己用 Kotlin 的實際經驗調整我的答案。
以下提供的指南針對於幫助大型團隊在現有應用中介紹如何使用 Kotlin。Google 內部有不少團隊,列如 Android 開發者關係團隊,已經成功使用了這些指導方針。典型的兩個例子是:一,完全用 Kotlin 重新程式設計的 2018 Google
2018 Google I/O 應用:
https://github.com/google/iosched
Plaid:
https://github.com/nickbutcher/plaid
如何在應用中新增 Kotlin
團隊內指定一位 Kotlin 推廣者
首先,您應該從團隊中選一位同學來擔任 Kotlin 專家和導師的角色。這位一般不難找,他/她往往是團隊裡對 Kotlin 最感興趣的。正在閱讀這篇的您很可能就是那位吧! 推廣者應該儘可能多的學習 Kotlin 語言,同時探索在現有應用中利用 Kotlin 的最佳方法。也鼓勵這位同學除了積極分享 Kotlin 相關知識,為隊友答疑解惑之外,也參與到 Java 和 Kotlin 的程式碼審查工作中,確保變更後的程式碼符合 Kotlin 規範,並保障兩種語言之間的可互操作性 (如可空性註解)。
學習基礎知識
在推廣者負責深入鑽研的同時,其他同學應該掌握一定的基本知識。現在有許多適合 Kotlin 新團隊的學習資源,讓團隊在熟悉語言的同時,瞭解 Kotlin 與 Android 的互動機制。我個人比較喜歡從 Kotlin Koans 入門,通過一系列程式設計練習逐步掌握 Kotlin 的主要語言特性,邊練邊學,趣味無限。
Kotlin Koans:
https://kotlinlang.org/docs/tutorials/koans.html
前往 Kotlin 官方網站檢視參考文件,學習 Kotlin 標準庫的使用方法,或者按照分步教程,瞭解如何使用 Kotlin 完成不同的任務。此外,Android 開發者網站中還有不少的
Kotlin 標準庫:
http://kotlinlang.org/api/latest/jvm/stdlib/index.html
參考文件:
http://kotlinlang.org/docs/reference/
Kotlin 學習資源:
https://developer.android.google.cn/kotlin/index.html
組建學習小組
當團隊能夠使用基本 Kotlin 程式設計後,就可以開始組建學習小組。由於 Kotlin 發展速度較快,諸如 Coroutines 和 Multiplatform 一類的新特性層出不窮,通過定期舉行小組討論,可以一邊學習新的語言特性,一邊鞏固 Kotlin 在公司內部的最佳實踐。
Coroutines:
https://kotlinlang.org/docs/reference/coroutines.html
Multiplatform:
https://kotlinlang.org/docs/reference/multiplatform.html
使用 Kotlin 編寫測試程式碼
在聊到專案實戰開發時,許多團隊表示用 Kotlin 編寫測試是個不錯的切入口,因為這既不會影響到生產程式碼,又不會把 Kotlin 程式碼捆綁到應用包中。團隊可以選擇用 Kotlin 編寫新測試,或者將現有測試轉換成 Kotlin 程式碼。測試對於檢查程式碼迴歸很有用,並且在重構程式碼時會增加一定的置信度。在將現有 Java 程式碼轉成 Kotlin 時,您會發現這些測試尤為有效。
使用 Kotlin 寫新程式碼
在轉換現有 Java 程式碼至 Kotlin 時,可以嘗試向現有應用的程式碼中新增一些小段的 Kotlin 程式碼:從小型類或者頂層輔助函式著手在 Kotlin 程式碼中新增相關註釋,以確保與 Java 程式碼的正確互操作性。
註釋:
https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html
Kotlin 對 APK 體積以及構建情況的影響
新增 Kotlin 程式碼後,應用的 APK 體積大小和構建時間可能會有所增加。您可以使用 Proguard 對 APK 進行釋出前優化,從而最大程度減少輸出檔案指令碼的增量。執行 Proguard 後,Kotlin 對 APK 體積的影響應該很小,尤其是當您開始使用 Koltin 的階段。
Proguard:
https://developer.android.google.cn/studio/build/shrink-code
在純 Kotlin 專案和混合語言專案中 (Java 和 Kotlin 混用) ,編譯時間會稍微拖長。但是,不少開發者認為 Kotlin 帶來的效率提升可以有效彌補增加的時間成本。構建是開發專案中很關鍵的一步,Kotlin 和 Android 團隊已經知道它的嚴重性,正在努力改進此項流程,爭取縮短構建時間。建議您在開發過程中,監控和測量構建情況對專案造成的影響。
將現有程式碼更新為 Kotlin 程式碼
一旦團隊順利上手 Kotlin 後,您可以著手將現有程式碼轉換至 Kotlin。
比較極端的做法是從頭開始,用 Kotlin 重寫一遍應用程式碼。我們在開發 2018 Google I/O 應用時,採取的就是這個策略。但是該方法對於大部分團隊並不適用,因為它要求開發者在採用新技術的同時要保證專案的按時發行進行應用遷移。幸好,Kotlin 和 Java 可以完全互相操作,開發者不用直接一次性把整個專案都轉換到 Kotlin 上,可以分佈操作,比如說一次只遷移一個類。
2018 Google I/O 應用:
https://android-developers.googleblog.com/2018/08/google-releases-source-for-google-io.html
比較實際的做法是利用 Android Studio 程式碼轉換器對 Java 檔案中的程式碼進行轉換。或者,您也可以先使用 Java 編寫程式碼,然後再把程式碼複製貼上到 Kotlin 檔案中,最後通過 IDE 將檔案中的 Java 程式碼轉換為 Kotlin 程式碼。轉換器不但能夠節省大量時間,還可以讓您檢視 Kotlin 程式碼在程式碼庫中的情況;自動生成的 Kotlin 程式碼不一定是最佳最優化的程式碼,您可以在此之後仔細審查和修改各個檔案中的程式碼。
請注意,儘管 Kotlin 與 Java 具備 100% 相互操作性,但兩者的原始碼並非完全相容,開發者無法在一個檔案中混合使用兩種語言。建議您在編寫互通程式碼的過程中,參考 Kotlin 指南和 Android 指南。
程式碼轉換器:
https://developer.android.google.cn/studio/projects/add-kotlin#convert-to-kotlin-code
Kotlin 指南:
https://kotlinlang.org/docs/reference/java-interop.html
Android 指南:
https://android.github.io/kotlin-guides/interop.html
說服管理層使用 Kotlin
初步嘗試過 Kotlin 之後,或許您已經打心底裡兒覺得它適合自己的團隊了。但是要怎麼樣才能說服管理層和利益相關方選擇 Kotlin 呢?畢竟他們不像您一樣熱愛資料類、智慧型別轉換還有擴充套件函式。儘管具體的說辭會依情況不同而有所差異,但是我們在下面列舉的論點和資料或許對您會有所幫助:
Kotlin 有助於提升團隊開發效率。通過比較 Kotlin 檔案和 Java 檔案內的平均程式碼行數,您會發現 Kotlin 可以縮減至少 25% 的程式碼行數。寫的程式碼少了,測試和維護的的時間成本就會相應降低,團隊開發新特性的速度自然也就上去了。此外,您還可以觀察一下如果用 Kotlin 和 Java 開發類似的特性,哪種語言的用時會更短。
Kotlin 有助於改善應用質量。除了大家熟知的空安全 (null-safety) 特性以外,Kotlin 還提供了許多其它的安全特性,幫助您避免各種型別的程式碼錯誤。Pinterest 建議開發者在應用程式遷移的過程中,跟蹤記錄每個模組的程式碼錯誤率。您可以發現錯誤率呈下降趨勢。請點選觀看 Android 開發者故事對 Camera360 的專訪,或者閱讀近期學術研究,進一步瞭解 Kotlin 如何提高程式碼質量。
Kotlin 是行業趨勢所在。在 Google Play Top 1000 榜單中,使用 Kotlin 開發的 Android 應用佔比達到 26%,其中包括 Twitter、Pinterest、微信、美國運通卡等超重量級應用。Redmonk 公佈的榜單顯示 Kotlin 是目前發展第二快的的移動平臺程式語言。科技媒體 Dice 也曾發文指出 Kotlin 的相關工作數量呈爆炸式增長。
Kotlin 讓您的團隊更開心。雖然幸福感很難量化,但是您可以通過適當的方式讓管理層體會到團隊對 Kotlin 的熱愛。根據《 StackOverflow 2018 年度開發者調查報告》顯示,Kotlin 是目前第二大最受歡迎的程式語言。
其它的安全特性:
https://proandroiddev.com/kotlin-avoids-entire-categories-of-java-defects-89f160ba4671
近期學術研究:
https://www.theregister.co.uk/2018/08/02/kotlin_code_quality
爆炸式增長:
https://insights.dice.com/2018/09/24/kotlin-jobs-meteoric-rise-android
StackOverflow 2018 年度開發者調查報告:
https://insights.stackoverflow.com/survey/2018#most-loved-dreaded-and-wanted
下一步
有了一定的 Kotlin 實戰經驗後,您一定很好奇要如何在日常開發中運用 Kotlin,為此我們額外準備了一些實用技巧,希望對您有參考價值。
為專案制定程式碼風格規範
《 Kotlin 風格指南》和《 Android Kotlin 風格指南》為確定 Kotlin 程式碼格式提供了很好的建議。您可以在此基之上確立最您適合團隊的編碼規範和習慣用法。
您可以通過以下兩種策略來統一 Kotlin 的程式碼風格: (1) 自定義 Androis Studio 的程式碼風格;(2) 使用 Linter。在 Sunflower 和 Plaid 專案中,我們就使用了 Ktlint 保障程式碼風格的規範性。Ktlint 提供了一系列符合 Kotlin 標準風格指南的預設設定,並且允許開發者根據具體要求進行自定義更改。
Kotlin 風格指南:
https://kotlinlang.org/docs/reference/coding-conventions.html
Android Kotlin 風格指南:
https://android.github.io/kotlin-guides
程式碼風格:
https://www.jetbrains.com/help/idea/copying-code-style-settings.html
Sunflower:
https://github.com/googlesamples/android-sunflower
Plaid: https://github.com/nickbutcher/plaid
Ktlint: https://ktlint.github.io
貴精不貴多
Kotlin 具備很多出色的語言特性,但是在實際運用時,開發者往往把控不好一個 "度",比如過度使用 Kotlin 語法糖,或者在包裹語句時使用太多的 `apply`, `let`, `use` 函式。一般情況下,不建議開發者為了縮短程式碼行數而犧牲了可讀性。我們在開發 Plaid 的時候就規定了每個 `apply` 括號中至少需要包含兩行程式碼。您可以根據具體情況,制定出最適合團隊的編碼規則,然後將其新增至您的風格指南中。
示例專案及案例分析
您可以下拉至文末的 "繼續探索" 板塊,檢視並研究 Kotlin 相關實戰案例,瞭解 Google 如何進行 Kotlin 專案遷移,其它公司又是如何在已有專案中新增 Kotlin 程式碼的。
常見問題
新技術帶來新的疑問。以下我們彙總了一些開發者們在採用 Kotlin 的過程中遇到問題,並附上了對應的解決建議。
應該如何說服其他共事的工程師使用新語言?
之前在 Google I/O 開發者大會上,我和 Kotlin 首席語言設計師 Andrey Breslav 分享過幾個幫助工程師採用 Kotlin 的方法。我們認為最好是採取分步策略,先試著往專案中加入少量 Kotlin 程式碼,然後再觀察情況是否得到改善。如果您最後發現 Kotlin 的缺點多於優點,決定放棄這門語言,Andrey 認為這是完全可以理解的。
Andrey Breslav: https://twitter.com/abreslav
學習 Kotlin 會不會很難?
大多數開發者可以輕鬆上手 Kotlin。資深的 Java 開發者能夠使用同一套工具進行 Java 和 Kotlin 程式設計。您還可以在 Kotlin 中找到許多與 Ruby 和 Python 相似的語言特性,如方法鏈。
Google 會繼續支援 Kotlin 用於 Android 開發嗎?
當然!Google 會一直為 Kotlin 提供有力支援。
結語
希望本文內容對您和您的團隊有所啟發,幫助您們將 Kotlin 順利新增至應用中。儘管這個過程中不乏挑戰,但是幾乎所有開發者都告訴我,Kotlin 幫他們重新找回了軟體開發的樂趣。
請注意:雖然本文主要是針對 Android 應用進行撰寫的,但是文中提及的概念適用於任何型別的 Java 專案,無論是 Android 移動端應用還是伺服器端。
感謝您閱讀本文,預祝您在 Kotlin 遷移之旅上一路順風!
點選屏末 | 閱讀原文 | 前往 Kotlin 官方文件檢視更多資訊
推薦閱讀