runtime module和插件module中都使用了Databinding, 会产生冲突
Opened this issue · 7 comments
插件第一次调用DataBindingUtil.setContentView()时, 会初始化androidx.databinding.DataBinderMapperImpl对象,
但是runtime module中也有同样的类,于是就初始化了错误的类(不同的包名的DataBinderMapperImpl类),引发错误.
类似这种冲突有什么解决方案吗
这是插件中应该使用的databinding自动生成的类, 会初始化插件module中所有的Mapper并添加到列表里,但是实际会调用runtime的该类并初始化runtime的Mapper;
package androidx.databinding;
public class DataBinderMapperImpl extends MergedDataBinderMapper {
DataBinderMapperImpl() {
addMapper(new com.yhc.xplugintest.DataBinderMapperImpl());
}
}
可以在插件中以 compileOnly 的方式引入冲突的库. 或者等等我针对这个场景在demo中加一个最佳实践的例子.
可以在插件中以 compileOnly 的方式引入冲突的库. 或者等等我针对这个场景在demo中加一个最佳实践的例子.
Databinding的引入方式比较特殊(gradle文件配置android.buildFeatures.dataBinding = true), 冲突的类也很特殊, build时动态生成的同一个类(androidx.databinding.DataBinderMapperImpl ), 但是里面的内容并不相同, 内容如上面的代码,初始化了插件module自己的另一个DataBinderMapperImpl.
而现在的情况是插件apk里面也有这个类,但是用到了runtime里面的, 和compileOnly处理的场景刚好相反...
可以在插件中以 compileOnly 的方式引入冲突的库. 或者等等我针对这个场景在demo中加一个最佳实践的例子.
Databinding的引入方式比较特殊(gradle文件配置android.buildFeatures.dataBinding = true), 冲突的类也很特殊, build时动态生成的同一个类(androidx.databinding.DataBinderMapperImpl ), 但是里面的内容并不相同, 内容如上面的代码,初始化了插件module自己的另一个DataBinderMapperImpl.
而现在的情况是插件apk里面也有这个类,但是用到了runtime里面的, 和compileOnly处理的场景刚好相反...
好的, 谢谢反馈, 我看看怎么解决
可以在插件中以 compileOnly 的方式引入冲突的库. 或者等等我针对这个场景在demo中加一个最佳实践的例子.
Databinding的引入方式比较特殊(gradle文件配置android.buildFeatures.dataBinding = true), 冲突的类也很特殊, build时动态生成的同一个类(androidx.databinding.DataBinderMapperImpl ), 但是里面的内容并不相同, 内容如上面的代码,初始化了插件module自己的另一个DataBinderMapperImpl.
而现在的情况是插件apk里面也有这个类,但是用到了runtime里面的, 和compileOnly处理的场景刚好相反...好的, 谢谢反馈, 我看看怎么解决
麻烦大佬了. 除了这个特殊情况, xplugin框架真的强大且易用.
这个问题有解决吗?
这个问题有解决吗?
我项目里的插件没有用DataBinding了, 因为DataBinding的初始化和XPlugin的实现原理冲突太大, 很难适配, 直接放弃好一点. 如果只是绑定布局, 可以替换为ViewBinding, ViewBinding没有全局初始化, 不会冲突.