AndroidStudioでは非公開のAPIのキーなどをgradle.properties
に定義します。
外部サービス(Parse.comとかTwitterとかAWSとかの)のAPIを利用する時のapiKeyなどをソースから参照する必要があるケースです。
背景
例えば、Parse.com を利用するにあたって下記のような感じでJavaソースから参照したい場合です。このように外部サービスのSDKを初期化する際にAPIのKEYなどが要求されることは珍しくないと思います。
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
という定数名にしました。
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")}\""
全体はこんな感じになります。
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
から参照します。
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";
}
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
ファイルに下記を追加しましょう。
# BuildConfig.java を公開しないようにするため
/build
# gradle.properties を公開しないようにするため
gradle.properties
おまけ
JavaソースからでなくAndroidManifestから参照したい場合は下記方法があります。
http://qiita.com/shts/items/5a0ceab7334c5ad8f4f9
質問
iOS開発の場合、これと同じような機能ってxcodeにあるのでしょうか。ご存知の方がいらっしゃいましたらコメントなどで教えていただけると大変ありがたいです。