(原创)Databinding踩坑:3 字节的 UTF-8 序列的字节 3 无效

博主在Windows系统上遇到项目无法运行的问题,原因是Databinding在编译时遇到XML中包含中文导致的错误。错误只在Windows环境下出现,而在MAC系统上正常。问题解决方法是逐个注释可能存在问题的XML文件,直至找到并修正所有不兼容的中文或特殊字符。为了避免此类问题,建议在XML中使用String.xml来定义文本,避免直接使用中文或特殊编码字符。

问题产生

最近接手一个新的项目
运行后发下跑不起来。一查,是build阶段出了点问题
但是报错信息很有限,只查到这么一条提醒:
3 字节的 UTF-8 序列的字节 3 无效

问题定位

一开始我以为是自己代码问题
于是自己闷头查了好久
还去问了其他的同事
最后他们说他们可以正常运行
奇了怪了。
直到我去搜索这个问题
才突然意识到
他们用的是MAC
而我用的是Windows
这个错误,只在Windows系统上才会出现!
就离谱
所以在此记录下

问题原因

因为Databinding会在编译时根据xml在build里面生成自己的一些文件,
所以如果你在他的xml里面写了中文的话
在Windows系统就会报这个错
而且最恶心的是
他不会告诉你是具体那个xml有错
而是会在编译的日志台告诉你这个库下面所有的xml生成失败了
这也给我们修改制造了很多麻烦

问题解决

先说下我是怎么解决的:
我把这个库的所有用到了databinding的xml文件都找出来
一个个去注释掉那些用到了databinding属性的代码
然后编译一下
看是否通过
如果通过,再把注释的范围缩小
直到找到最后出问题的地方
有可能不止一出
必须全部改好才可以正常编译。
因为这个软件一开始是在MAC上面开发的,所以不存在这个问题
MAC开发的同学在xml里面写了一些中文
导致到了Windows上面就出问题了
最后,说一下开发中如何避免这个问题:
1:xml中一些属性比如text:不要直接使用中文
而是定义在String.xml里面
2:xml其他地方避免使用‰这类不属于utf-8编码的特殊符号
如果需要使用,也定义在String.xml里面
3:name取名最好不要存在

Duplicate class androidx.databinding.Bindable found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.BindingAdapter found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.BindingBuildInfo found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.BindingConversion found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.BindingMethod found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.BindingMethods found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.CallbackRegistry found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.CallbackRegistry$NotifierCallback found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.InverseBindingAdapter found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.InverseBindingListener found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.InverseBindingMethod found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.InverseBindingMethods found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.InverseMethod found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.Observable found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.Observable$OnPropertyChangedCallback found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.ObservableList found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.ObservableList$OnListChangedCallback found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.ObservableMap found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.ObservableMap$OnMapChangedCallback found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class androidx.databinding.Untaggable found in modules baseLibrary-3.2.0-alpha11.jar -> jetified-baseLibrary-3.2.0-alpha11 (androidx.databinding:baseLibrary:3.2.0-alpha11) and databinding-common-8.8.0.jar -> databinding-common-8.8.0 (androidx.databinding:databinding-common:8.8.0) Duplicate class com.google.common.util.concurrent.ListenableFuture found in modules guava-23.0.jar -> jetified-guava-23.0 (com.google.guava:guava:23.0) and listenablefuture-1.0.jar -> jetified-listenablefuture-1.0 (com.google.guava:listenablefuture:1.0) Learn how to fix dependency resolution errors at https://d.android.com/r/tools/classpath-sync-errors
最新发布
10-30
你遇到的错误是 **类冲突(Duplicate class)**,这意味着你的 Android 项目中有两个不同的依赖库提供了相同的类(如 `androidx.databinding.Bindable`),导致编译失败。 --- ### 🔍 错误分析 你看到的错误信息说明以下两个依赖库都包含了 `androidx.databinding` 包中的类: - `baseLibrary-3.2.0-alpha11.jar`(来自 `androidx.databinding:baseLibrary:3.2.0-alpha11`) - `databinding-common-8.8.0.jar`(来自 `androidx.databinding:databinding-common:8.8.0`) 这两个库提供了相同的类,但版本不同,导致冲突。 --- ### ✅ 解决方案 #### ✅ 方法 1:统一使用 Android Gradle 插件提供的 DataBinding `databinding-common` 是 Android Gradle 插件的一部分,而 `baseLibrary` 是旧版 DataBinding 的一部分。你应该**避免手动引入 DataBinding 的旧版本库**。 请检查你的 `build.gradle`(模块级)中是否错误地添加了类似以下依赖: ```gradle implementation files('libs/baseLibrary-3.2.0-alpha11.jar') ``` **解决步骤:** 1. 删除手动导入的 `baseLibrary-3.2.0-alpha11.jar` 文件或注释掉相关依赖。 2. 确保你只使用官方的 DataBinding 支持: ```gradle android { ... viewBinding { enabled = true } dataBinding { enabled = true } } ``` 3. 同步 Gradle 项目。 --- #### ✅ 方法 2:排除冲突依赖 如果你在某个依赖中引入了旧版本的 DataBinding 库,可以使用 `exclude` 排除它: ```gradle implementation('some.library:with-databinding:1.0.0') { exclude group: 'androidx.databinding', module: 'baseLibrary' } ``` --- #### ✅ 方法 3:更新所有依赖库版本 确保你使用的所有库都使用最新的 AndroidX 和兼容版本,避免混合使用不同版本的 Jetpack 库。 --- ### 📌 小贴士 - 使用 `./gradlew app:dependencies` 命令查看依赖树,定位冲突来源。 - 使用 `File -> Invalidate Caches / Restart` 清除缓存。 - 使用 `Build > Clean Project` 清理项目后重新构建。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值