Symbol$CompletionFailure:class 找不到 ActivityDeparturesBinding 文件

Symbol$CompletionFailure: class file for ActivityDeparturesBinding not found

我在 Android 应用程序的单独项目中有一个单独的 Android 库。但是我直接 link 库(通过路径或生成的 AAR 直接引用库模块)我得到以下错误:

A problem was found with the configuration of task ':app:kaptDevelopDebugKotlin'.
> Cannot write to file '/home/m0skit0/Repos/repo/app-android/app/build/intermediates/data-binding/develop/debug/bundle-bin' specified for property 'dataBindingArtifactOutputDir' as it is a directory.

e: error: cannot access ActivityDeparturesBinding
  class file for com.blablabla.databinding.ActivityDeparturesBinding not found
  Consult the following stack trace for details.
  com.sun.tools.javac.code.Symbol$CompletionFailure: class file for com.blablabla.databinding.ActivityDeparturesBinding not found

* What went wrong:
Execution failed for task ':app:kaptDevelopDebugKotlin'.

这显示在任务之后:app:transformDataBindingWithDataBindingMergeArtifactsForDevelopDebug

但是 class 确实存在,具有完整的规范名称。它属于库,并且由 Android 的数据绑定处理器在两个项目上正确地自动生成(没有任何错误)。该库自行正确编译。即使编译是 运行 和 --stacktrace.

,也没有进一步的堆栈跟踪

我已经尝试 link 使用编译、实现和 api 编译库,结果都一样。

Gradle 版本是 4.4.


更新:

更新到Gradle5 没有解决问题。重命名 XML 并没有解决问题。

我还发现只有当我在我的代码中引用 ActivityDeparturesBinding class 时才会发生错误,即使它被引用的部分实际上从未被调用过。仅导入它而不引用它不会导致错误。


更新 2:

这是使用布局的activity:

class DeparturesActivity : BaseVinPlateActivity<DeparturesViewModel, ActivityDeparturesBinding>() {

    companion object {
        fun getStartIntent(context: Context) = Intent(context, DeparturesActivity::class.java)
    }

    @Inject
    override lateinit var viewModel: DeparturesViewModel

    override val layout: Int = R.layout.activity_departures

    override fun injectThis(component: ActivityComponent) {
        component.inject(this)
    }

    override fun getToolbarTitleId(): Int = R.string.departures_title

    override fun initializeDataBindings(dataBinding: ActivityDeparturesBinding) {
        dataBinding.viewmodel = viewModel
    }
}

abstract class BaseVinPlateActivity<T: BaseVinPlateViewModel, U: ViewDataBinding> : CompoundsBaseActivity()  {

    protected abstract var viewModel: T
    protected abstract val layout: Int

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == BARCODE_RESULT_CODE_ACTIVITY && resultCode == Activity.RESULT_OK) {
            val barcodeResult = data?.getStringExtra(BARCODE_RESULT_ACTIVITY)
            viewModel.setBarcodeResult(barcodeResult)
        }
    }

    override fun initializeView() {
        super.initializeView()
        val dataBinding = inflateDataBinding<U>(layout)
        initializeDataBindings(dataBinding)
        with (viewModel) {
            setBindValidator(Validator(dataBinding))
            loadData()
        }
    }

    protected abstract fun initializeDataBindings(dataBinding: U)
}

如果我删除 initializeDataBindings() 函数,错误就消失了。请注意,仅注释函数体是不够的,我不得不删除整个函数。

这闻起来像 compiler/tools 错误。

我们可以通过几种方式绕过编译错误(可能还有更多方式)。我们想到的最好方法是将抽象函数转换为抽象 lambda 属性.

Parent class:

abstract class BaseVinPlateActivity<T: BaseVinPlateViewModel, U: ViewDataBinding> : CompoundsBaseActivity()  {

    protected abstract val initializeDataBinding: U.() -> Unit

    // Rest of code
}

Child class:

class DeparturesActivity : BaseVinPlateActivity<DeparturesViewModel, ActivityDeparturesBinding>() {

    override val initializeDataBinding: ActivityDeparturesBinding.() -> Unit = { viewmodel = this@DeparturesActivity.viewModel }

    // Rest of code    
}

我知道已经晚了,但我想说我也发生过类似的事情,在我的例子中,我有一个使用第三方库的库模块,然后在我的应用程序模块中我使用了 dagger用于注入依赖项,我遇到这个问题是因为,我相信匕首找不到这个第三方库的 class 因为它没有直接在应用程序的依赖项中实现。所以在我的例子中,它得到排序的是改变我将第三方库添加到我的本地库模块的方式,以便使用 api 而不是 implementation.