在AndroidTest BuildConfig.java类中无法访问BuildConfigField R.style.AKTheme

时间:2018-05-16 04:32:44

标签: android android-gradle android-testing

我的项目有不同的构建类型,即调试,测试和生产,并且还有不同的产品风格,即QA和集成。我已经定义了

buildConfigField 'int', 'APP_THEME', 'R.style.AKTheme'

在productFlavors中

为每个风格分别设置一个主题。生成的BuildConfig.java for app源集具有APP_THEME field,并且按预期工作。

最近我开始为我的应用程序编写测试测试。当我尝试运行这些测试时,Android studio会给我一个无法解析AKTheme 的错误,即

测试源集的生成final int APP_THEME = R.style.AKTheme中的

BuildConfig.java

生成的R.style.AKTheme文件(测试源集)似乎无法访问BuildConfig.java。我在互联网上搜索但没有找到任何帮助。

3 个答案:

答案 0 :(得分:0)

R.style.AKTheme是引用,而不是值,而在BuildConfig中,您只能使用值 有几种方法可以达到你想要的效果:

  1. 使用BuildConfig中样式的String名称:
    buildConfigField 'String', 'APP_THEME', '"AKTheme"'
    然后在代码中获取样式res id:
    int style = context.getResources().getIdentifier(BuildConfig.APP_THEME, "style", context.getPackageName());
    现在您可以使用style
  2. 您可以使用不同的源集 如果使用不同的构建类型,则可以为该构建类型创建一个目录,并在该目录中专门为该构建类型添加任何不同的资源。该目录应该在与main sources目录相同的目录中创建,并且命名与buildType完全相同。详情:https://developer.android.com/studio/build/build-variants

答案 1 :(得分:0)

我遇到了同样的问题。我在build.gradle中有此选项,以根据环境获取正确的ssl证书。 :

buildConfigField 'int', 'SSL_CERTIFICAT_RAWRES_', 'R.raw.devcert'

这正在构建和运行项目,但是当我想运行任务时遇到了一个问题:“ compileDebugAndroidTestJavaWithJavac”(在我的案例中用于声纳)。编译器在自动生成buildConfig文件时找不到资源文件R。

解决方案是在build.gradle中放入一个字符串来标识我的证书文件“ devcert”,而不是直接使用resInt“ R.raw”:

buildConfigField 'String', 'SSL_CERTIFICAT_RAWRES_STRING', '"devcert"'

然后在我的代码中,我得到像这样的原始文件证书:

final int raw = context.getResources().getIdentifier(BuildConfig.SSL_CERTIFICAT_RAWRES_STRING, "raw", context.getPackageName());

这样,生成的buildConfig可以使用上面的代码正确找到String标识符以检索所需的原始文件。

答案 2 :(得分:0)

我在这里找到了答案:https://developer.android.com/studio/test#create_instrumented_test_for_a_build_variant

就我而言,我的测试项目和主项目引用了不同的包名称,例如在 BuildConfig.java 的顶部,一个引用包“com.xxx.xxx”,而一个引用包“com.xxx.xxx.test”

添加行

<块引用>

testApplicationId = "com.xxx.xxx"

在应用级 build.gradle 文件中的 defaultConfig 为我解决了这个问题