AdMob+Firebase 102 Android: アプリを更新せずにアプリの動作を調整

1. はじめに

Google Play ストアでアプリを公開した後、アプリ内のいくつかのパラメータの値を調整する必要があるとします。通常は、アプリの新しいバージョンを再公開し、ユーザーもスマートフォンでアプリを更新する必要があります。

一般的に、アプリに長期的な変更をコミットする場合は、アプリの更新が機能します。しかし、アプリ内のいくつかのパラメータの値を頻繁に調整する場合はどうでしょうか?また、最適なアプリ構成を見つけるためにテストを実施したい場合はどうすればよいでしょうか?

このような場合、アプリの更新は正常に機能しません。更新がユーザーに完全に反映されるまでには時間がかかるためです。また、複数のアプリ バージョンでテストを実施するのは非常に困難です。

また、アプリのユーザー ジャーニーが意図したとおりに機能しているかどうかをどのように判断すればよいでしょうか?Google Play Console のユーザー コメントをご利用ください。ただし、明確な判断を下すには十分な精度が得られない場合があります。

この Codelab で問題(コードのバグ、文法的な誤り、不明確な表現など)が見つかった場合は、Codelab の左下隅にある [誤りを報告] から問題を報告してください。

学習内容

  • Firebase 向け Google アナリティクスでファネルを作成する方法
  • Firebase Remote Config の使用方法
  • Firebase A/B テストの実行方法

必要なもの

  • Android Studio バージョン 4.1 以降
  • Google アカウント
  • Android 5.0 以降を搭載したテストデバイス(デバイスを接続するための USB ケーブル付き)、または Play ストア/Google API をサポートするシステム イメージを搭載した AVD(Android 仮想デバイス)を実行する Android エミュレータ

AdMob の使用経験についてお答えください。

初心者 中級者 上級者

ご自身の Firebase 使用経験をどのように評価されますか。

初心者 中級者 上級者

2. 開発環境をセットアップする

コードをダウンロードする

次のボタンをクリックして、この Codelab のすべてのコードをダウンロードします。

ダウンロードした zip ファイルを解凍すると、これにより、admob-firebase-codelabs-android-master という名前のルートフォルダが展開されます。

または、コマンドラインから GitHub リポジトリのクローンを作成します。

$ git clone https://github.com/googlecodelabs/admob-firebase-codelabs-android

リポジトリには、次の 4 つのフォルダが含まれています。

  • android_studio_folder.png101-base - この Codelab で作成する開始コード。
  • android_studio_folder.png101-complete_and_102-base - この Codelab の完成したコードと 102 Codelab のスターター。
  • android_studio_folder.png102-complete - 102 Codelab の完成したコード。

スターター アプリをインポートする

Android Studio を起動し、ウェルカム画面で [Import project] を選択します。次に、ダウンロードしたコードから 101-complete_and_102-base ディレクトリを選択します。

これで、Android Studio でプロジェクトが開きます。

Firebase 構成ファイルを Android プロジェクトに追加する

  1. Awesome Drawing Quiz プロジェクトの概要画面で、設定アイコン 9bacb5ada7cbaaf6.png をクリックします。
  2. [全般] タブで、Android アプリを選択して google-service.json ファイルをダウンロードします。
  3. 構成ファイルをプロジェクトの android_studio_folder.pngapp ディレクトリに移動します。797cde1881a38fdf.png

3. コンソールから Firebase プロジェクトを開く

次のステップに進む前に、AdMob+Firebase 101 Codelab「Firebase プロジェクトを設定する」ステップで作成したプロジェクトを Firebase コンソールから開きます。

e0a028059c9e00cb.png

4. アプリ イベントのファネルを作成する

アプリ内のユーザー アクティビティをトラッキングするために追加したアプリイベントがいくつかあるかもしれません。各アプリイベントのレポートを読むことで、イベントに関連付けられた詳細情報(合計数、ユーザーあたりの平均数、ユーザー属性など)を取得できます。

ただし、特定のイベントに焦点を当てるのではなく、一連のイベントの完了率を確認したい場合はどうすればよいでしょうか。Firebase 向け Google アナリティクスでは、目標到達プロセスを使用して、一連のアプリ内イベントの完了率を視覚化し、最適化できます。

目標到達プロセスを作成する

