今天一早上班,拉了git上的最新代碼正準(zhǔn)備開(kāi)始開(kāi)發(fā),gradle編譯報(bào)如下錯(cuò)誤:
ding.java:20: 錯(cuò)誤: 找不到符號(hào)
protected ActivityCategoryBinding(DataBindingComponent _bindingComponent, View
_root,
^
符號(hào): 類 DataBindingComponent
位置: 類 ActivityCategoryBinding
.....
e: [kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: failure, see logs for details.
Exception while handling step android.databinding.annotationprocessor.ProcessExpressions@3b33849b javax.xml.bind.UnmarshalException
- with linked exception:
[com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 3 字節(jié)的 UTF-8 序列的字節(jié) 3 無(wú)效。]
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:246)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:204)
....
所有databinding 生成的binding 類都報(bào)了utf-8編碼問(wèn)題的錯(cuò)誤,這個(gè)問(wèn)題只會(huì)在win系統(tǒng)下會(huì)出現(xiàn),在mac下沒(méi)有此問(wèn)題
為了排查這個(gè)問(wèn)題,先百度了一圈,搜到的結(jié)果大部分是maven配置文件相關(guān)的信息,沒(méi)有什么參考價(jià)值,猜測(cè)可能是Android Stdio、gradle、kapt、databinding 這四者之一出了問(wèn)題,于是又去stackoverflow 帶著這幾個(gè)關(guān)鍵字和報(bào)錯(cuò)信息去查,找到了類似的問(wèn)題,嘗試了https://stackoverflow.com/questions/50594507/cannot-find-symbol-databindingcomponent-on-android-studio-3-2-canary-16-kotlin-p這個(gè)帖子里的一些回答,比如升級(jí)和更換gradle版本號(hào)、databinding版本 、在build.gradle文件指定utf-8編碼的task、指定gradle的DEFAULT_JVM_OPTS為utf-8等方法均未解決
雖然走了一些彎路,不過(guò)也排除調(diào)了一些干擾項(xiàng),產(chǎn)生這個(gè)bug的根源一定是出在databinding上,祭出終極手段:git回滾到上一個(gè)不報(bào)錯(cuò)的版本,比較layout文件夾下的所有改動(dòng),逐行修改編譯,嘗試是否編譯成功,直到看到如下這行改動(dòng):

感覺(jué)不對(duì),把這行更新到最新版本,編譯報(bào)"3 字節(jié)的 UTF-8 序列的字節(jié) 3 無(wú)效"的錯(cuò)誤,還原回上一個(gè)版本,編譯正常
結(jié)論
‰這類特殊符號(hào)不屬于utf-8編碼,在win系統(tǒng)下databinding生成binding類存在bug會(huì)生成非utf-8編碼的class文件從而導(dǎo)致所有binding類報(bào)錯(cuò)找不到符號(hào),由于databinding編譯時(shí)的報(bào)錯(cuò)信息無(wú)法定位到出錯(cuò)位置,手動(dòng)排查十分麻煩,所以在layout文件中書(shū)寫(xiě)databinding時(shí)不要直接使用表達(dá)式拼接字符串,把固定文案都定義到string.xml文件里,盡可能避免此類問(wèn)題。
國(guó)內(nèi)關(guān)于databinding的資料目前非常少,寫(xiě)這篇文章希望能幫助到遇到同樣錯(cuò)誤的同學(xué)~
附錄
當(dāng)前的build.gradle配置項(xiàng):
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
compileSdkVersion compile_sdk_version
defaultConfig {
....
}
signingConfigs gradle.signingConfigs
buildTypes {
....
}
dataBinding {
enabled = true
}
}
kotlin {
experimental {
coroutines 'enable'
}
}
dependencies {
implementation 'com.android.support:multidex:1.0.3'
implementation fileTree(dir: 'libs', include: ['*.jar'])
//kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation "com.android.support.test.espresso:espresso-core:" + rootProject.espresso_version
implementation "com.android.support:support-v4:" + rootProject.supportLibVersion
implementation "com.android.support:palette-v7:" + rootProject.supportLibVersion
implementation "com.android.support:appcompat-v7:" + rootProject.supportLibVersion
implementation "com.android.support:design:" + rootProject.supportLibVersion
implementation "com.android.support:cardview-v7:" + rootProject.supportLibVersion
//ViewModel
implementation "android.arch.lifecycle:extensions:" + rootProject.archLifecycleVersion
implementation "android.arch.lifecycle:viewmodel:" + rootProject.archLifecycleVersion
kapt "android.arch.lifecycle:compiler:" + rootProject.archLifecycleVersion
//rx android
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'io.reactivex.rxjava2:rxkotlin:2.2.0'
implementation 'io.reactivex.rxjava2:rxjava:2.1.8'
....
}
buildscript {
ext.kotlin_version = '1.3.0'
ext.android_plugin_version = '3.2.1'
repositories {
jcenter()
google()
}
dependencies {
classpath "com.android.tools.build:gradle:$android_plugin_version"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}