Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

背景

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

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という定数名にしました。

gradle.properties
parseApiId=xxxxxxxxxxxxxxxxxxxxx
parseApiKey=xxxxxxxxxxxxxxxxxxxxx

gradle.propertiesを読み込み

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

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

下記の処理がそれです。

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

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

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から参照します。

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";
}
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にあるのでしょうか。ご存知の方がいらっしゃいましたらコメントなどで教えていただけると大変ありがたいです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away