web-dev-qa-db-ja.com

resValue gradleエラー:「generated.xml」のサポートされていないタイプ「String」

数週間前に質問を投稿しました buildTypeに応じてリソースをオーバーライドする方法 。そしてちょうど昨日 AndroidのGradleプラグインリリース がありました。 G +のこの投稿 に基づいて、この質問を書くことにしました。

詳細に説明した問題:

buildTypeに応じていくつかのリソース値を作成したいのですが、これは正常に動作しません。ファイル「generated.xml」は、コマンドラインで完全なビルドを行った場合にのみ作成されます。

gradlew build

しかし、私はまた、完全なプロジェクトをコマンドラインで構築することによってエラーを取得します。

* What went wrong: Execution failed for task ':app:merge<buildVariant>Resources'.
Unsupported type 'String' in file C:\Users\...\build\res\generated\release\values\generated.xml

他のすべてのビルド試行では、このファイルは作成されません。私は次のことを試しました:

  • iDE経由:
    • プロジェクトを再構築
    • 外部タスク「assembleBuildVariant」を実行します
  • コマンドライン経由:
    • gradlew assembleBuildVariant

奇妙なgradleコンソールの出力:

:app:generateBuildVariantResValues UP-TO-DATE

私のbuild.gradle:

buildTypes {
    debug{
        buildConfigField "String", "FOO", "\"FOO DEBUG\""
        resValue "String", "RES FOO", "RES FOO DEBUG"
    }
    release {
        buildConfigField "String", "FOO", "\"FOO RELEASE\""
        resValue "String", "RES FOO", "RES FOO RELEASE"
    }
}

私の「generated.xml」:

<!-- Automatically generated file. DO NOT MODIFY -->

<!-- Values from build type: release -->
<item name="RES FOO" type="String">RES FOO RELEASE</item>

私の質問:

これはバグですか、何か見落としましたか?そして、なぜこのファイルはIDE上のRebuildによって作成されないのですか?

私のbuild.gradle(rciovatisの回答に基づいて2014-02-10を更新):

defaultConfig {
    minSdkVersion 14
    targetSdkVersion 19
    versionCode 1
    versionName "1.0"
    resValue "string", "RES_FOO", "RES FOO"
}

buildTypes {
    debug{
        buildConfigField "String", "FOO", "\"FOO DEBUG\""
        resValue "string", "RES_FOO", "RES FOO DEBUG"
    }
    release {
        buildConfigField "String", "FOO", "\"FOO RELEASE\""
        resValue "string", "RES_FOO", "RES FOO RELEASE"
    }
}

2014-02-14 IT WORKSの更新:

gradleの更新Androidプラグイン すべてが正常に動作します:

/ build/res/all /に次のフォルダーが表示されます。

  • すべて
  • 生成(->ここでは、resValueによって生成されたリソース値を見つけます)

最初のフォルダーallには、すべてのマージされたリソースが含まれます。方向 all/<buildVariant>/values/values.xml私の場合、生成されたリソースが見つかります。

// for buildType DEBUG
<item name="TESTFOO" type="string">TEST FOO DEBUG</item>
// for buildType RELEASE
<item name="TESTFOO" type="string">TEST FOO RELEASE</item>

コードで値を取得するには、生成されたリソースを他のすべてのリソースと同様に使用します。

getResources().getString(R.string.TESTFOO)
36
owe

defaultConfigブロックにもリソースを追加して解決しました。あなたにとっては次のようなものでしょう:

Android {
    defaultConfig {
        resValue "string", "RES_FOO", "RES FOO RELEASE"
    }

    buildTypes {
        debug{
            buildConfigField "String", "FOO", "\"FOO DEBUG\""
            resValue "string", "RES_FOO", "RES FOO DEBUG"
        }
        release {
            buildConfigField "String", "FOO", "\"FOO RELEASE\""
            resValue "string", "RES_FOO", "RES FOO RELEASE"
        }
    }
}

その点に注意してください:

  • アイテムタイプはstringではなくStringでなければなりません
  • アイテム名にスペースを含めることはできません(通常のリソース名として)

編集:0.8.3以降、ビルドタイプブロックでresValueを宣言するだけで正常に動作するはずです。

62
rciovati