📃

Android アプリ開発において文字列をどこに定義するべきか

に公開

文字列をどこに定義するべきか

Android アプリ開発をしていると、文字列を strings.xml に定義するべきか、 Java や Kotlin の定数として定義するべきか、一度は迷ったことがありませんか?本記事では、 strings.xml の基本と Firebase Remote Config の基本は知っている前提で、文字列をどこに定義するべきかを説明していきます。

結論

まず最初に結論から記述します。

  • ユーザー向けに表示する文言や翻訳対象 → strings.xml
  • 環境やビルドごとに変わる値 → buildConfigField
  • ソースコード内で固定的にしか使わない → Kotlin の定数(const val
  • リモートでときどき変更したい値 → Firebase Remote Config
  • 絶対に機密にしなければいけないキーやトークン → サーバーから取得し、アプリ内には基本的には保持しない。

解説

strings.xml に置くのが適しているケース

  • ユーザーにそのまま表示される URL
    (例: ヘルプページやプライバシーポリシーのリンクテキスト)
  • 翻訳や地域ごとに変わる可能性がある URL
    (例: https://example.com/jp/privacyhttps://example.com/en/privacy)
  • デザイナーや翻訳者が URL を含めた文言を管理したいとき

「リソース(翻訳対象の文言)」として扱うので strings.xml が自然です。

Kotlin の定数や BuildConfig に置くのが適しているケース

  • アプリ内部でサーバー API にアクセスするためのベース URL
    (例: https://api.example.com/v1/)
  • ユーザーには見せない「システム的な設定値」
  • ビルドフレーバーや環境ごとに切り替える値(開発 / ステージング / 本番)

翻訳やローカライズとは関係ないので、 const val や BuildConfig に書く方がベターです。

ビルドバリアントによって、変更される可能性がある文字列は、 BuildConfig に定義し、変更される可能性がない文字列は、 Kotlin の定数(const val)に定義するのが良いです。

buildConfigField の使い方

buildConfigField は Gradle でビルド時に BuildConfig クラスへ定数を埋め込む仕組みです。 Android 開発で「環境ごとに違う値( URL , API キー, フラグなど)」を管理したいときによく使います。

基本の使い方

app/build.gradle の defaultConfig または buildTypes に書きます。

android {
    defaultConfig {
        applicationId "com.example.app"
        minSdk 24
        targetSdk 35

        // BuildConfig に文字列を埋め込む
        buildConfigField "String", "BASE_URL", "\"https://api.example.com/v1/\""

        // 数値や boolean も可能
        buildConfigField "int", "TIMEOUT_SEC", "30"
        buildConfigField "boolean", "ENABLE_LOG", "true"
    }
}

ビルドすると、自動生成される BuildConfig.java / BuildConfig.kt に以下のような定義が追加されます。

public final class BuildConfig {
    public static final String BASE_URL = "https://api.example.com/v1/";
    public static final int TIMEOUT_SEC = 30;
    public static final boolean ENABLE_LOG = true;
}

Kotlin 側で普通の定数のように使えます。

val url = BuildConfig.BASE_URL
if (BuildConfig.ENABLE_LOG) {
    Log.d("App", "URL = $url")
}

buildTypes ごとに値を変える

例えば debug / release で API の URL を切り替えたい場合:

android {
    buildTypes {
        debug {
            buildConfigField "String", "BASE_URL", "\"https://staging-api.example.com/\""
            buildConfigField "boolean", "ENABLE_LOG", "true"
        }
        release {
            buildConfigField "String", "BASE_URL", "\"https://api.example.com/\""
            buildConfigField "boolean", "ENABLE_LOG", "false"
        }
    }
}

debug ビルドで BuildConfig.BASE_URL を使えば staging-api.example.com が参照され、 release ビルドなら api.example.com が入ります。

productFlavors で環境を分ける

「開発・ステージング・本番」の 3 環境がある場合は productFlavors を使います:

android {
    flavorDimensions "env"

    productFlavors {
        dev {
            dimension "env"
            buildConfigField "String", "BASE_URL", "\"https://dev-api.example.com/\""
        }
        staging {
            dimension "env"
            buildConfigField "String", "BASE_URL", "\"https://staging-api.example.com/\""
        }
        prod {
            dimension "env"
            buildConfigField "String", "BASE_URL", "\"https://api.example.com/\""
        }
    }
}

Discussion