Kotlin(Android開発)で環境変数を使いたい

2022/10/15に公開

当方、KotlinでAndroid開発を始めて数日の弱者です。
マサカリ大歓迎です。

個人開発でTwitter APIを使ってAndroidアプリを作っています。
その際にSecret Keyなどを使用したいのですが、さすがにそれをGitHubにpushするのは避けたいです。
Android開発ではそのような秘匿情報をどうやって管理しているのか調べたのでまとめておきます。

秘匿情報をプログラムから参照する方法

適当に調べていたところ、こちらのREADMEを見つけました。
https://github.com/futurice/android-best-practices#gradle-configuration

読んでみると、今回やりたい手順としては以下のようになりそうです。

  1. app/build.gradleと同階層に gradle.properties ファイルを新規追加
  2. gradle.propertiesにkey=valueの形式でキーを追加
  3. app/build.gradlebuildTypesbuildConfigFieldとして追加
  4. App全体をビルド
  5. 2で設定したペアがBuildConfig.javaにkey = valueの形で登録される
  6. プログラム上でBuildConfig.KEYの形で参照できる
  7. gradle.propertiesapp/.gitignoreに追加

では具体的に見ていきます。

gradle.propertiesを追加

app/gradle.propertiesファイルを新規追加し、以下のように任意の値をkey=valueの形でセットします。

app/gradle.properties
API_KEY = "秘匿にしたい文字列"
API_SECRET = "秘匿にしたい文字列"

app/build.gradleの設定

プロジェクトをセットアップした段階で以下のような構造のbuild.gradleができていると思います。

app/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'
        }
    }
...

ここのbuildTypesbuildConfigFieldを追加していきます。

app/build.gradle
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とは🤔
https://developer.android.com/reference/tools/gradle-api/4.2/com/android/build/api/variant/BuildConfigField?authuser=1

Field definition for the generated BuildConfig class.

BuildConfigクラスのフィールド定義をするそうです。
なおBuildConfigは最初にアプリをビルドした段階で生成されます。

初期状態は以下のようになっています。

app/build/generated/source/buildConfig/debug/com.example.hoge/BuildConfig.java
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せずにすみますね!

あとがき

https://developer.android.com/studio/build/gradle-tips#share-custom-fields-and-resource-values-with-your-app-code
こちらにわかりやすく書いてました。
(この記事を書いているときに見つけました、、、)

Discussion