重建 Android Instant App 后,使用功能模块中基本模块中定义的颜色失败

Using colors defined in base module from feature module fails after rebuilding the Android Instant App

我的 Instant App 项目中有一个 base 模块和一个名为 query 模块的功能模块。

我的 QueryActivityquery 模块中使用了 base 模块中的颜色。

QueryActivity.kt:

@ColorInt
val textColor: Int = when (resultCode) {
    FetchAddressIntentService.RESULT_SUCCESS -> android.R.color.white
    FetchAddressIntentService.RESULT_FAILURE -> R.color.accent // this color is inside the base module
    else -> R.color.accent // this color is inside the base module
}

如果我尝试 run 该项目,它可以正常工作,没有任何问题。但是如果我 rebuild 这个项目,它会给我以下错误:

../net/epictimes/uvindex/query/QueryActivity.kt
Error:(133, 63) Unresolved reference: color
Error:(134, 27) Unresolved reference: color

指向那些颜色值。

我通过在 query 模块中添加另一个 colors.xml 文件并从中引用 base 颜色来解决这个问题。它运作良好。您可以在 this commit.

中看到差异
<color name="query_location_success_text">@android:color/white</color>
<color name="query_location_fail_text">@color/accent</color>

现在它可以工作,但我不确定为什么。这是正确的方法吗?我的问题是 base 模块中的资源不应该可以从功能模块访问吗?

版本:

Android target/compile SDK: 26

Kotlin: 1.1.50

Instant Apps: 1.1.0

这是我的一个开源项目,你可以看到整个项目here

谢谢

是的,当您使用完全限定名称 (package_name.R.resource_name) 引用基本模块中的资源时,可以从功能模块访问它。

基本模块和子模块具有不同的包名(您的基本功能包名称是 net.epictimes.uvindex,而您的功能模块包名称是 net.epictimes.uvindex.query)。

每个包都包含自己的一组资源,它们的资源 ID 在编译期间收集在单独的 R 包中:

  • net.epictimes.uvindex.R - 用于您的基本功能模块
  • net.epictimes.uvindex.query.R - 用于您的功能模块

要从“查询”功能模块访问基本功能的“强调”颜色资源,请使用 net.epictimes.uvindex.R.color.accent 标识符:

FetchAddressIntentService.RESULT_FAILURE -> net.epictimes.uvindex.R.color.accent