Kotlin 實戰(zhàn)指南 | 如何在大型應用中添加 Kotlin

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

每次參加開發(fā)者大會凯正,開發(fā)者最常問我的一個問題就是: "我該如何在現(xiàn)有 Android 應用中添加 Kotlin? 最好的方法是什么?" 如果您工作的團隊規(guī)模較大匆骗,轉于用新的開發(fā)語言確實會比較復雜。漸漸的芙贫,我給的回應越來越詳細,而且也會根據(jù)其他開發(fā)者的心得體會 (Google 內部和外部均有) 以及我自己用 Kotlin 的實際經(jīng)驗調整我的答案。

以下提供的指南針對于幫助大型團隊在現(xiàn)有應用中介紹如何使用 Kotlin缎岗。Google 內部有不少團隊亏较,列如 Android 開發(fā)者關系團隊莺褒,已經(jīng)成功使用了這些指導方針。典型的兩個例子是:一雪情,完全用 Kotlin 重新編程的?2018 Google?I/O 應用遵岩;二,混合 Java 和 Kotlin 來編程的Plaid巡通。

如何在應用中添加 Kotlin

團隊內指定一位 Kotlin 推廣者

首先尘执,您應該從團隊中選一位同學來擔任 Kotlin 專家和導師的角色。這位一般不難找宴凉,他/她往往是團隊里對 Kotlin 最感興趣的誊锭。正在閱讀這篇的您很可能就是那位吧! 推廣者應該盡可能多的學習 Kotlin 語言弥锄,同時探索在現(xiàn)有應用中利用 Kotlin 的最佳方法丧靡。也鼓勵這位同學除了積極分享 Kotlin 相關知識,為隊友答疑解惑之外籽暇,也參與到 Java 和 Kotlin 的代碼審查工作中温治,確保變更后的代碼符合 Kotlin 規(guī)范,并保障兩種語言之間的可互操作性 (如可空性注解)戒悠。

學習基礎知識

在推廣者負責深入鉆研的同時熬荆,其他同學應該掌握一定的基本知識。現(xiàn)在有許多適合 Kotlin 新團隊的學習資源绸狐,讓團隊在熟悉語言的同時卤恳,了解 Kotlin 與 Android 的交互機制。我個人比較喜歡從Kotlin Koans入門寒矿,通過一系列編程練習逐步掌握 Kotlin 的主要語言特性突琳,邊練邊學,趣味無限劫窒。

前往 Kotlin 官方網(wǎng)站查看參考文檔本今,學習Kotlin 標準庫的使用方法,或者按照分步教程,了解如何使用 Kotlin 完成不同的任務冠息。此外挪凑,Android 開發(fā)者網(wǎng)站中還有不少的?Kotlin 學習資源,包括?31 天的 Kotlin 系列逛艰,值得好好探索一番躏碳。

組建學習小組

當團隊能夠使用基本 Kotlin 編程后,就可以開始組建學習小組散怖。由于 Kotlin 發(fā)展速度較快菇绵,諸如?Coroutines和?Multiplatform?一類的新特性層出不窮,通過定期舉行小組討論镇眷,可以一邊學習新的語言特性咬最,一邊鞏固 Kotlin 在公司內部的最佳實踐。

使用 Kotlin 編寫測試代碼

在聊到項目實戰(zhàn)開發(fā)時欠动,許多團隊表示用 Kotlin 編寫測試是個不錯的切入口永乌,因為這既不會影響到生產(chǎn)代碼,又不會把 Kotlin 代碼捆綁到應用包中具伍。團隊可以選擇用 Kotlin 編寫新測試翅雏,或者將現(xiàn)有測試轉換成 Kotlin 代碼。測試對于檢查代碼回歸很有用人芽,并且在重構代碼時會增加一定的置信度望几。在將現(xiàn)有 Java 代碼轉成 Kotlin 時,您會發(fā)現(xiàn)這些測試尤為有效萤厅。

