令和最初のpostとしてはまず今日知ったことを書きたいと思います。
Androidアプリ開発をしていて、app.gradle(またはbuild.gradle)はよく目を通します。
例えばGoogleのsupport libraries群の更新などがあった場合や新しいライブラリをgradleというシステムで管理し、変更を加えたりします。
今回のネタを書こうと思ったのは自作AndroidアプリTwitMorseにAdmobの実装をしてみようかと思い、開発を始めたのがきっかけでした。
Admobとは簡単に言えばiOS,AndroidにまたがるGoogle Adsenseみたいな広告です。
よく、無料アプリの画面の下方に広告バナーがあったりするじゃないですか。アレです。
今まで完全に広告無しで運用していたのですが、アプリの開発のモチベーションを高めるには、やっぱりお金になるようなことをしないとな、と思い立ったのです。まあ実際にリリース版にAdmob広告を載せるかどうかはともかく、ちょっと使い方だけ勉強してみようと思い開発に着手しました。
恥ずかしながら、これまでは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は定数の集まり、くらいなイメージでいいと思います。
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は以下の画像にある通り、デバッグビルドかリリースビルドかを選択するところです。
開発中は基本的にdebugビルドを選択しておきます。本番のAPIをコールしたい時などはreleaseを選択します。
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が入ってきます。
更に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させていただきました。
この資料は詳しく解説されています。大変勉強になりました!!ありがとうございました!!
コメント