Android用SDKでログを取得したい

はじめに

ログを取得するにはSDKの導入が必要です
導入手順の詳細については 以下の記事を参照ください

APIの仕様について

SDKのTracker APIについて、引数やプロパティ に渡せるデータの上限値は以下となっております。

API 送信内容 上限値
Tracker.setScreenName() スマホアプリでアクセスした画面の名前 256 byte
Tracker.setRelationalKey(key,val) データ統合のためのレコードを一意に特定するカラムの名前 key:128 byte
Tracker.setRelationalKey(key,val) データ統合のためのレコードを一意に特定するカラムの名前 key:256 byte
Tracker.setLoginUser() ログインしたユーザーの名前 key: 128 byte
value: 256 byte
Tracker.setBootType() スマホアプリの起動方法とその設定値 第1引数: 32 byte
第2引数: 512 byte
Tracker.setUserMap() アプリケーションで定義したユーザ情報をキー、バリュー値で設定 key: 32 byte
value: 128 byte
※格納できるキーバリューのペアは10個まで
※10個を越えるデータを入れることはできす、サーバーに送信されるキーは順不同です
EventBuilder.setLabel() 発生したイベントのラベル 256 byte
EventBuilder.setCategoryName() 発生したイベントのカテゴリー 256 byte
EventBuilder.setActionName() 発生したイベントの名前 256 byte
EventBuilder.setEventValue() 発生したイベントの値 256 byte
EventBuilder.setEventMap() イベントが発生した画面のURL key: 32 byte
value: 128 byte
※格納できるキーバリューのペアは10個まで
※10個を越えるデータを入れることはできす、サーバーに送信されるキーは順不同です
ExceptionBuilder.setName() 発生したエラーの名前 256 byte
ExceptionBuilder.setDescription () 発生したエラーの内容 1024 byte
なし - 128 byte
「設定したキー」と「データファイルのカスタム項目」を紐付けたい場合は、カスタマーサクセス担当まで、お問い合わせください!
Tracker APIの上限値を超える場合

弊社では各項目の上限値に基づきテストしておりますので、上限を超えて設定される場合は、お客様の自己責任にてご設定頂くようにお願いいたします。

スレッドセーフについて

トラッキング機能を提供するTrackerはスレッドセーフではありません。複数のスレッド(メインスレッド、ワーカースレッド)から同時に書き込む処理を行う場合、排他制御をする必要があります。

Activity や Fragment などの各画面からのアクセス方法

ActivityやFragmentなどの各画面から簡単にアクセスできるようにandroid.app.Applicationを継承したクラスを作成することを推奨してます。

アプリケーションクラスに Tracker インスタンスを作成する

TrackerApplicationを作成します。

public class TrackerApplication extends Application {

   private Tracker tracker;
   private static TrackerApplication application;

   public void onCreate(){
       super.onCreate();
       application = this;

       // Tracker を保持しておくと Context を毎回渡す必要が
       // ありません。=> 毎回渡しても問題ありません
       tracker = tracker.getInstance(this);


       // 未送信の集計データをサーバーに非同期で送信します。
       // このコードは必須ではありませんが、UI 処理での負荷を軽減するために
       // 呼び出すのを推奨しています。
       tracker.sync()
    }

    public Tracker getTracker(){
        return tracker;
    }

    public static TrackerApplication getTrackerApplication(){
        return application;
    }
}

本クラスを作成すると、他のクラスからは下記のコードで呼び出すことが出来ます。

Tracker tracker = TrackerApplicaetion.getTrackerApplication().getTracker();
tracker.setScreenName("画面名"); 
tracker.send(new ScreenViewBuilder().build());
補足
  • Tracker クラスは内部ではシングルトンになっています
  • 第1引数で渡される Context に Activity インスタンスが渡されたとしても ApplicationContext として取得・保持しますので、渡された Activityに関係するメモリリークは起こりませんのでご安心ください
  • すでに MyApplication などを組み込んでいる場合は MyApplication の super クラスとして定義可能です
コード紹介

TrackerApplication クラスに 「スクリーンビューの送信を行うメソッド sendScreenView 関数」 を実装すると、より簡単に成果を送信することができます。

public class TrackerApplication extends Application {