使用 Kotlin 寫新代碼

在轉換現(xiàn)有 Java 代碼至 Kotlin 時橄抹,可以嘗試向現(xiàn)有應用的代碼中添加一些小段的 Kotlin 代碼:從小型類或者頂層輔助函數(shù)著手在 Kotlin 代碼中添加相關注釋,以確保與 Java 代碼的正確互操作性祈坠。

Kotlin 對 APK 體積以及構建情況的影響

添加 Kotlin 代碼后害碾,應用的 APK 體積大小和構建時間可能會有所增加矢劲。您可以使用Proguard?對 APK 進行發(fā)布前優(yōu)化赦拘,從而最大程度減少輸出文件腳本的增量。運行Proguard 后芬沉,Kotlin 對 APK 體積的影響應該很小躺同,尤其是當您開始使用 Koltin 的階段。

在純 Kotlin 項目和混合語言項目中 (Java 和 Kotlin 混用) 丸逸,編譯時間會稍微拖長蹋艺。但是,不少開發(fā)者認為 Kotlin 帶來的效率提升可以有效彌補增加的時間成本黄刚。構建是開發(fā)項目中很關鍵的一步捎谨,Kotlin 和 Android 團隊已經(jīng)知道它的嚴重性,正在努力改進此項流程,爭取縮短構建時間涛救。建議您在開發(fā)過程中畏邢,監(jiān)控和測量構建情況對項目造成的影響。

將現(xiàn)有代碼更新為 Kotlin 代碼

一旦團隊順利上手 Kotlin 后检吆,您可以著手將現(xiàn)有代碼轉換至 Kotlin舒萎。

比較極端的做法是從頭開始,用 Kotlin 重寫一遍應用代碼蹭沛。我們在開發(fā)2018 Google I/O 應用時臂寝,采取的就是這個策略。但是該方法對于大部分團隊并不適用摊灭,因為它要求開發(fā)者在采用新技術的同時要保證項目的按時發(fā)行進行應用遷移咆贬。幸好,Kotlin 和 Java 可以完全互相操作帚呼,開發(fā)者不用直接一次性把整個項目都轉換到 Kotlin 上素征,可以分布操作,比如說一次只遷移一個類萝挤。

比較實際的做法是利用 Android Studio?代碼轉換器對 Java 文件中的代碼進行轉換御毅。或者怜珍,您也可以先使用 Java 編寫代碼端蛆,然后再把代碼復制粘貼到 Kotlin 文件中,最后通過 IDE 將文件中的 Java 代碼轉換為 Kotlin 代碼酥泛。轉換器不但能夠節(jié)省大量時間今豆,還可以讓您查看 Kotlin 代碼在代碼庫中的情況;自動生成的 Kotlin 代碼不一定是最佳最優(yōu)化的代碼柔袁,您可以在此之后仔細審查和修改各個文件中的代碼呆躲。

請注意,盡管 Kotlin 與 Java 具備 100% 相互操作性捶索,但兩者的源代碼并非完全兼容插掂,開發(fā)者無法在一個文件中混合使用兩種語言。建議您在編寫互通代碼的過程中腥例,參考Kotlin?指南和?Android?指南辅甥。

說服管理層使用 Kotlin

初步嘗試過 Kotlin 之后,或許您已經(jīng)打心底里兒覺得它適合自己的團隊了燎竖。但是要怎么樣才能說服管理層和利益相關方選擇 Kotlin 呢璃弄?畢竟他們不像您一樣熱愛數(shù)據(jù)類、智能類型轉換還有擴展函數(shù)构回。盡管具體的說辭會依情況不同而有所差異夏块,但是我們在下面列舉的論點和數(shù)據(jù)或許對您會有所幫助:

