GradleのresValueで値をリソースに設定する

あらすじ

FacebookのAPIを使うために facebookAppId を取得したが、このAPI Keyを設定ファイル( AndroidManifest.xml )外に追い出すのに苦労した。

Gradle力が低いので、もっと良いやり方があるかもしれない。

1.strings.xmlファイルを開きます。パスの例:/app/src/main/res/values/strings.xml。 2.新しい文字列を、facebook_app_idの名前とFacebookアプリIDとともに追加します。

やりたいこと

  • facebookAppIdgradle.properties に定義したい
  • AndroidManifest.xmlgradle.properties から参照した文字列を埋め込みたい
  • ただし、プロパティに定義したKeyは数値のみ(文字数値入り混じったKeyなら問題ない)

manifestPlaceholdersに登録して参照(うまくいかなかった)

  • gradle.properties
    • キーを書いた
facebookAppId=123456711111111
  • build.gradle
    • productFlavorsgetProperty("facebookAppId") と記載し、 gradle.properties から値を呼び出した
    productFlavors {
        develop {
            manifestPlaceholders = [
                                    facebook_app_id: getProperty("facebookAppId")]
            略
        }
    }
  • AndroidManifest.xml
        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="${facebook_app_id}" />

これ、確かに参照はできるんだけどFacebookSDKの中でKeyが数値とみなされて applicationId cannot be null となってしまった。

そして、 build.gradle の中で何とか文字列に変換して渡そうとしてもうまくいかなかった…。

resValueに登録して参照(うまくいった)

同じような事をした人がおり、その回答は resValue でリソースとして登録すればいけるというものだったので試したところうまくいった。

  • gradle.properties
    • 変更なし
  • build.gradle
    • 参照のしかたを resValue に変更した
    • これで @string/〜 の形式でアクセスできるようになり、そして文字列としてFacebookSDKに渡されるようなので、無事にKeyが通った
    productFlavors {
        develop {
            resValue("string", "facebook_app_id", getProperty("facebookAppId"))
            略
        }
    }
  • AndroidManifest.xml
        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id" />