   public void sendScreenView( String screenName ){
      getTracker().setScreenName(screenName);
      getTracker().send(new ScreenViewBuilder().build());
   }
}

他のクラスからは、下記のように1行で呼び出すことが出来ます。

TrackerApplicaetion.getTrackerApplication().sendScreenView("画面名");

APIの組み込み

b→dash mobile SDKを用いてb→dashへログを送信するには、SDKが提供するAPIをスマホアプリに組み込む必要があります。

APIには「スマホアプリのログを非同期処理で送信するAPI」と「スマホアプリのログを同期処理で送信するAPI」に分けられます。送信するログごとにAPIを組み込んでいきます。

スマホアプリのログを非同期処理で送信する

b→dashのSDKは、取得したログを1件ずつb→dashに送信する同期処理ではなく、ログが10件蓄積されたタイミングでまとめて送信する非同期処理をベースとしています。

10件を閾値にしている理由

取得したログを1件ずつb→dashに送信すると、b→dashとの通信回数が多くなり、多少なりともアプリのパフォーマンスに影響を与えてしまうため、10件を閾値としています。

スクリーンログを送信する

スクリーンログを送信するにはScreenViewBuilderが必要になります。ScreenViewBuilder はスクリーンビューが単純に発生したときに、画面名を設定して成果を生成するクラスです。WebVew イベントやライフサイクルイベント時に成果を取得するサンプルコードを紹介します。

