深刻源碼學習 android data binding 之:源碼的正確打開姿式

雖然沒有開通專欄以前已經在挖金投稿過了這篇文章,可是我打算寫一個關於android data binding庫的一系列的文章,爲了完整性,我仍是在這裏從新發布一遍。若是以前已經看過這篇android data binding 實踐之:源碼的正確打開姿式,那麼能夠忽略下面的內容,若是你喜歡的話能夠收藏也能夠點贊哦!java


最近在深刻學習android data binding庫,一邊寫demo,一邊看庫的源碼。可是在導入android data binding庫的時候卻遇到了各類麻煩。各類谷歌未果,最後折騰了一天終於找到了正確打開源碼的姿式。這裏mark一下給一樣踩坑的人。android

首先獻上data binding庫的源碼倉庫地址git

git clone android.googlesource.com/platform/fr…app

由於代碼是使用gradle進行編譯的,因此本身剛導入代碼的時候簡直就是心花盛開(相比那些使用maven、ant之類進行,gradle仍是要來得更加親切的)。可是實際上,踩坑之旅這纔剛剛開始。maven

謎之"version.gradle"

android studio剛導入代碼立馬就看到了下面的編譯錯誤:學習

Error:Could not read script '/Users/lemon/Documents/buildSrc/base/version.gradle' as it does not exist.gradle

我將源碼放在了 /Users/lemon/Documents/ 目錄下,可是這 version.gradle 到底是何方神聖呢?使用全局搜索很快就在propLoader.gradle 這個文件中找到了引用,代碼節選以下:ui

// load android gradle plugin's version file
apply from: "${root}/../buildSrc/base/version.gradle"
databindingProperties.version = ext.buildVersion
// load version from gradle build file
apply from: "$root/../buildSrc/base/version.gradle"
databindingProperties.androidPluginVersion=ext.buildVersion複製代碼

不難纔想,在 version.gradle 當中其實就是定義了一些關於編譯環境的版本信息的常量值。而這裏用到的常量值就只有 buildVersion 這一個,我猜測這應該指的就是 android plugin version 。因此在這一個地方咱們能夠有兩個方案:google

  • 在項目根目錄下添加一個 version.gradle 文件,並添加相應的變量定義,同時修改這裏的引用地址;
  • 直接把這裏引用到的變量值替換成實際的常量值,並取消引入 version.gradle 這個文件。

在這裏我選擇的是第二種作法,代碼以下:spa

//apply from: "$root/../buildSrc/base/version.gradle"
databindingProperties.androidPluginVersion='2.2.2'
// load android gradle plugin's version file
//apply from: "${root}/../buildSrc/base/version.gradle"
databindingProperties.version = '2.2.2'複製代碼

你不會想到的"kotlin"出現了

修改完上面的文件以後從新編譯,立馬又出現了新的問題,找不到"kotlin"的支持,由於庫當中有一個module compiler 使用了kotlin進行編寫的,所以你須要在android studio當中安裝kotlin插件,以下圖所示:

若是你認爲安裝完插件以後就大功告成,那就真的是too young too simple了。從新編譯以後,讓人苦惱的想哭的編譯問題又出現了:

Error:Could not find org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.0-beta-4584.
...
Required by:
com.android.databinding:compiler:2.2.2

咱們發如今 compiler 這個module編譯的時候,還須要一個 otlin-gradle-plugin 。咱們打開 compiler 下的 build.gradle 文件

apply plugin: 'java'
apply plugin: 'kotlin'

sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
}

buildscript {
    // to make IJ happy
    ext.kotlin_version = dataBindingConfig.kotlinVersion
    dependencies {
        classpath 'commons-io:commons-io:2.4'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

dependencies {
    compile project(':dataBinding:compilerCommon')
    compile project(':dataBinding:baseLibrary')
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile 'commons-io:commons-io:2.4'
    compile 'commons-codec:commons-codec:1.10'
    compile 'com.tunnelvisionlabs:antlr4:4.5'
    compile 'com.googlecode.juniversalchardet:juniversalchardet:1.0.3'
    testCompile 'junit:junit:4.12'
}複製代碼

因此咱們須要給 compiler 添加上正確的依賴。從詳細的報錯信息以及上面的配置咱們會發現,項目並無從遠程倉庫去尋找依賴,而是從本地尋找的,因此咱們得加上要使用的遠程倉庫聲明。另外,上面依賴的版本是經過 dataBindingConfig.kotlinVersion 定義的,爲了減小修改,我直接把要使用的版本改爲了最新的版本。具體修改以後的以下:

apply plugin: 'java'
apply plugin: 'kotlin'

sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
}

buildscript {
    repositories {
        jcenter()
    }

    // to make IJ happy
// ext.kotlin_version = dataBindingConfig.kotlinVersion
    dependencies {
        classpath 'commons-io:commons-io:2.4'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.5-2"
    }
}

dependencies {
    compile project(':dataBinding:compilerCommon')
    compile project(':dataBinding:baseLibrary')
    // compile "org.jetbrains.kotlin:kotlin-stdlib:1.0.5-2"
    compile 'commons-io:commons-io:2.4'
    compile 'commons-codec:commons-codec:1.10'
    compile 'org.antlr:antlr4:4.5.3'
    compile 'com.googlecode.juniversalchardet:juniversalchardet:1.0.3'
    testCompile 'junit:junit:4.12'
    compile 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.5-2'
    compile 'org.jetbrains.kotlin:kotlin-stdlib:1.0.5-2'
}複製代碼

有一個要須要注意的是,我一開始使用的倉庫是 mavenCentral ,結果弄了好幾個小時都不能正確下載,後來改爲使用 jcenter 就行了。

通過上面的調整,而後美好的事情終於到來。data bindign這個庫終於能夠順利編譯了,清晰的代碼目錄、代碼跳轉等等該有的都有了。感動到哭了有木有。

熱心提示

android data binding這個庫是通過屢次修改的,其中如雙向綁定、lambada表達式這些是在gradle2.2 之後纔會支持的,其餘以前版本是沒有的。因此若是使用默認的master分支下的代碼,很抱歉,你會發現找不到相關的代碼。。。。。。(在某個早上,我折騰了好幾個小時,基本上把每一個代碼文件基本都翻了個遍,硬是沒找到應該有的代碼,在崩潰的邊緣,我都要開始相信玄學,認爲谷歌又偷偷摸摸使用了一些鮮爲人知的黑科技了)。

在遠程倉庫的網頁上,咱們會發現除了不少的分支以外,還有不少的tag,以下圖所示:

不難猜到在 gradle_2.2.2 這個tag下面應該有咱們想要的所有特性的代碼。因此在命令行下面,使用checkout命令就能夠啦:

git checkout gradle_2.2.2

這下子終於能夠愉快跟谷歌爸爸作朋友了。關於android data binding這個庫的具體分析歡迎關注個人博客,接下來我會寫關於data binding這個庫的實踐的系列博文。

相關文章
相關標籤/搜索