最外層build.gradle文件添加如下buildscript依賴,以前爲了支持安居客使用kotlin已添加html
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
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']
Andriod Studio 須要安裝名爲Kotlin的插件,用來支持Kotlin開發,通常在建立Kotlin文件後若是未安裝插件會提示安裝。app
語法上劉陽已經進行了分享,此處就不在重複了。這裏主要講一下在使用Kotlin開發過程當中的我的使用的一些技巧吧。編輯器
學習Kotlin的最便捷的地方就是Kotlin是基於JVM的語言,會編譯成class文件,所以咱們直接反編譯該class文件便可得到其語法的實現原理,是否是很是開心!!!ide
上面說的Kotlin插件已經帶了此功能,點擊Tools--Kotlin–Show Kotlin ByteCode便可查看到class文件內容,編輯器左上角貼心的帶了一個Decompile按鈕,點擊此按鈕便可看到反編譯後的Java源碼了。以下圖所示佈局
老的Java代碼也能夠轉爲Kotlin,選中須要轉換的Java文件右鍵最下面一個選項Conver Java File To Kotlin File。以下所示:
若是遇到不懂的語法也能夠直接將Java代碼複製到Kotlin文件,會自動轉成Kotlin代碼。
上文中咱們應用了兩個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代碼,很是方便。以下圖所示:
kotlin-android-extensions還有一些其餘功能,我的以爲用處不大,就再也不講了,你們有興趣能夠去探索。
Anko 是一個提供圍繞 Android API 的 Kotlin 友好的包裝器的庫 ,以及一個能夠用 Kotlin 代碼替換佈局 .xml 文件的 DSL。
Anko功能很是強大,在Kotlin社區也是大名鼎鼎,因爲咱們項目引入剛剛Kotlin,此處就沒有引入Anko,後續若是引入再進行分享。有興趣同窗可關注Anko項目地址:https://github.com/kotlin/anko
Kotlin編譯原理
Kotlin Gradle 插件支持增量編譯。增量編譯會跟蹤屢次構建之間源文件的變動,所以只會編譯這些變動所影響的文件。
Kotlin 1.1.1 起的 Kotlin/JVM 項目默認啓用增量編譯。
有幾種方法能夠覆蓋默認設置:
gradle.properties
或者 local.properties
中,對於 Kotlin/JVM 項目添加一行 kotlin.incremental=<值>
-Pkotlin.incremental
請注意,任何狀況下首次構建都不會是增量的。
Kotlin 插件支持 Gradle 構建緩存(須要 Gradle 4.3 及以上版本;低版本則禁用緩存)。
如需禁用全部 Kotlin 任務的緩存,請將系統屬性標誌 kotlin.caching.enabled
設置爲 false
(運行構建帶上參數 -Dkotlin.caching.enabled=false
)。
若是使用 kapt(註解處理器),請注意默認狀況下不會緩存註解處理任務。不過,能夠手動爲它們啓用緩存。詳見 kapt 頁。
首次編譯(Kotlin)
增量編譯(Kotlin)
首次編譯(Java)
增量編譯(Java)
語言 | 首次編譯 | 增量編譯 |
---|---|---|
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