Kotlin 有助于提升團隊開發(fā)效率疏咐。通過比較 Kotlin 文件和 Java 文件內的平均代碼行數(shù),您會發(fā)現(xiàn) Kotlin 可以縮減至少 25% 的代碼行數(shù)脐供。寫的代碼少了凳鬓,測試和維護的的時間成本就會相應降低,團隊開發(fā)新特性的速度自然也就上去了患民。此外缩举,您還可以觀察一下如果用 Kotlin 和 Java 開發(fā)類似的特性,哪種語言的用時會更短匹颤。

Kotlin 有助于改善應用質量仅孩。除了大家熟知的空安全 (null-safety) 特性以外,Kotlin 還提供了許多其它的安全特性印蓖,幫助您避免各種類型的代碼錯誤辽慕。Pinterest 建議開發(fā)者在應用程序遷移的過程中,跟蹤記錄每個模塊的代碼錯誤率赦肃。您可以發(fā)現(xiàn)錯誤率呈下降趨勢溅蛉。請點擊觀看?Android 開發(fā)者故事對 Camera360 的專訪,或者閱讀近期學術研究他宛,進一步了解 Kotlin 如何提高代碼質量船侧。

Kotlin 是行業(yè)趨勢所在。在 Google Play Top 1000 榜單中厅各,使用 Kotlin 開發(fā)的 Android 應用占比達到 26%镜撩,其中包括 Twitter、Pinterest队塘、微信袁梗、美國運通卡等超重量級應用。Redmonk 公布的榜單顯示 Kotlin 是目前發(fā)展第二快的的移動平臺編程語言憔古≌诹科技媒體 Dice 也曾發(fā)文指出 Kotlin 的相關工作數(shù)量呈爆炸式增長

Kotlin 讓您的團隊更開心鸿市。雖然幸福感很難量化锯梁,但是您可以通過適當?shù)姆绞阶尮芾韺芋w會到團隊對 Kotlin 的熱愛。根據(jù)《 StackOverflow 2018 年度開發(fā)者調查報告》顯示灸芳,Kotlin 是目前第二大最受歡迎的編程語言涝桅。

下一步

有了一定的 Kotlin 實戰(zhàn)經(jīng)驗后拜姿,您一定很好奇要如何在日常開發(fā)中運用 Kotlin烙样,為此我們額外準備了一些實用技巧,希望對您有參考價值蕊肥。

為項目制定代碼風格規(guī)范

Kotlin 風格指南》和《Android Kotlin 風格指南》為確定 Kotlin 代碼格式提供了很好的建議谒获。您可以在此基之上確立最您適合團隊的編碼規(guī)范和習慣用法蛤肌。

您可以通過以下兩種策略來統(tǒng)一 Kotlin 的代碼風格: (1) 自定義 Androis Studio 的代碼風格;(2) 使用 Linter批狱。在Sunflower和?Plaid?項目中裸准,我們就使用了?Ktlint?保障代碼風格的規(guī)范性。Ktlint 提供了一系列符合Kotlin 標準風格指南的默認設置赔硫,并且允許開發(fā)者根據(jù)具體要求進行自定義更改炒俱。

貴精不貴多

Kotlin 具備很多出色的語言特性,但是在實際運用時爪膊,開發(fā)者往往把控不好一個 "度"权悟,比如過度使用 Kotlin 語法糖,或者在包裹語句時使用太多的 `apply`, `let`, `use` 函數(shù)推盛。一般情況下峦阁,不建議開發(fā)者為了縮短代碼行數(shù)而犧牲了可讀性。我們在開發(fā) Plaid 的時候就規(guī)定了每個 `apply` 括號中至少需要包含兩行代碼耘成。您可以根據(jù)具體情況榔昔,制定出最適合團隊的編碼規(guī)則,然后將其添加至您的風格指南中瘪菌。

示例項目及案例分析

您可以下拉至文末的 "繼續(xù)探索" 板塊撒会,查看并研究 Kotlin 相關實戰(zhàn)案例,了解 Google 如何進行 Kotlin 項目遷移师妙,其它公司又是如何在已有項目中添加 Kotlin 代碼的茧彤。

