はじめに
みなさんは、AdMobで発行されたアプリIDや広告ユニットのIDの管理ついてどのように行なっていますか?
実際に、テスト用のIDではなく、本番用のIDを発行した際にどのように管理すれば良いのか戸惑いました。
そこで、今回はbuild.gradleを使ってビルドタイプごとに使用するAdMobのIDを切り分けて、コード内へのベタ書きを防ぐ方法を解説します。
ここで紹介する手順に沿って開発を行えば、AdMobで発行される広告用のIDもGitHub等へのコミットを回避して開発を行うことができるようになります。
admob.propertiesを作成する
admob.propertiesを、appやgradleなどのディレクトリが並ぶルートディレクトリに作成します。
DEBUG_ADMOB_APP_ID="ca-app-pub-3940256099942544~3347511713"
DEBUG_ADMOB_BOTTOM_BANNER_AD_UNIT_ID="ca-app-pub-3940256099942544/6300978111"
RELEASE_ADMOB_APP_ID="ca-app-pub-xxx~xxx"
RELEASE_ADMOB_BOTTOM_BANNER_AD_UNIT_ID="ca-app-pub-xxx/xxx"
このとき、4種類の変数を定義します。
- DEBUG_ADMOB_APP_ID
- テスト用のアプリID
- DEBUG_ADMOB_BOTTOM_BANNER_AD_UNIT_ID
- テスト用の広告ユニットID
- RELEASE_ADMOB_APP_ID
- 本番用のアプリID
- RELEASE_ADMOB_BOTTOM_BANNER_AD_UNIT_ID
- 本番用の広告ユニットID
ファイルの設定が終了したら、ルートディレクトリの**.gitignoreにadmob.properties**を追加しておきます。
...
admob.properties
buildConfigField()を使ってKotlinファイルで参照できるようにする
最初に、先ほど設定したadmob.propertiesをbuild.gradleにて読み込みます。
def admobPropertiesFile = rootProject.file("admob.properties")
def admobProperties = new Properties()
admobProperties.load(new FileInputStream(admobPropertiesFile))
android {
...
}
そして、読み込んだ値を使用して各BuildTypeごとにBuildConfigの内容を設定していきます。
android {
...
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.debug
// AdMob
buildConfigField("String", "ADMOB_APP_ID", admobProperties["RELEASE_ADMOB_APP_ID"])
buildConfigField("String", "ADMOB_BOTTOM_BANNER_AD_UNIT_ID", admobProperties["RELEASE_ADMOB_BOTTOM_BANNER_AD_UNIT_ID"])
...
}
debug {
applicationIdSuffix ".debug"
debuggable true
// AdMob
buildConfigField("String", "ADMOB_APP_ID", admobProperties["DEBUG_ADMOB_APP_ID"])
buildConfigField("String", "ADMOB_BOTTOM_BANNER_AD_UNIT_ID", admobProperties["DEBUG_ADMOB_BOTTOM_BANNER_AD_UNIT_ID"])
...
}
}
}
この設定により、Kotlinファイル内でBuildConfig
を通してADMOB_APP_ID
などにアクセスすることができるようになります。
AndroidView(
modifier = Modifier.fillMaxWidth(),
factory = { context ->
val adView = AdView(context).apply {
setAdSize(AdSize.BANNER)
adUnitId = BuildConfig.ADMOB_BOTTOM_BANNER_AD_UNIT_ID
loadAd(AdRequest.Builder().build())
}
adView.rootView
}
)
AndroidManifext.xmlでAdMobのアプリIDを参照できるようにする
先ほどbuildConfigField()
を呼び出した箇所で、manifestPlaceholders
に対する設定を追加します。
def admobPropertiesFile = rootProject.file("admob.properties")
def admobProperties = new Properties()
admobProperties.load(new FileInputStream(admobPropertiesFile))
android {
buildTypes {
release {
...
manifestPlaceholders = [
ADMOB_APP_ID: admobProperties["RELEASE_ADMOB_APP_ID"].replace("\"", "")
]
}
debug {
...
manifestPlaceholders = [
ADMOB_APP_ID: admobProperties["DEBUG_ADMOB_APP_ID"].replace("\"", "")
]
}
}
}
この設定により、AndroidManifest.xmlにおいてADMOB_APP_ID
を参照できるようになりました。
<application>
...
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="${ADMOB_APP_ID}"
/>
</application>
replace()を呼び出す理由
admob.propertiesで、DEBUG_ADMOB_APP_ID
を設定したときにダブルクオーテーションで囲みました。
DEBUG_ADMOB_APP_ID="ca-app-pub-3940256099942544~3347511713"
...
そのため、この値をそのままmanifestPlaceholders
に渡すと、AndroidManifest.xmlの内容がマージされたときに次のようになってしまいます。
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value = ""ca-app-pub-3940256099942544~3347511713""
/>
その結果、次のようなエラーが出力されてアプリはクラッシュしてしまいます。
******************************************************************************
* Invalid application ID. Follow instructions here: *
* https://googlemobileadssdk.page.link/admob-android-update-manifest *
* to find your app ID. *
* Google Ad Manager publishers should follow instructions here: *
* https://googlemobileadssdk.page.link/ad-manager-android-update-manifest. *
******************************************************************************
これを防ぐために、replace("\"", "")
を呼び出して先頭と末尾の"
を取り除いた状態で渡しています。
buildConfigの機能を有効にする
build.gradleにて、何も設定しない状態でbuildConfigField()
を呼び出した場合、次のようなエラーが発生する可能性があります。
Build Type 'debug' contains custom BuildConfig fields, but the feature is disabled.
Affected Modules: app
Build Typeがrelease
の場合には次のようなエラーが表示されます。
Build Type 'release' contains custom BuildConfig fields, but the feature is disabled.
Affected Modules: app
これを解決するためには、build.gradleにてbuildFeatures
の設定を追加しましょう。このとき、buildConfig = true
を設定します。
android {
...
buildFeatures {
buildConfig = true
}
buildTypes {
...
}
}
これにより、build.gradleを同期しても先ほどのようなエラーは表示されなくなったと思います。
BuildConfigが見つからない
build.gradleを同期しただけでは、アプリケーションファイル内でBuildConfig
を参照できない場合があります。
Android Studioで次の手順を実行します。
- Buildをクリックして、Clean Projectを実行する
- Fileをクリックして、**Invalidate Caches...**をクリックして、Invalidate and Restartを実行する
- Buildをクリックして、Rebuild Project を実行する
僕の場合は、3番目のRebuild Projectの実行により、BuildConfig
の参照が解決しました。
つまり、com.projectname.appname.BuildConfig
が生成されるということですので、これをインポートしましょう。
import com.projectname.appname.BuildConfig
まとめ
あまりbuild.gradleには、依存関係の追加時以外触れてこなかったので、ビルドタイプごとに同じで変数で違う値をBuildConfig
を通して公開できるということに非常に感動しました。
やはり、API Keyなども含めてリポジトリへのコミットはできる限り避けたいので、今後もbuild.gradleを使いながら工夫してより良い開発体験を目指していきたいです。
参考にした記事