databinding windows系統(tǒng)"3 字節(jié)的 UTF-8 序列的字節(jié) 3 無(wú)效"問(wèn)題踩坑記錄

今天一早上班,拉了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"
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容