常見問題

新技術帶來新的疑問。以下我們匯總了一些開發(fā)者們在采用 Kotlin 的過程中遇到問題疆栏,并附上了對應的解決建議曾掂。

應該如何說服其他共事的工程師使用新語言?

之前在 Google I/O 開發(fā)者大會上壁顶,我和 Kotlin 首席語言設計師Andrey Breslav分享過幾個幫助工程師采用 Kotlin 的方法珠洗。我們認為最好是采取分步策略,先試著往項目中加入少量 Kotlin 代碼若专,然后再觀察情況是否得到改善许蓖。如果您最后發(fā)現(xiàn) Kotlin 的缺點多于優(yōu)點,決定放棄這門語言调衰,Andrey 認為這是完全可以理解的膊爪。

學習 Kotlin 會不會很難?

大多數(shù)開發(fā)者可以輕松上手 Kotlin嚎莉。資深的 Java 開發(fā)者能夠使用同一套工具進行 Java 和 Kotlin 編程米酬。您還可以在 Kotlin 中找到許多與 Ruby 和 Python 相似的語言特性,如方法鏈趋箩。

Google 會繼續(xù)支持 Kotlin 用于 Android 開發(fā)嗎赃额?

當然加派!Google 會一直為 Kotlin 提供有力支持。

結語

希望本文內容對您和您的團隊有所啟發(fā)跳芳,幫助您們將 Kotlin 順利添加至應用中芍锦。盡管這個過程中不乏挑戰(zhàn),但是幾乎所有開發(fā)者都告訴我飞盆,Kotlin 幫他們重新找回了軟件開發(fā)的樂趣娄琉。

請注意:雖然本文主要是針對 Android 應用進行撰寫的,但是文中提及的概念適用于任何類型的 Java 項目吓歇,無論是 Android 移動端應用還是服務器端车胡。

感謝您閱讀本文,預祝您在 Kotlin 遷移之旅上一路順風照瘾!

點擊這里前往?Kotlin?官方文檔查看更多信息

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末匈棘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子析命,更是在濱河造成了極大的恐慌主卫,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹃愤,死亡現(xiàn)場離奇詭異芒涡,居然都是意外死亡浅缸,警方通過查閱死者的電腦和手機栏渺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門怔接,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凹耙,你說我怎么就攤上這事姿现。” “怎么了肖抱?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵备典,是天一觀的道長。 經(jīng)常有香客問我意述,道長提佣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任荤崇,我火速辦了婚禮拌屏,結果婚禮上,老公的妹妹穿的比我還像新娘术荤。我一直安慰自己倚喂,他們只是感情好,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布喜每。 她就那樣靜靜地躺著务唐,像睡著了一般雳攘。 火紅的嫁衣襯著肌膚如雪带兜。 梳的紋絲不亂的頭發(fā)上枫笛,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天,我揣著相機與錄音刚照,去河邊找鬼刑巧。 笑死,一個胖子當著我的面吹牛无畔,可吹牛的內容都是我干的啊楚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼浑彰,長吁一口氣:“原來是場噩夢啊……” “哼恭理!你這毒婦竟也來了?” 一聲冷哼從身側響起郭变,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤颜价,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后诉濒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體周伦,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年未荒,在試婚紗的時候發(fā)現(xiàn)自己被綠了专挪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡片排,死狀恐怖寨腔,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情率寡,我是刑警寧澤脆侮,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站勇劣,受9級特大地震影響靖避,放射性物質發(fā)生泄漏。R本人自食惡果不足惜比默,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一幻捏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧命咐,春花似錦篡九、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伊佃。三九已至,卻和暖如春沛善,著一層夾襖步出監(jiān)牢的瞬間航揉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工金刁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帅涂,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓尤蛮,卻偏偏與公主長得像媳友,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子产捞,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內容