webページが正常に表示されたときのデータ送信サンプルコード
private WebView webView;
private boolean connectError;
public View onCreateView( … ) {
 webView.setWebViewClient(new WebViewClient() {
     @Override
     public void onReceivedError(…) {
         super.onReceivedError(view, request, error);
         connectError = true;
 }
     @Override
     public void onPageStarted(…) {
          super. onPageStarted(view, url);
          connectError = false; 
     }
     @Override
     public void onPageFinished(WebView view, String url) {
          super.onPageFinished(view, url);
      if( !connectError ){
             try {
         // 画面View の成果を送ります
               Tracker tracker = TrackerApplicaetion.getTrackerApplication().getTracker();
               tracker.setScreenName("URLに応じた画面名"); // 画面名を設定します
               tracker.send(new ScreenViewBuilder().build());
         } catch ( Exception e ) {
            }
       }
  }
  Tracker tracker = TrackerApplicaetion.getTrackerApplication().getTracker();
  // WebView を表示します.
 String url = "http://接続先/?_bdld=" + tracker.getVisitorId();
 webView.loadUrl(url);
Fragment のライフサイクルのイベント時のデータ送信サンプルコード
public static final String SCREEN_NAME = "ネイティブ画面"

public void onResume( … ) {
    super.onResume();

    Tracker tracker = TrackerApplication.getTrackerApplication().getTracker();
    tracker.setScreenName(SCREEN_NAME);
    tracker.send(new ScreenViewBuilder().build());
}

イベントログを送信する

イベントログを取得するにはEventBuilderが必要になります。EventBuilderはスマホアプリ内でイベントが単純に発生したときに、イベント内容を設定し成果を生成するクラスです。サンプルコードを3つ紹介します。

webページが正常に表示され無かったときのデータ送信サンプルコード
private WebView webView;
public View onCreateView( … ) {
    webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedError(…) {
        super.onReceivedError(view, request, error);
        try {
          
   // イベントを生成して成果を送ります
             Tracker tracker = TrackerApplicaetion.getTrackerApplication().getTracker();
             tracker.setScreenName("URLに応じた画面名");
             tracker.send(new EventBuilder()
               .setActionName("LoadError")      // アクション名を設定します
               .setLabelName("WebView")        // ラベル名を設定します
               .setEventValue(url)               // イベント値を設定します
               .build()
              );
         } catch ( Exception e ) {
         }
     }
}
アプリ内のボタンが押されたときのデータ送信サンプルコード
private Button buttonOK;
buttonOK.setOnClickListener( new View.OnClickListener(){
    @Override
    public void onClick() {
        try {
       
  // イベントを生成して成果を送ります
          Tracker tracker = TrackerApplicaetion.getTrackerApplication().getTracker();
          tracker.setScreenName("スクリーン1");
          tracker.send(new EventBuilder()
            .setActionName("buttonClick"// アクション名を設定します
            .build()
          );
        } catch ( Exception e ) {
        }
    }
}
アプリ内でGoogle Play から購入処理が行われたときのデータ送信サンプルコード
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_BUY_INTENT) {
int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
        String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
        String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");
if (resultCode == RESULT_OK) {
        String productId = ...;
            HashMap<String,String> map = new HashMap<String,String>();
            map.put("productId", productId); // プロダクトID を設定
try // 購入時の成果を生成して送ります
                Tracker tracker = TrackerApplicaetion.getTrackerApplication().getTracker();
                tracker.setScreenName("購入結果");
                tracker.send(new EventBuilder()
                                .setEventMap(map)       // キーバリューを設定する
.build()
                );
            } catch( Exception e ){
            }
        }
    }
}

エラーログを送信する

エラーログを送信するにはExceptionBuilderが必要になります。ExceptionBuilderはアプリ内で、軽微・致命的問わず、クラッシュが発生したときの情報を、追加して成果を生成するクラスです。例外が発生したことを検知したい箇所で実装します。

public void init( … ) {
try {

// 何かしらの処理
} catch ( Throwable e ) {

// クラッシュイベントを生成して成果を送ります
Tracker tracker = TrackerApplicaetion.getTrackerApplication().getTracker();
        tracker.setScreenName("重大な初期化画面");
        tracker.send(new ExceptionBuilder()
             .setFatal(true)             // 致命的なクラッシュか設定します
.setDescription(e.toString())  // 例外情報を設定します
.build()
         );
     }
}

起動タイプログを送信する

ExceptionBuilderでは起動タイプログを送信することもできます。外部起動(スキーマ/Push通知による起動) などで、通常と異なる「アプリ起動時のイベント」を集計することができます。

// ここではスキーマ起動が行われたActivity内の onCreate で実装を行います
Intent intent = getIntent();String action = intent.getAction();
if ( Intent.ACTION_VIEW.equals(action) ) {

// スキーマ起動の場合
Uri uri = intent.getData();
if ( uri!=null ) {

// 起動タイプをスキーマに設定し、渡されたパラメーターをそのまま第2引数に設定
tracker.setBootType( Tracker.BOOT_SCHEMA, uri.getQuery() );
            tracker.setScreenName("アプリ起動");
            tracker.send(new EventBuilder().build());
        }
}
 URL パラメーターはデコードされた状態で設定する必要があるので、上記サンプルコードのようにUri.getQuery() を利用してください。

会員IDなどの情報を紐付ける

b→dash SDKでは、独自の「会員ID」など貴社サービスで管理しているIDを紐付けることが出来ます。

// 会員ID を紐付ける
Tracker.setScreenName("ログイン後のマイページ画面");
tracker.setLoginUser(”userId”);
tracker.send(new ScreenViewBuilder().build());

スマホアプリのログを同期処理で送信する

ログが10件蓄積されたタイミングでまとめて送信する非同期処理ではなく、同期処理で取得したログを1件ずつb→dashに送信します。

未送信ログを送信する

未送信データの蓄積を防ぐために Tracker.sync() を使ってアプリ起動時に既に発生している「イベント成果」を送信する必要があります。

tracker.sync();
Tracker.sync()を呼び出すタイミング
Tracker.sync() は、UI 処理が無い「アプリの初期化タイミング」や「負荷処理がかかって良いタイミング」で呼び出すことが最適になります。ほとんどのアプリでは Application を継承したクラス内の onCreate() で実行するのが適しています。
またデータ連携として「即時に連携したい」ときにも呼び出す必要があります。

WebView を呼び出す

SDK独自のURLパラメーターに値を設定することで、集計データなどが詳細に集計されたページ表示ができます。

パラメーター名 iOSバリュー 役割
_bdld Tracker.visitorId セッション判定が正しく集計される
パラメーター名はそのままコピーしてご利用ください。
パラメーターに関して
  • パラメーターを付与することで、WebViewのコンテンツ上においても同一ユーザとして識別することが可能となります。
  • 本パラメーターは同一ドメイン内でのみ有効となる為、異なるドメインにアクセスする場合、再度付与する必要があります。

以下はWebViewでページを表示するときのサンプルコードです。

/* Your code... */// WebView を表示します.
String url = "http://接続先/?_bdld=" + tracker.getVisitorId();
webView.loadUrl(url);