目標到達プロセスを作成するには:

  1. Firebase コンソールに移動し、先ほど作成した Awesome Drawing Quiz プロジェクトを選択します。
  2. [ファネル] をクリックします。
  3. [新しい目標到達プロセス] をクリックします。
  4. 目標到達プロセスの名前と説明を入力します。
  5. 目標到達プロセスのステップとして使用する、最初の 2 つのイベントを選択します。
  6. 追加したステップごとに [別のイベントを追加] をクリックし、イベントを選択します。
  7. [作成] をクリックします。

上記の手順に沿って、次のファネルを作成します。

#1 ファネル名: レベルの成功率 イベント: level_startlevel_successd3bc78ef61a261d7.png

#2 ファネル名: リワード広告の完了率 イベント: ad_reward_promptad_reward_impressionad_reward45c9542dfa663014.png

#3 ファネル名: ゲーム完了率 イベント: game_startgame_completedab25e8501746d5f.png

目標到達プロセスの分析を表示する

ファネルを作成すると、Firebase コンソールの [ファネル] メニューからアクセスできるようになります。リストでファネル名をクリックすると、各ファネルの詳細な分析結果が表示されます。

620c0e84587c8ad4.png

たとえば、[レベルの成功率] をクリックします。ファネルの詳細は次のように表示されます。

c889f9b6ece15847.png

上のスクリーンショットでは、レベルを開始(level_start イベントをトリガー)した後にレベルをクリア(level_success イベントをトリガー)したユーザーの割合を確認できます。この例では、46.2% のユーザーがレベルをクリアしています。

[イベント数] をクリックすると、次のようにイベント数に基づく指標が表示されます。

d044fb7b07e6e0d9.png

上記のスクリーンショットの指標に基づくと、期間中に 116 回の試行(level_start イベントをトリガー)と 57 回のクリア(level_success イベントをトリガー)がありました。

イベントに基づく完了率(49.1%)はユーザーに基づく完了率(46.2%)をわずかに上回っているため、他のユーザーよりもパフォーマンスの高いユーザーが少数いると言えます。

5. Remote Config をアプリに統合する

アプリイベントとファネルに基づいてアプリに関する分析情報を取得できるため、アプリを最適化することをおすすめします。通常、アプリのパラメータ値の微調整が含まれます。これらのパラメータの値を変更するには、変更がユーザーに適用されるようにアプリを更新する必要があります。

Firebase の Remote Config を使用すると、アプリのアップデートなしでこれらの値を調整できます。つまり、ユーザーにアップデートのダウンロードを強制して迷惑をかけることなく、アプリの動作を変更できます。

この Codelab では、Remote Config を使用して、アプリのアップデートなしで報酬額(リワード動画広告の視聴後に開示される文字数)を調整する方法を学びます。

Remote Config をアプリの依存関係に追加する

まず、Firebase Remote Config をアプリの依存関係に追加しましょう。

app/build.gradle

apply plugin: 'com.android.application'

android {
    ...
}

dependencies {
    ...

    // TODO: Add Firebase Remote Config dependency (102)
    implementation 'com.google.firebase:firebase-config-ktx'

    ...
}

...

プロジェクトを Gradle ファイルと同期する

すべての依存関係がアプリで使用可能であることを確認するには、プロジェクトを Gradle ファイルと同期します。[File] > [Sync Project with Gradle Files] メニューを選択して、プロジェクトを Gradle ファイルと同期します。

Remote Config パラメータのデフォルト値を設定する

Remote Config から値を取得するには、ネットワーク接続が必要です。ネットワークが利用できない場合に備えて、各 Remote Config パラメータのデフォルト値を定義する必要があります。

res/xml フォルダの下に remote_config_defaults.xml ファイルを作成します。次に、報酬額のデフォルト値(reward_amount))を次のように設定します。

res/xml/remote_config_defaults.xml

<?xml version="1.0" encoding="utf-8"?>
<defaultsMap>
    <entry>
        <key>reward_amount</key>
        <value>1</value>
    </entry>
</defaultsMap>

reward_amount は Remote Config のパラメータの名前です。

Remote Config から報酬額を取得する

AwesomeDrawingQuiz.kt を変更して、GameSettings クラスが RemoteConfig インスタンスへの参照を保持するようにします。

