【问题标题】:Android library project not using correct resources for debug variantAndroid 库项目没有使用正确的资源进行调试变体
【发布时间】:2019-01-26 18:16:34
【问题描述】:

我的问题与以下问题中描述的差不多:Build variants in Gradle for a Library Project in Android

也就是说,我正在制作一个具有调试和发布构建类型的库模块,并且每种构建类型都有自己的资源(例如在strings.xml 中)。但是,即使在构建调试变体时,也会始终选择发布资源。

我读到的几乎所有内容都表明这已在 Android Studio 3.0 中修复,但我在 3.3 上仍然遇到问题。我看到的一个建议是使用releaseCompiledebugCompile。这些已被弃用,所以我使用了替代品:

debugImplementation project(path: ':myLibrary', configuration: 'debug')
releaseImplementation project(path: ':myLibrary', configuration: 'release')

这会产生这些错误:

ERROR: Unable to resolve dependency for ':app@myAppDebug/compileClasspath': Could not resolve project :myLibrary.
Affected Modules: app

ERROR: Unable to resolve dependency for ':app@myAppDebugAndroidTest/compileClasspath': Could not resolve project :myLibrary.
Affected Modules: app

ERROR: Unable to resolve dependency for ':app@myAppDebugUnitTest/compileClasspath': Could not resolve project :myLibrary.
Affected Modules: app

我已经检查了四次拼写,它与库的名称相匹配。 我之前这样做会导致上述不正确的行为:

implementation project(':myLibrary')

来自库构建文件:

android {
    publishNonDefault true
    ...
    buildTypes {
        debug {}
        release {
            minifyEnabled false
            zipAlignEnabled true
            signingConfig signingConfigs.releaseConfig
            //proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    ...

我还有一个“qa”构建类型,我在讨论中省略了,但我没有理由相信这是相关的,因为我目前没有尝试构建该类型。有什么建议,或者我应该在问题中添加什么?

【问题讨论】:

  • 发生这种情况是因为 strings.xml 是您项目中的全局资源。为了解决您的问题,我需要了解您在库中获取 strings.xml 的原因和内容。也许您正试图以一种不好的方式获得/思考。
  • 我有各种strings.xml 文件,例如一个在库的main 源集中,另一个在它的debug 源集中。在应用程序模块中,如果在构建调试变体时在两个地方都定义了相同的资源,则将使用调试值。在我的库模块中,使用主源集中的值,而不是被调试源集中的值覆盖。这能回答你的问题吗?
  • 目前无法做到这一点,抱歉
  • @FredGrott 嗯,这很愚蠢!谢谢。

标签: android android-resources android-library


【解决方案1】:

您可以通过在您的库项目中添加以下行来更改从您的库中发布的变体:

android { defaultPublishConfig "debug" }

【讨论】:

  • 这不起作用,因为我需要发布调试版本的调试变体和发布版本的发布变体。
  • 然后将其仅添加到库的调试变体块中。
  • 这没有效果 - 仍在选择发布资源。
【解决方案2】:

构建类型debugrelease 是默认build-variants;由configuration 引用可能仅适用于productFlavors(正如Android 库documentation 所暗示的那样)。

  • 更好地使用implementation project(path: ":myLibrary")

  • source-setsmaindebug;可选release

publishNonDefaultdefaultPublishConfig 仅对 external publishing 有用。

根据issue 68778928

图书馆总是现在发布所有变体,因此 DSL 属性无效。

一种可能的解决方法是通过classifier 添加已构建的工件:

artifacts {
    archives file: file('build/outputs/aar/my-library-debug.aar'), classifier: 'debug'
    archives file: file('build/outputs/aar/my-library-release.aar'), classifier: 'release'
 }

【讨论】:

  • 我正在使用implementation project(),这就是总是选择发布资源的问题(文档在其用法中不包含“路径”一词)。我有主要、调试和发布源集。我尝试了artifacts 块,但似乎没有效果。我希望您的第一句话是不正确的,并且有一种方法可以使其适用于构建类型。我真的不想创建一个基本上反映构建类型的风味维度——这听起来像一团糟。感谢您抽出宝贵时间整理此答案。
  • @nasch 情况是这曾经有效,但由于3.0.0 不再有效...链接构建JARAAR 包似乎是最少的开销,无需定义productFlavors.
  • 我不确定我是否遵循。为了让 AAR 链接,我需要从这个项目或另一个项目中构建一个库。构建该库时,如何选择调试和发布资源?
猜你喜欢
  • 2013-08-21
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多