gradle.propertiesに定義した値をJavaソースから参照する

AndroidStudioでは非公開のAPIのキーなどを`gradle.properties`に定義します。
外部サービス(Parse.comとかTwitterとかAWSとかの)のAPIを利用する時のapiKeyなどをソースから参照する必要があるケースです。

# 背景

例えば、Parse.com を利用するにあたって下記のような感じでJavaソースから参照したい場合です。このように外部サービスのSDKを初期化する際にAPIのKEYなどが要求されることは珍しくないと思います。

```java:MyApplication.java
public class MyApplication extends Application {

    private static final String PARSE_API_ID = "xxxxxxxxxxxxxxxxxxxxx";
    private static final String PARSE_API_KEY = "xxxxxxxxxxxxxxxxxxxxx";

    public MyApplication() {
        super();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Parse.initialize(this, PARSE_API_ID, PARSE_API_KEY);
        ParseInstallation.getCurrentInstallation().saveInBackground();
    }

}
```

# 実装

## gradle.propertiesに定義を追加

gradle.propertiesに使用する値を定義します。今回はParse.comのAPIを使用するため`parseApiId`,`parseApiKey`という定数名にしました。

```java:gradle.properties
parseApiId=xxxxxxxxxxxxxxxxxxxxx
parseApiKey=xxxxxxxxxxxxxxxxxxxxx
```

## gradle.propertiesを読み込み


`build.gradle`にビルド時に`BuildConfig.java`に定義される処理を追加します。

`BuildConfig.java`とはビルド時に自動生成されるファイルです。ここでは`gradle.properties`で定義した変数を`BuildConfig.java`に書き出す処理を`build.gradle`に追加します。

下記の処理がそれです。

```groovy:
buildConfigField "String", "PARSE_API_ID", "\"${project.property("parseApiId")}\""
buildConfigField "String", "PARSE_API_KEY", "\"${project.property("parseApiKey")}\""
```


全体はこんな感じになります。

```groovy:build.gradle
buildTypes {
    debug {
        buildConfigField "String", "PARSE_API_ID", "\"${project.property("parseApiId")}\""
        buildConfigField "String", "PARSE_API_KEY", "\"${project.property("parseApiKey")}\""
    }
    release {
        buildConfigField "String", "PARSE_API_ID", "\"${project.property("parseApiId")}\""
        buildConfigField "String", "PARSE_API_KEY", "\"${project.property("parseApiKey")}\""
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
```

＃上記ではdebug用とrelease用で同じid,keyを使用していますが、`gradle.properties`に両buildTypesのid, keyを設けて処理を分けることで開発版、製品版の使い分けが可能です。

## ビルド

ビルド完了後、`BuildConfig.java`に下記のように参照可能な定数が定義されてるのでこれを`MyApplication.java`から参照します。

```java:BuildConfig.java
public final class BuildConfig {
  // Fields from build type: debug
  public static final String PARSE_API_ID = "xxxxxxxxxxxxxxxxxxxxx";
  public static final String PARSE_API_KEY = "xxxxxxxxxxxxxxxxxxxxx";
}
```

```java:MyApplication.java
public class MyApplication extends Application {

    public MyApplication() {
        super();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Parse.initialize(this, BuildConfig.PARSE_API_ID, BuildConfig.PARSE_API_KEY);
        ParseInstallation.getCurrentInstallation().saveInBackground();
    }

}
```

## gradle.propertiesを.gitignoreに追加

publicなリポジトリにpushする場合は`gradle.properties`が公開されてしまっては元も子もないので`gradle.properties`を`.gitignore`ファイルに下記を追加しましょう。

```:.gitignore
# BuildConfig.java を公開しないようにするため
/build
# gradle.properties を公開しないようにするため
gradle.properties
```

# おまけ

JavaソースからでなくAndroidManifestから参照したい場合は下記方法があります。
http://qiita.com/shts/items/5a0ceab7334c5ad8f4f9

# 質問

iOS開発の場合、これと同じような機能ってxcodeにあるのでしょうか。ご存知の方がいらっしゃいましたらコメントなどで教えていただけると大変ありがたいです。