RemoteConfig インスタンスは、デバッグモードでサーバーから最新の値を取得するように構成されており、開発プロセスに役立ちます。(fetch(0L) を呼び出して最小フェッチ間隔を 0 秒に設定します)

AwesomeDrawingQuiz.kt

class AwesomeDrawingQuiz : Application() {

    ...

    // COMPLETE: Provide FirebaseRemoteConfig instance (102)
    private fun provideGameSettings() = GameSettings(provideRemoteConfig())

    // COMPLETE: Add a function that provides a FirebaseRemoteConfig instance (102)
    private fun provideRemoteConfig(): FirebaseRemoteConfig {
        val rc = Firebase.remoteConfig.apply {
            setDefaultsAsync(R.xml.remote_config_defaults)
        }
        val fetchTask = if (BuildConfig.DEBUG) rc.fetch(0L) else rc.fetch()
        fetchTask.addOnCompleteListener {
            if (it.isSuccessful) {
                Log.d("AwesomeDrawingQuiz", "Remote config value fetched")
                rc.activate()
            }
        }
        return rc
    }
}

次に、GameSettings クラスを変更して、Remote Config から報酬額を取得します。

GameSettings.kt

// TODO: Add FirebaseRemoteConfig as a class member
class GameSettings(private val rc: FirebaseRemoteConfig) {

  ...

  // TODO: Apply reward amount from the Remote Config (102)
  val rewardAmount: Int
    get() = rc.getLong(KEY_REWARD_AMOUNT).toInt()

  companion object {
    ...

    // TODO: Add a key for 'reward_amount' Remote Config parameter (102)
    private const val KEY_REWARD_AMOUNT = "reward_amount"
  }
}

コンソールから Remote Config パラメータを作成する

次に、報酬額の新しい Remote Config パラメータを作成して、その値をオンザフライで調整できるようにします。

新しいパラメータを作成するには、Firebase コンソールに移動し、先ほど作成した Awesome Drawing Quiz プロジェクトを選択します。[Remote Config -> 最初のパラメータを追加] ボタンをクリックします。

7f52617141c53726.png

パラメータに reward_amount という名前を付け、デフォルト値を 1 に設定します。[パラメータを追加] ボタンをクリックします。

cbc771fd1685b29c.png

[変更を公開] ボタンをクリックして、変更をユーザーに公開します。

d6a6aa4a60e06ee9.png

6. Remote Config を使用してアプリの動作を変更する

Awesome Drawing Quiz の報酬額を、アプリのコードを更新することなく Firebase コンソールで設定できるようになりました。

このセクションでは、リワード広告を視聴した後にアプリでヒントとして 2 文字追加で表示されるように、報酬額を 1 から 2 に変更します。

reward_amount パラメータのデフォルト値を更新

Firebase コンソールに移動し、先ほど作成した Awesome Drawing Quiz プロジェクトを選択します。[Remote Config] をクリックし、リストから reward_amount をクリックします。次に、デフォルト値を 2 に変更し、[更新] ボタンをクリックします。

9a9bd8a26a39bfe3.png

[変更を公開] ボタンをクリックして、変更をユーザーに公開します。

d6a6aa4a60e06ee9.png

アプリの動作の変更を確認する

アプリの動作変更を確認するには、プロジェクトを再度実行します。リワード広告の視聴が完了すると、Remote Config コンソールで設定したとおり、アプリで報酬として2 文字が表示されます。

リワード広告を視聴する前

報酬として 2 つの文字を公開

7. 報酬額を最適化するテストを作成します。

アプリのアップデートを公開しなくても、報酬の金額を変更できるようになりました。ただし、変更した量がアプリにとって適切かどうかを判断するにはどうすればよいでしょうか?

Firebase A/B Testing を使用すると、アプリを更新したり、各テストのパフォーマンスを実行して追跡するための別のツールを構築したりすることなく、テストを実施してアプリの全体的なユーザー エクスペリエンスを最適化できます。

テストを設計する

新しいテストを作成する前に、テストの明確な目標を設定する必要があります。新しいテストを作成する前に、次のチェックリストを確認してください。

  • What(何を最適化したいか): 最適化したい内容を明確にします。(ゲームの難易度、広告のタイミングや表示など)
  • 理由: テストを実施するビジネス上の目標は何ですか?(例: 広告収入を最大化する、ユーザー維持率を高めるなど)
  • 対象: テストの対象となるのは誰ですか?(例: すべてのユーザー、特定のユーザー オーディエンスなど)

