はじめに
CYBIRD Advent Calendar 2024 21日目を担当します、@R_araiと申します。
20日目は@yoooosuさんの「【Unity】UnityでHD-2Dの表現をしてみた」でした!
自己紹介
株式会社サイバードにてAndroidアプリのネイティブエンジニアをしております。
普段は担当アプリの運用や開発を行なっております。
概要
この記事ではTargetSDK33から34へ更新する際に発生した、BuildConfig.VERSION_NAMEとBuildConfig.VERSION_CODEが参照出来なくなった問題の解決策について記載します。
目次
発生した問題
TargetSDK33から34へ更新する事によりサポートする最小のAndroid Gradle Plugin(AGP)バージョンが8.1.1に上げられました。
その為今回対応するアプリをAGP8.1.1以上に上げたところ、このAGPの更新が原因でBuildConfig.VERSION_NAMEを参照する事が出来なくなりました。
そもそもBuildConfig.VERSION_NAMEって何ぞや?
BuildConfig.VERSION_NAMEはbuild.gradleのdefaultConfigブロック内で以下のように定義することでBuildConfig.javaに定数が自動生成されBuildConfig.VERSION_NAMEを呼ぶだけでどこでもバージョン名を参照する事が出来ます。
//build.gradle
android {
defaultConfig {
versionName "1.0.0"
versionCode 100000
}
}
バージョン名やバージョンコードはアプリケーションのバージョン比較やバージョンに基づいて機能を有効化/無効化するなど使用用途が多いので便利な機能でした。
PackageInfoから取得する方法もありますが、PackageInfoだとcontextが必要になる為、BuildConfigの方が使い勝手の良い機能だと思います。
defaultConfigにversionCodeを定義するとversionName同様にBuildConfig.VERSION_CODEでint型のバージョンコードを取得できます。
解決策
自分が調べたところ以下3点の解決策がありました。
1,gradle.propertiesにBuildConfigの生成をtrueに設定する方法
2,PackageInfoからバージョン名を取得する方法。
3,生成されなくなったVERSION_NAMEを自前で定義する方法。
1,gradle.propertiesにBuildConfigの生成をtrueに設定する方法
ルートのgradle.properties以下の設定を追加するだけで今まで通りBuildConfig.VERSION_NAMEでバージョン名を取得出来る様になります。
android.defaults.buildfeatures.buildconfig=true
じゃあこれでいいじゃんってなると思うのですが、この設定は既に非推奨になっていてAGP8.4から完全に削除されると明記されています。
その場凌ぎで使うのであればこれで問題ないですが、出来れば使いたくない方法です。
2,PackageInfoからバージョン名を取得する方法。
先程も述べたPackageInfoから取得する方法です。
呼び出し箇所がcontextを持っているのであれば、一番分かりやすい修正方法だと思います。
ただし、呼び出しの全ての箇所でcontextを持っておく必要があり、もしcontextを受け取れない設計になっていると改修規模が大きくなってしまいます。
3,生成されなくなったVERSION_NAMEを自前で定義する方法。
BuildConfigに定義が無くなったのなら自分で定義すればいいじゃない。
生成されなくなったBuildConfig.VERSION_NAMEとBuildConfig.VERSION_CODEを自分でBuildConfigに定義する方法です。
出来るだけ呼び出し方を変えずかつ非推奨の機能を使わずに改修したいので今回はこちらの方法で解決しました。
ルートのgradleに以下を記述
buildscript {
project.ext.set("android_version_code", 100000)
project.ext.set("android_version_name", "1.0.0")
}
上記はビルドスクリプト全体で共有出来るカスタムプロパティを設定しています。
次に上記で作ったカスタムプロパティを使って各モジュールのbuild.gradleに以下を記載します。
android {
defaultConfig {
buildConfigField 'int', 'VERSION_CODE', "${project.android_version_code}"
buildConfigField 'String', 'VERSION_NAME', "\"${project.android_version_name}\""
}
buildFeatures {
buildConfig true
}
}
defaultConfig内にbuildConfigFieldを記述する事によってBuildConfigクラスにint型のVERSION_CODEという定数がBuildConfigクラスに定義されます。
buildFeaturesのbuildConfig trueはBuildConfigを生成する様に指示する設定です。
この設定をしておかないとBuildConfigクラスが生成されないので注意しましょう。
これでcleanしてからビルド出来れば今まで通りBuildConfig.VERSION_NAMEを呼ぶ事が出来る様になっているはずです。
最後に
今回はAGP8.3に更新した時に発生したBuildConfig.VERSION_NAMEが参照出来なくなった問題の解決策についてまとめてみました。
利用頻度も高い機能かと思うので同じ現象で悩んでいる方がおられましたら、参考にしていただけたら幸いです。
明日のCYBIRD Advent Calendar 2024 22日目は@cy-tsuzawaさんの[「Sign in with Apple のユーザーを別のチームに移行してみる」]です!
お楽しみに!