i++

プログラム系のメモ書きなど

Android : gradle で定義された versionName を string リソースとして利用する

Android アプリではバージョン情報として versionCode と versionName があり、以下の様な形で gradle (app) で設定します。

defaultConfig {
    applicationId "com.example.increment"
    minSdkVersion 21
    targetSdkVersion 23
    versionCode 1
    versionName "0.1"
}

アプリのバージョン情報について TextView などで versionName を表示したい場合は、ここで定義された変数をアプリから参照できるようにするための処理を追加します(下3行)。

defaultConfig {
    applicationId "com.example.increment"
    minSdkVersion 21
    targetSdkVersion 23
    versionCode 1
    versionName "0.1"
}

applicationVariants.all { variant ->
    variant.resValue "string", "versionName", variant.versionName
}

これで、layout系の xml の中などで @string/versionName と指定すると "0.1" という文字列が得られるようになります。

IDE上では"定義されていません"というエラーが表示されますが、実際にはビルドが通り、きちんと文字列が取得できます)

解説

applicationVariants.all { variant -> ... } は全ての Build Variant (debug/release といった Build Type と Product Flavor の組み合わせ)に対して処理を行うという意味で、この中の

variant.resValue リソースの種類, リソース名, リソースの値

という構文の記述でリソースを追加で作成しています。

これは com.android.build.gradle.api.ApkVariant 型を持った variant の void resValue(String type, String name, String value) という関数の呼び出しです。

今回の例ではリソースの値には、defaultConfig で定義された versionName を引っ張ってきており、結果的には以下の行を string.xml に加えたのと同じような効果が得られています。

<string name="versionName">0.1</string>

参考