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/privacy と https://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