深刻源码学习 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这个库的实践的系列博文。

相关文章
相关标签/搜索