LoginSignup
4
0

More than 1 year has passed since last update.

【Android】AdMobのアプリIDや広告ユニットIDをコミットしないで管理する方法

Posted at

はじめに

みなさんは、AdMobで発行されたアプリIDや広告ユニットのIDの管理ついてどのように行なっていますか?
実際に、テスト用のIDではなく、本番用のIDを発行した際にどのように管理すれば良いのか戸惑いました。

そこで、今回はbuild.gradleを使ってビルドタイプごとに使用するAdMobのIDを切り分けて、コード内へのベタ書きを防ぐ方法を解説します。
ここで紹介する手順に沿って開発を行えば、AdMobで発行される広告用のIDもGitHub等へのコミットを回避して開発を行うことができるようになります。

admob.propertiesを作成する

admob.propertiesを、appgradleなどのディレクトリが並ぶルートディレクトリに作成します。

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

ファイルの設定が終了したら、ルートディレクトリの**.gitignoreadmob.properties**を追加しておきます。

.gitignore
...
admob.properties

buildConfigField()を使ってKotlinファイルで参照できるようにする

最初に、先ほど設定したadmob.propertiesbuild.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で次の手順を実行します。

  1. Buildをクリックして、Clean Projectを実行する
  2. Fileをクリックして、**Invalidate Caches...**をクリックして、Invalidate and Restartを実行する
  3. Buildをクリックして、Rebuild Project を実行する

僕の場合は、3番目のRebuild Projectの実行により、BuildConfigの参照が解決しました。
つまり、com.projectname.appname.BuildConfigが生成されるということですので、これをインポートしましょう。

import com.projectname.appname.BuildConfig

まとめ

あまりbuild.gradleには、依存関係の追加時以外触れてこなかったので、ビルドタイプごとに同じで変数で違う値をBuildConfigを通して公開できるということに非常に感動しました。

やはり、API Keyなども含めてリポジトリへのコミットはできる限り避けたいので、今後もbuild.gradleを使いながら工夫してより良い開発体験を目指していきたいです。

参考にした記事

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0