FURYU Tech Blog - フリュー株式会社

フリュー株式会社の開発者が技術情報を発信するブログです。

Google Tag Manager でAndroidアプリのABテスト -ABの出し分け-

コンテンツ・メディア第1事業部の荒木です。 今回は、Google Tag Manager を利用してAndroidアプリでABテストをするために、AパターンとBパターンをアプリで出し分ける方法を紹介したいと思います。

Google Tag Manager とは

Google Tag Manager(以下、GTM)は、タグと呼ばれるウェブサイトに埋め込む解析用のコードを管理するためのツールです。たとえば、Google Analytics用の共通タグを各ページに埋め込んでおけば、イベント名などの設定を全てウェブ上で実施できるといったメリットがあります。

GTMでABテストをするメリット

Google AnalyticsとアプリのプログラムだけでABテストの仕組みを作ることは可能です。しかし、GTMによるABテストには、少なくとも以下のメリットがあります。

  • テスト結果の解析を自動で行って、成果の高いパターンに移行してくれる
  • ABテスト用のGAイベント送信が不要である
  • ABテストの開始条件(アプリバージョンや、日時)をプログラムに書かなくて良い

GTM自体のメリットと同様、テストの設定とプログラムを独立できるというのが良い点です。

コンテナの作成

実際にタグの管理を行うために作成するものがコンテナです。GTMではコンテナの設定によって、タグを管理します。 初めてGTMにログインしたときは、アカウントとコンテナを一つずつ作成することになります。今回は、コンテナの使用場所として「Android」を選択します。

Google Analytics と連携する

コンテナと Google Analytics (以下、GA)を連携させることで、ABテストの設定ができるようにします。GTMのページ上部の「管理」タブをクリックすると表示される画面で、「外部アカウント リンク」をクリックすると、以下のような画面になります。ここで、GTMにログインしているGoogleアカウントが持っているGAアカウント(持っていない場合は新しく作ってください!)とGAのプロパティが選択できるようになっているので、連携させたいものを選んでください。

ABテスト用の変数を作成する

さて、いよいよABテストの設定です。ABテストをするためには「Google アナリティクスのウェブテスト」という変数を作成する必要があります。変数とは、アプリに動的に取り込む値を設定したり、アプリから送るデータのフィルタリングに利用される、名前と値のペアです(今回は、アプリに取り込む値の設定に使います)。画面左の「変数」を選ぶと以下のような画面になるので、「新規」をクリックします。

変数の作成画面は以下のようになっています。変数の種類に「Google アナリティクスのウェブテスト」を選んでください。

つづいて、各種設定の大まかな説明をします。詳細オプションや有効化のタイミングについては、今回は割愛させていただきます。

Google アナリティクスのアカウント・プロパティ・ビュー

GAとの連携部分です。

ウェブテストの目的

このテストで何を成果とするかを選択します。デフォルトでは、スクリーン数、セッションの長さ、例外数、クラッシュ数の四つしか選べませんが、GAの目標を設定しているとテストの目的に設定することができます。たとえば、特定ボタンのクリックイベントや、ユーザーの課金状況などを設定することもできます。

パターン

ここがABを出し分ける仕組みになります。パターンとは key と value のペアでjsonデータのようになっています。ここで、各パターンで使いたい値を定義していきます。たとえば、アプリのテキスト領域に「Aパターンです。」「Bパターンです。」と出し分けたい場合は、Aパターンで{'text' : 'Aパターンです。'}、Bパターンで{'text' : 'Bパターンです。'}と定義しておけば、アプリ側で「text」という key の値を取得した時に、「Aパターンです。」または「Bパターンです。」のどちらかの値を得ることができます。

コンテナを公開して、ダウンロードする

コンテナは公開することで初めて動作します。画面の右上に「公開」ボタンからコンテナを公開することを忘れないようにしましょう。公開したら、画面上部「バージョン」タグから公開したバージョン(最初は1)を選んでください。以下のような画面になるので、右上の「アクション」→「ダウンロード」をクリックするとGTM-XXXXXXというバイナリファイルがダウンロードされます。

ここまでが、GTMでの設定になります。

Androidアプリで各パターンの値を取得する

ここからは、Android Studio での作業になります。

GTMをアプリに導入する

GTMは、GAのライブラリに含まれているので、build.gradledependencies に以下を追加してください。

compile 'com.google.android.gms:play-services-analytics:8.4.0'

また、GTMを利用するために必要なパーミッションは、android.permission.INTERNETandroid.permission.ACCESS_NETWORK_STATEなので、必要ならばAndroidManifest.xmlに設定しておいてください。

GTMの初期化

GTMを初期化して、ユーザーがAパターンかBパターンかを確定します。GTMの初期化は、以下のように書きます。アプリの初期化の際に、実施するのが良いと思われます。

TagManager tagManager = TagManager.getInstance(this);
PendingResult<ContainerHolder> pending = tagManager.loadContainerPreferNonDefault("GTM-XXXXXX", R.raw.gtm_default_container);
pending.setResultCallback(new ResultCallback<ContainerHolder>() {
    @Override
    public void onResult(ContainerHolder containerHolder) {
        if (!containerHolder.getStatus().isSuccess()) {
            Log.e(TAG, "failure loading container");
            return;
        }
        ContainerHolderSingleton.setContainerHolder(containerHolder);
    }
}, 2, TimeUnit.SECONDS);

ここで、GTM-XXXXXXは自分のコンテナID、R.raw.gtm_default_containerはコンテナを公開した後にダウンロードしたバイナリファイルです。バイナリファイルはres/rawディレクトリに配置すること、バイナリファイル名(元々は「GTM-XXXXXX」)が大文字を含まないようにリネームすることに注意してください(リネームしないとエラーになります)。また、取得したContainerHolderをアプリのどこからでも参照できるようにContainerHolderSingletonというシングルトンクラスを作って、セットしておきます。

public class ContainerHolderSingleton {
    private static ContainerHolder containerHolder;

    private ContainerHolderSingleton() {
    }

    public static ContainerHolder getContainerHolder() {
        return containerHolder;
    }

    public static void setContainerHolder(ContainerHolder c) {
        containerHolder = c;
    }
}

値の取得

最後に値の取得を行います。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView textView = (TextView) findViewById(R.id.textView);

    ContainerHolder containerHolder = ContainerHolderSingleton.getContainerHolder();
    String text = containerHolder.getContainer().getString("text");

    // 「Aパターンです。」 または 「Bパターンです。」 が表示される。
    textView.setText(text);
}

Container#getString(String key) メソッドで値の取得をすることができます。ここで取得できる値は、ユーザーがどのパターンであるかによって変わります。文言や色などのシンプルなデータなら、GTMから取得した値をそのまま表示すれば良いです。もし、レイアウト自体を大きく変えたい場合は、取得した値をフラグにして読み込むべきレイアウトのxmlを変えるという実装になると思います。

おわりに

この記事では、アプリでABパターンを出し分けるための方法を紹介しました。この時点では、まだテストの解析や開始条件の設定といったことがわからないと思います。それについては、また別の機会に紹介したいと思います。