Kotlin 實戰指南 | 如何在大型應用中添加 Kotlin

做者 / 宋立心 (Tiem Song), Android 軟件工程師


每次參加開發者大會,開發者最常問個人一個問題就是: "我該如何在現有 Android 應用中添加 Kotlin? 最好的方法是什麼?" 若是您工做的團隊規模較大,轉於用新的開發語言確實會比較複雜。漸漸的,我給的迴應愈來愈詳細,並且也會根據其餘開發者的心得體會 (Google 內部和外部均有) 以及我本身用 Kotlin 的實際經驗調整個人答案。html


如下提供的指南針對於幫助大型團隊在現有應用中介紹如何使用 Kotlin。Google 內部有很多團隊,列如 Android 開發者關係團隊,已經成功使用了這些指導方針。典型的兩個例子是:一,徹底用 Kotlin 從新編程的 2018 Google I/O 應用;二,混合 Java 和 Kotlin 來編程的 Plaid。java

  • 2018 Google I/O 應用: android

    https://github.com/google/ioschedios

  • Plaid: git

    https://github.com/nickbutcher/plaidgithub


如何在應用中添加 Kotlin編程

團隊內指定一位 Kotlin 推廣者api

首先,您應該從團隊中選一位同窗來擔任 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 學習資源,包括 31 天的 Kotlin 系列,值得好好探索一番。

  • 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 遷移之旅上一帆風順!

相關文章
相關標籤/搜索