この Codelab では、Awesome Drawing Quiz の 1 日あたりのユーザー エンゲージメントを最大化するために、報酬額の値を最適化するテストを作成します。

テストを作成する

Firebase コンソールで Awesome Drawing Quiz プロジェクトを開きます。[A/B テスト] メニューを選択し、[テストを作成] ボタンをクリックします。

[Remote Config] を選択して、Remote Config テストを作成します。

f38a85328ab54e7e.png

次のスクリーンショットに示すように、テストに「Amount of the Reward」という名前を付けます。

15d552adb61c0b08.png

ターゲティング オプションを設定します。この Codelab では、Awesome Drawing Quiz のユーザーの 100% を対象にします。

61b316741a63050f.png

テストの主な目的は、1 日のユーザー エンゲージメントを最大化する最適な値を見つけることであるため、追跡するメインの指標として [1 日のユーザー エンゲージメント] を選択します。

694641b57d90ff65.png

最後に、コントロール グループとバリエーション グループを設定して、どちらのグループのパフォーマンスが高いかを確認します。コントロール グループから reward_amount を選択し、その値を変更しないままにします。バリエーション グループの名前を「Less reward」に変更し、reward_amount の値を 1 に変更します。

10ed7f5b06858519.png

この設定では、「報酬が少ない」グループのユーザーには報酬として文字が 1 つ付与され、「コントロール グループ」のユーザーには報酬として文字が 2 つ付与されます。その結果、報酬額がユーザーにどのように影響するかを確認できます。

[確認] ボタンをクリックすると、次のようにテストの概要が表示されます。

ae6477ce79f6265d.png

テストを実施する

[テストを開始] ボタンをクリックして、テストを実行します。テストの開始後にテスト構成を変更することはできません。

7131bf9b4fa74fa5.png

8. テストを管理する

テストの進捗状況を表示する

テストの進捗状況は、Firebase コンソールの [A/B Testing] メニューで確認できます。次のスクリーンショットをご覧ください。カードには、過去 30 分間にテストに参加したユーザー数も表示されます。

8a7009bdd8871d95.png

リストからテストをクリックすると、テストの詳細が表示されます。テストでリーダー(パフォーマンスが最も高いバリエーション)を宣言できるようになるまで、「リーダーを宣言するには時期尚早です」というメッセージが表示されます。

a4e7ca3e3f4711cd.png

テストがしばらく実行されると、[改善の概要] セクションに、テストで収集されたデータが表示されるようになります。各バリエーションのパフォーマンスを比較して、どちらのパフォーマンスが高いかを確認できます。次のスクリーンショットは、[改善の概要] セクションの例を示しています。

e2d00fc27c053fd3.png

[改善の概要] セクションの下の表で、テストの目標指標の詳細と、テストでトラッキングされているその他の指標を確認できます。次のスクリーンショットは、指標の詳細セクションの例を示しています。

c3859d642f85cc52.png

リーダーをすべてのユーザーにロールアウトする

目標指標に対する「リーダー」、つまり最良のバリエーションを見つけるのに十分な期間テストを実行したら、次は全ユーザーにテストを展開します。A/B テストで明確なリーダーが特定されると、そのバリアントをすべてのユーザーにロールアウトするよう促されます。

86cb6a6c07516634.png

ただし、テストで明確な候補が示されなかった場合でも、バリアントをすべてのユーザーに展開できます。

テストの詳細画面で、コンテキスト メニュー(73afe611adf58774.png)をクリックし、[バリアントを展開] をクリックします。

374e1c72be1d0656.png

すべてのユーザーにロールアウトするバリエーションを選択し、[Remote Config で確認] ボタンをクリックして、Remote Config で変更を行う前に変更を確認します。

e176f6e6a72c754.png

下書きに問題がないことを確認したら、[変更を公開] ボタンをクリックして、すべてのユーザーに変更を反映します。

d65d545620ce93f6.png

9. 完了

AdMob+Firebase 102 Android Codelab を完了しました。この Codelab の完成したコードは、android_studio_folder.png102-complete フォルダにあります。