【Android】今更知るgradle.propertiesの便利な使い方【個人開発】

令和最初のpostとしてはまず今日知ったことを書きたいと思います。
Androidアプリ開発をしていて、app.gradle(またはbuild.gradle)はよく目を通します。
例えばGoogleのsupport libraries群の更新などがあった場合や新しいライブラリをgradleというシステムで管理し、変更を加えたりします。


今回のネタを書こうと思ったのは自作AndroidアプリTwitMorseAdmobの実装をしてみようかと思い、開発を始めたのがきっかけでした。
Admobとは簡単に言えばiOS,AndroidにまたがるGoogle Adsenseみたいな広告です。

よく、無料アプリの画面の下方に広告バナーがあったりするじゃないですか。アレです。
今まで完全に広告無しで運用していたのですが、アプリの開発のモチベーションを高めるには、やっぱりお金になるようなことをしないとな、と思い立ったのです。まあ実際にリリース版にAdmob広告を載せるかどうかはともかく、ちょっと使い方だけ勉強してみようと思い開発に着手しました。

gradle.propertiesの役割

恥ずかしながら、これまではGoogleの公式ドキュメントの通りに書き足したり、真似事で値をセットする程度にしか使っていませんでした。
要するに、gradle.propertiesのキチンとした使い方を知らなかったのです。

Android Studioにおけるgradle.propertiesには意外に便利な活用方法がありました。

ちょっと恥ずかしいですが、ここでTwitMorseにおけるgradle.propertiesを一部公開したいと思います

gradle.properties

android.enableJetifier=true
android.useAndroidX=true
## Admob
admobBannerIdforDebug=ca-app-pub-3940256099942544/6300978111
admobBannerIdforRelease=ca-app-pub-XXXXXXXXXXXXXXXXX/XXXXXXXXXX

一応リリース版のadmobIdは伏せておきますが、Debug用のAdmobIdは公式ドキュメントで「テスト時はこのadmobIDを使うように!!」と注意書きがあるので載せても問題ないかと思います。
コメントは# Admobとすれば良いようです。

さてここからadmobBannerIdforDebugとadmobBannerIdforReleaseをどのように使うかを説明してます。
propertiesは定数の集まり、くらいなイメージでいいと思います。

build.gradleでpropertiesを呼び出す

gradle.propertiesで書いたadmobID達をデバッグビルドか、リリースビルドかでAdmobIdを変える必要があります。

build.gradle

buildTypes {
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            buildConfigField("String", "ADMOB_ID", "\"{$admobBannerIdforDebug}\"")
            resValue "string", "ADMOB_ID", "$admobBannerIdforDebug"
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            buildConfigField("String", "ADMOB_ID", "\"{$admobBannerIdforRelease}\"")
            resValue "string", "ADMOB_ID", "$admobBannerIdforRelease"
        }
}

ポイントは

  • buildConfigField("String", "ADMOB_ID", "\"{$admobBannerIdforDebug}\"")
  • buildConfigField("String", "ADMOB_ID", "\"{$admobBannerIdforRelease}\"")
    • buildConfigField(“String”, “適当な名前”, “\”{$hoge}\””) のようにStringは”\”{$hoge}\””という書き方が必要
    • そうしないとコンパイル通りません
    • これらはkotlin(or Java)コードから呼び出す時に使えます。
  • Build Variants

Build Variantsは以下の画像にある通り、デバッグビルドかリリースビルドかを選択するところです。

AndroidStudioにおけるビルドバリアントの場所

開発中は基本的にdebugビルドを選択しておきます。本番のAPIをコールしたい時などはreleaseを選択します。

kotlinコードで呼び出せるようになる

Build Variantsの設定さえ変えれば、同じコードを何回も書かずに済みます。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // AdMob
    MobileAds.initialize(context, BuildConfig.ADMOB_ID)
}
BuildConfig.ADMOB_ID

これは、ビルド設定(BuildVariants)によって中身が変わることになります。debug buildならdebug用のIDを、release buildならrelease用IDが入ってきます。



build.gradleからresourceも追加できる

更にlayoutファイルなどで定数を使いたい場合、strings.xmlもデバッグビルドかリリースビルドかで変える必要があります。
上述のbuild.gradleの一部にあったresValueはresource追加に使えます。

  • resValue "string", "ADMOB_ID", "$admobBannerIdforDebug"
  • resValue "string", "ADMOB_ID", "$admobBannerIdforRelease"
    • string Resourceとして追加できる。(strings.xmlには反映されない)

これをやっておけばlayout.xmlなどでも

<com.google.android.gms.ads.AdView
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    android:id="@+id/adMobBannerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    ads:adSize="SMART_BANNER"
    ads:adUnitId="@string/ADMOB_ID"/>

このように@string/ADMOB_IDとして参照できるようになります

※2019年5月8日resValueについての記述に誤りがあったので訂正しました。

まとめ
  • gradle.propertiesに書かれた値はbuild.gradleで参照できる
  • buildConfigField()を使うと定数が作れる
  • resValueを使えば、resourceの追加も可能

ちょっとしたGroovyの勉強みたいになりましたが、自分が今説明できる範囲はこんな感じです。
ビルド時の設定については下記のエントリがかなり参考になります。今後は困ったらここを読みたいと思います。pocketさせていただきました。

参考にした資料

この資料は詳しく解説されています。大変勉強になりました!!ありがとうございました!!

コメント

タイトルとURLをコピーしました