LoginSignup
13
10

More than 5 years have passed since last update.

Androidでアプリの定数をBuildConfigではなくYamlから自動生成したい - Gradle Config Plugin

Last updated at Posted at 2017-11-27

経緯

やりたかったこと

  • アプリケーションで使う定数的な値を一括管理したい
  • ProductFlavorごとにAPIの向き先など設定情報を変えたい
  • それらを管理するためのクラスを自分で作りたくない

BuildConfigを使わない理由

  • build.gradleが肥大化する
  • 定数の記述が多少面倒
    • いちいち型を記述しないといけないので面倒
    • すべての値を文字列で埋め込むのも好みでない

Gradle Config Plugin

特徴

  • ProductFlavorごとにYamlを定義できる
  • Yamlから値に参照するためのクラスが自動生成される
    • 値の型はYamlの記述内容に合わせて自動的に解決してくれる

導入

buildscriptにプラグインを追加

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "gradle.plugin.com.tmiyamon:gradle-config:0.2.1"
  }
}

プラグインを適用する

アプリのプロジェクトがあるbuild.gradleに以下を追記
(app/build.config)

apply plugin: 'com.tmiyamon.config'

使い方

コンフィグファイルを作る

アプリのプロジェクトルートにconfigディレクトリを追加する

ファイル名は以下が対応している

config/default.yml
config/default_secret.yml
config/${productFlavor}.yml
config/${productFlavor}_secret.yml
config/${buildType}.yml
config/${buildType}_secret.yml

ProductFlavorに応じてこれらのファイルが適宜読み込まれて1つのクラスが生成される

*_seciet.ymlのファイルは秘匿情報を入れることができる。使う場合はバージョン管理下に置かないように.gitignoreに入れておくこと

Yamlに項目を埋めていく

あとはYamlを作っていくだけ

size: 2
server: google.com
section:
  size: 3
  servers: [ {name: yahoo.com}, {name: amazon.com} ]

このように記述するとビルド時にSettingsという名前のクラスが生成される

生成されたクラスはこのように値を参照できるようになっている

Settings.size   // => 2
Settings.server // => google.com
Settings.section.size // => 3
Settings.section.servers.get(0).name // => yahoo.com
Settings.section.servers.get(1).name // => amazon.com

便利!!!😃

応用

kotlinの拡張を使って定数と引数を組み合わせた文字列を作る

例えばベースのURLだけYamlに書いておいて、パスの組み合わせをkotlinの拡張で実現する

url:
  base: https://hoge.com

続いてkotlin側でプロパティを拡張する

fun Settings.Url.getDetail(id: String) = "$base/detail/$id"

こんな感じでアプリ上で参照できるようになる

Settings.url.getDetail("1") // => https://hoge.com/detail/1

あとがき

設定情報は何かと細かく組み合わせたり、たくさん記述したりする部分なので、管理しやすくしたい

このプラグインはそうした部分の要求を叶えてくれるよいアプローチに思えた

13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10