Kotlin(Android開発)で環境変数を使いたい
当方、KotlinでAndroid開発を始めて数日の弱者です。
マサカリ大歓迎です。
個人開発でTwitter APIを使ってAndroidアプリを作っています。
その際にSecret Keyなどを使用したいのですが、さすがにそれをGitHubにpushするのは避けたいです。
Android開発ではそのような秘匿情報をどうやって管理しているのか調べたのでまとめておきます。
秘匿情報をプログラムから参照する方法
適当に調べていたところ、こちらのREADMEを見つけました。
読んでみると、今回やりたい手順としては以下のようになりそうです。
-
app/build.gradle
と同階層にgradle.properties
ファイルを新規追加 -
gradle.properties
にkey=valueの形式でキーを追加 -
app/build.gradle
のbuildTypes
にbuildConfigField
として追加 - App全体をビルド
- 2で設定したペアが
BuildConfig.java
にkey = valueの形で登録される - プログラム上で
BuildConfig.KEY
の形で参照できる -
gradle.properties
をapp/.gitignore
に追加
では具体的に見ていきます。
gradle.propertiesを追加
app/
にgradle.properties
ファイルを新規追加し、以下のように任意の値をkey=valueの形でセットします。
API_KEY = "秘匿にしたい文字列"
API_SECRET = "秘匿にしたい文字列"
app/build.gradleの設定
プロジェクトをセットアップした段階で以下のような構造のbuild.gradle
ができていると思います。
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
namespace 'xxxx'
compileSdk 32
defaultConfig {
...
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
...
ここのbuildTypes
にbuildConfigField
を追加していきます。
buildTypes {
release {
...
buildConfigField("String", "API_KEY", API_KEY)
buildConfigField("String", "API_SECRET", API_SECRET)
}
debug {
buildConfigField("String", "API_KEY", API_KEY)
buildConfigField("String", "API_SECRET", API_SECRET)
}
}
buildConfigFieldとは🤔
Field definition for the generated BuildConfig class.
BuildConfigクラスのフィールド定義をするそうです。
なおBuildConfigは最初にアプリをビルドした段階で生成されます。
初期状態は以下のようになっています。
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "xxxx";
public static final String BUILD_TYPE = "debug";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
}
.gitignoreする
以上の設定でアプリをビルドしたタイミングでBuildConfig.java
にKeyが追加されます。
追加された変数はプログラム上で以下のように参照することができます。
Log.d(TAG, BuildConfig.API_KEY) // 任意のAPI Keyが出力される
あとはgradle.properties
ファイルをapp/.gitignore
に追加しておけばGitHub上に秘匿情報をpushせずにすみますね!
あとがき
(この記事を書いているときに見つけました、、、)
Discussion