2014年4月6日 星期日

Google Analytics for Android

Google Analytics 是一套用戶行為追縱與分析的工具,透過 GA SDK 可以方便的在應用程式原始碼各處以簡單的指令記下用戶的行為,並透過 SDK 將行為記錄傳回 GA 的伺服器,以便透過 GA 方便的管理介面做分析,產品企劃人員可以借由這些統計結果判斷哪些功能很常被使用,需要加強效果及將入口移至明顯處,哪些功能較不常用,可以將入口移到較不顯眼的地方。市面上類似的工具不少,例如 Flurry 就是其中一個類似的工具,但 Flurrry 的即時性並不如 GA 來得高,我們公司的 App 在由 Flurry 轉換到 Google Analytics 時版本是 V3,而在我記錄這篇文章時,已經推出 V4 版本了,除了 SDK 需更換之外,使用方法的差異也不算小。

目前 Google Analytics V4 的 SDK 為 Google Play services SDK,需要透過 Android SDK Manager 來安裝,這點與 V3 以前直接在官網上下載 .jar 的方式不太相同,目前 survey 了 V4 過後還沒有什麼需要更換的考量,此篇仍以 V3 做為筆記的對象,並且列出 V4 的差異。

不論是 Android 還是 iOS 的 SDK 都在官網上就能找到,以 Android 的 libGoogleAnalyticsServices.jar 為例,在此處下載 Google Analytics SDK for Android V3 即可,但 Windows Phone 的開發者就要到另一處才能找到:Google Analytics SDK for Windows 8 and Windows Phone

不論是使用 V4 或 V3 以前的 SDK,首先要做的事情都是將 .jar 檔案擺到 libs 資料夾內並且做 Add As Library 的動作,而 Google Analytics 當然會透過網路將記錄下來的資料上傳至伺服器,所以若要導入 Google Analytics 的 App 原本是沒有使用網路功能的,則要至 AndroidManifest.xml 新增兩項 Permission 如下

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

對使用這類追縱工具而言,幾乎全部的程式碼都是在操作 Tracker 物件記錄事件,而 Tracker 物件再於應用程式背景將資料上傳至伺服器供統計與分析,在 V3 時應用程式內使用 EasyTracker.getInstances(Context) 的方式拿到 EasyTracker 的 Singleton 物件,幾乎所有的操作都是透過這個 EasyTracker 來進行,而 V4 時用戶可以不只擁有一個 Tracker 物件,可以透過 GoogleAnalytics.getInstance(Context).newTracker() 的方式建立多個 Tracker,也因為 V4 可以管理多個 Tracker,官方建將各 Tracker 管理在 Application 物件中,兩個版本的範例如下。

// GA V3 的 Tracker 物件操作方式
EasyTracker.getInstance(this);

// GA V4 可讓開發者管理多個 Tracker
Tracker tracker = GoogleAnalytics.getInstance(Context).newTracker(R.xml.global_tracker);

在上面這段簡單的範例中出現 R.xml.global_tracker 這樣的一個資源檔,這在 V4 時的重要性並不高,但在 V3 就是非常重要的一個資源,且放置的位置也不一樣,在 V3 時這個資源檔的名稱為 analytics.xml 且必須放置在 res/values 底下,在 V4 時這個資源檔的名稱為 global_tracker.xml 且放置於 res/xml 底下,以 V3 為例。

<?xml version="1.0" encoding="utf-8" ?>
<resources>
  <string name="ga_trackingId">UA-XXXX-Y</string>
  <bool name="ga_autoActivityTracking">true</bool>
  <bool name="ga_reportUncaughtExceptions">true</bool>
</resources>

若加入 analytics.xml 後在編譯時發生錯誤或警告,可能是 trackinId 的字串內容所引起的,只需要將 resources 這個 tag 加上額外的 attributes 即可

// 將 xml 內的 <resources> 置換為
<resources xmlns:tools="http://schemas.android.com/tools"
tools:ignore="TypographyDashes">

至於為什麼會說這個 analytics.xml 對於 V3 而言很重要,原因與先前所說的 V4 可以由開發者自行管理多個 Tracker 有很大的關係,在 V3 時由於不需要自行管理 Tracker 故初始化的流程是由 SDK 自行處理,而應用程式中的 Tracker 到底是對應到 GA 管理頁中的哪個帳戶,就是由 analytics.xml 內的 ga_trackingId 欄位來決定的,除此之外 analytics.xml 也定義了數個 GA SDK 的重要行為,以 V3 的 analytics.xml 內容為例 (V4 內容參考 GA Parameters)

