58APP引入Kotlin進行Android開發

配置

  1. 最外層build.gradle文件添加如下buildscript依賴,以前爲了支持安居客使用kotlin已添加html

    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  2. module配置(目前僅在58ClientHybridLib進行了配置,後續其餘同窗開發其餘庫時再單獨配置) java

    build.gradle文件中添加android

    apply plugin: 'kotlin-android-extensions'`
    apply plugin: 'kotlin-android'

    dependencies中添加git

    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

    若是項目中用到了 Kotlin 反射或者測試設施,還須要添加相應的依賴項(因爲目前沒有使用暫沒有添加):github

    implementation "org.jetbrains.kotlin:kotlin-reflect$kotlin_version"
    testImplementation "org.jetbrains.kotlin:kotlin-test$kotlin_version"
    testImplementation "org.jetbrains.kotlin:kotlin-test-junit$kotlin_version"

    kotlin代碼可與java代碼放到相同目錄,可是放到一塊兒回比較混亂,爲了將kotlin與java代碼隔離新建一個kotlin目錄,而且sourceSets作如下修改緩存

    java.srcDirs = ['src', 'kotlin']
  3. IDE插件安裝

    Andriod Studio 須要安裝名爲Kotlin的插件,用來支持Kotlin開發,通常在建立Kotlin文件後若是未安裝插件會提示安裝。app

開發

語法上劉陽已經進行了分享,此處就不在重複了。這裏主要講一下在使用Kotlin開發過程當中的我的使用的一些技巧吧。編輯器

Kotlin轉Java

學習Kotlin的最便捷的地方就是Kotlin是基於JVM的語言,會編譯成class文件,所以咱們直接反編譯該class文件便可得到其語法的實現原理,是否是很是開心!!!ide

上面說的Kotlin插件已經帶了此功能,點擊Tools--Kotlin–Show Kotlin ByteCode便可查看到class文件內容,編輯器左上角貼心的帶了一個Decompile按鈕,點擊此按鈕便可看到反編譯後的Java源碼了。以下圖所示佈局

14433680-C0AC-4390-9A5C-762637819ABE.png

Java轉Kotlin

老的Java代碼也能夠轉爲Kotlin,選中須要轉換的Java文件右鍵最下面一個選項Conver Java File To Kotlin File。以下所示:5C8DE5C6-4D88-4BD3-9866-3F28A802D025.png

若是遇到不懂的語法也能夠直接將Java代碼複製到Kotlin文件,會自動轉成Kotlin代碼

kotlin-android-extensions

上文中咱們應用了兩個gradle 插件

apply plugin: 'kotlin-android-extensions'`
apply plugin: 'kotlin-android'

kotlin-android是用來構建Android的Gradle模型項目。

kotlin-android-extensions是一個編譯器擴展,主要功能可讓你擺脫代碼中的 findViewById()調用,並將其替換爲合成的編譯器生成的屬性。

findViewById()是比較繁瑣的語法,不少開源庫都提供瞭解決方案,可是因爲各類問題咱們一直沒有采用。kotlin-android-extensions是Kotlin官方團隊實現的一套編譯器擴展,那麼它是怎麼實現去掉findViewById方法的呢?

//第一步導入合成屬性
import kotlinx.android.synthetic.main.wallet_withdraw_dialog.*
...

setContentView(R.layout.wallet_withdraw_dialog)
//第二步直接使用佈局裏的控件id作變量(這步以前不要忘了setContentView)
phoneNumberText?.setText(withdrawResult.phone)

對於有setContentView方法的對象能夠這麼使用,那沒有setContentView方法的對象怎麼使用呢?

//第一步導入View合成屬性
import kotlinx.android.synthetic.main.wallet_withdraw_dialog.view.*
...
var view = LayoutInflater.from(context).inflate(R.layout.wallet_withdraw_dialog)
//第二步直接使用佈局裏的控件id作view的變量
view.phoneNumberText?.setText(withdrawResult.phone)

發散一下思惟,這個功能Kotlin是如何實現的?會不會影響性能?

根據官方文檔介紹kotlin-android-extensions還有註解自動生成Parcelable的功能,但根據官方文檔的步驟,並無生效,提示我找不到註解@Parcelize。不過我卻是發現了另外一個功能一鍵生成Parcelable代碼,很是方便。以下圖所示:

D159E66D-9FB0-448F-8DB0-5E89104C7B27.png

kotlin-android-extensions還有一些其餘功能,我的以爲用處不大,就再也不講了,你們有興趣能夠去探索。

Anko

Anko 是一個提供圍繞 Android API 的 Kotlin 友好的包裝器的庫 ,以及一個能夠用 Kotlin 代碼替換佈局 .xml 文件的 DSL。

Anko功能很是強大,在Kotlin社區也是大名鼎鼎,因爲咱們項目引入剛剛Kotlin,此處就沒有引入Anko,後續若是引入再進行分享。有興趣同窗可關注Anko項目地址:https://github.com/kotlin/anko

編譯

Kotlin編譯原理

A5B3D372-ED09-4CF6-AB8D-8C507E58366F.png

Kotlin Gradle 插件支持增量編譯。增量編譯會跟蹤屢次構建之間源文件的變動,所以只會編譯這些變動所影響的文件。

Kotlin 1.1.1 起的 Kotlin/JVM 項目默認啓用增量編譯。

有幾種方法能夠覆蓋默認設置:

  • 在 Gradle 配置文件中:在 gradle.properties 或者 local.properties 中,對於 Kotlin/JVM 項目添加一行 kotlin.incremental=<值>
  • 在 Gradle 命令行參數中:添加帶有反應增量編譯用法的布爾值的 -Pkotlin.incremental

請注意,任何狀況下首次構建都不會是增量的。

Kotlin 插件支持 Gradle 構建緩存(須要 Gradle 4.3 及以上版本;低版本則禁用緩存)。

如需禁用全部 Kotlin 任務的緩存,請將系統屬性標誌 kotlin.caching.enabled 設置爲 false(運行構建帶上參數 -Dkotlin.caching.enabled=false)。

若是使用 kapt(註解處理器),請注意默認狀況下不會緩存註解處理任務。不過,能夠手動爲它們啓用緩存。詳見 kapt 頁

速度

首次編譯(Kotlin)

09AD5BF5-4013-4F48-A122-94A905FAB12F.png

增量編譯(Kotlin)

7820A750-EC89-45BF-A25D-AD648E43E088.png

首次編譯(Java)

057A8042-FF3C-4301-AEE8-C45E3F2A03C0.png

增量編譯(Java)

EC2C0D10-B3F3-4341-AB6E-EB8126FE749A.png

語言 首次編譯 增量編譯
Kotlin 3m26s 1m55s
Java 3m19s 1m57s

可能受環境影響測試結果僅供參考,可是能夠發現Kotlin與純Java項目的構建速度接近,對編譯速度的影響微乎其微,當發佈完aar之後就是class文件了,就與Java一致了。固然目前Kotlin代碼較少結果不必定準確,後續你們使用Kotlin開發之後會繼續關注打包速度的影響。

參考:

https://developer.android.com/kotlin/get-started?hl=zh-CN

https://www.kotlincn.net/docs/reference/android-overview.html

https://www.kotlincn.net/docs/tutorials/android-plugin.html

相關文章
相關標籤/搜索