ga_trackingId 對應於 GA 管理頁面的帳戶 ID,格式為 UA-XXXXXXX-Y 的字串
ga_dispatchPeriod 追縱資料發送的間隔,以秒為單位的整數
ga_sampleFrequency 預設為 100 的整數,若你的 App 用戶量很大,可以考慮將這個值設 100 以下,代表百分之多少的用戶資料才會被追縱,例如設為 30 即是 10 萬個用戶中,只有 3 萬會發送資料
ga_autoActivityTracking 自動追縱 Activity 的使用流程

以上是在 V3 使用 EasyTracker 的方式,而 V4 可以自行管理多個 Tracker 物件到底是什麼意思,以下範例應該足夠清楚表達出管理多個 Tracker 的用途

GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
// 建立針對開發者帳戶而言全域的 tracker
Tracker trackerCompany = analytics.newTracker(R.xml.global_tracker);
// 建立針對此應用程式的 tracker
Tracker trackApp = analytics.newTracker(R.xml.app_tracker);
// 建立針對所有 App 內購買行為的 tracker
Tracker trackIAP = analytics.newTracker(“UA-ABCD1234-S”);
trackIAP.setLocalDispatchPeriod(60); // 周期為 60 秒
trackIAP.setLogger(new IAPLogger()); // 針對 In App Purchase 輸出特定 Log 的類別

假若應用程式本身的組成是以 Activity 為主,V3 官網上的範例可以說是開發者最需要了解的兩個 Methods,使用 activityStart 與 activityStop 來記錄各個 Activity 的停留時間及使用流程,直接列出官網範例如下

package com.example.app;
import android.app.Activity;
import com.google.analytics.tracking.android.EasyTracker;

public class myTrackedActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }

  @Override
  public void onStart() {
    super.onStart();
    EasyTracker.getInstance(this).activityStart(this);  // 記錄 Activity Start
  }

  @Override
  public void onStop() {
    super.onStop();
    EasyTracker.getInstance(this).activityStop(this);  // 記錄 Activity Stop
  }
}

但自從 Android 3.0 之後,開發者還是比較希望讓一個 App 同時支援 Mobile 與 Tablet 兩種介面,所以較複雜的介面往往會採用 Fragment 來製作,以上針對 Activity 操作做追縱的 Method 就不那麼有用了,以下是我實際在 Fragment 上的應用範例,同樣是在 onStart 之類的 Event 加入類似的程式碼。

EasyTracker tracker = EasyTracker.getInstance(getKKActivity());
tracker.set(Fields.SCREEN_NAME, "FragmentName");
tracker.send(MapBuilder.createAppView().build());

而在各按鍵、活動頁面,我偏好使用 Event 的方式來追縱,例如

EasyTracker.getInstance(getKKActivity()).send(MapBuilder.createEvent(
                        CategoryID.Splash, // 自行定義的常數
                        ActionID.ClickBonus, // 自行定義的常數,指按下優惠項目
                        BonusTitle, // 用戶按下的優惠項目名稱
                        null).build());

在加入以上流程後,登入至 Google Analytics 管理頁面,在對應 trackingId 的帳戶下即可看到裝置的資訊,例如版本號碼,停留的頁面,發送的事件等等,比較需要注意的是管理介面上的即時資訊大概會延遲個五分鐘左右,也就是 GA 物件成功連線後,約五分鐘才會在管理頁面的即時狀態上看到該裝置,離線後也是約五分鐘後才會從管理視窗中消失。


3 則留言:

  1. 你好,我根据官方文档说明简单集成了Google Play Campaign,并按其提供的测试方法测试通过(未发布),现在想实现一个功能:当用户分享一个App链接到某社交网站,他的好友点击链接下载并安装应用后,我们就给予用户某种奖励。请问我在之前的基础上如何继续,请不吝赐教,谢谢!

    回覆刪除
  2. 這個是什麼Orz
    app_tracker

    Tracker trackApp = analytics.newTracker(R.xml.app_tracker);
    // 建立針對所有 App 內購買行為的 tracker

    回覆刪除