1. 程式人生 > >Android Firebase接入(一)--Firebase埋點(Analytics)

Android Firebase接入(一)--Firebase埋點(Analytics)

埋點是指在app中新增資料上報,相當於在app中列印Log並儲存,在app內需要的位置埋點可以幫助分析使用者的行為和喜好,以便改進產品。

一、配置Android應用並下載google-service.json檔案:

Firebase控制檯新建專案(需要使用Google賬戶登入),配置好Android應用後下載google-service.json檔案,將google-service.json檔案新增到專案的app目錄下。

(1)新增專案時填寫專案名稱、專案id使用預設的就可以、選擇國家、底部的兩個勾選項要麼都選,要麼都不選,表示是否和Google分享你的app分析資料,最後點選建立專案即可。

(2)Firebase的專案不止是為Android打造的,可以在專案中新增Android應用,IOS應用,網頁應用。那麼我們先要為這個專案新增一個Android應用:



選擇“將Firebase新增到您的安卓應用”,然後填寫app包名,app別名可以選填,除錯簽名證書SHA1,除錯簽名證書SHA1可以通過命令列獲取:

Mac環境:

keytool -exportcert -list -v \
-alias androiddebugkey -keystore ~/.android/debug.keystore

Windows環境:

keytool -exportcert -list -v \
-alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore

輸入命令列後需要輸入金鑰庫口令,預設的金鑰庫口令是android

獲取正式簽名證書SHA1的命令列:

keytool -exportcert -list -v \-alias<your-key-name>-keystore <path-to-production-keystore>

在<your-key-name>填入金鑰名,<path-to-production-keystore>填入金鑰路徑,然後輸入金鑰庫口令即可獲取SHA1。

4.新增好Android應用後,下載google-service.json檔案,新增到專案的app目錄下。


二、匯入Firebase依賴庫

專案級 build.gradle(<專案>/build.gradle):新增classpath

buildscript {
    dependencies {
        ...    
classpath 'com.google.gms:google-services:4.0.1' } }

應用級 build.gradle(<專案>/<應用模組>/build.gradle):新增implementation和apply plugin
dependencies {
    ...
    implementation 'com.google.firebase:firebase-core:16.0.1'
}
apply plugin: 'com.google.gms.google-services'

三、埋點

Firebase打點有三種類型:event,user_property,screen_view

1.列印event

在佈局中新增按鈕:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
    <Button
android:id="@+id/btn_event"
android:text="Event"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.constraint.ConstraintLayout>

在MainActivity中:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button btnEvent;
    private FirebaseAnalytics mFirebaseAnalytics;
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化Firebase
mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
bindView();
}

    private void bindView() {
        btnEvent = (Button) findViewById(R.id.btn_event);
btnEvent.setOnClickListener(this);
}

    @Override
public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_event:
                //點選進行事件上報
Bundle bundleEvent = new Bundle();
bundleEvent.putLong("click_time",System.currentTimeMillis());
bundleEvent.putString("key","value");
mFirebaseAnalytics.logEvent("click_event",bundleEvent);
                break;
}
    }
}

這樣就埋點成功了,打點不是實時的,意味著你點選了按鈕不能馬上在Firebase控制檯看到資料。而是在24小時之內才能看到資料。

如果在開發時想要看到實時的打點資料,可以使用DebugView,在Firebase控制檯的這個位置:


使用DebugView需要在手機上啟動除錯模式

要在手機上啟用 Analytics(分析)“除錯”模式,請執行以下命令列:<package_name>填入app的包名

adb shell setprop debug.firebase.analytics.app <package_name>

“除錯”模式將保持啟用狀態,直至您通過執行以下命令列明確停用“除錯”模式:

adb shell setprop debug.firebase.analytics.app .none.

開啟了除錯模式之後,點選按鈕後30秒內可以在DebugView中看到打點事件:


點選對應的事件可以看到引數列表:


可以看到我們的click_time和key引數都打出來了

2.列印使用者屬性

先在Firebase控制檯新建使用者屬性:


填入屬性欄位名和簡短描述:


這樣就新建屬性成功了,在程式中新增列印屬性按鈕:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
    <Button
android:id="@+id/btn_event"
android:text="Event"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
    <Button
android:id="@+id/btn_user_property"
android:text="USER PROPERTY"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_event"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.constraint.ConstraintLayout>

在MainActivity中:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button btnEvent;
    private Button btnUserProperty;
    private FirebaseAnalytics mFirebaseAnalytics;
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化Firebase
mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
bindView();
}

    private void bindView() {
        btnEvent = (Button) findViewById(R.id.btn_event);
btnUserProperty = (Button) findViewById(R.id.btn_user_property);
btnEvent.setOnClickListener(this);
btnUserProperty.setOnClickListener(this);
}

    @Override
public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_event:
                //點選進行事件上報
Bundle bundleEvent = new Bundle();
bundleEvent.putLong("click_time",System.currentTimeMillis());
bundleEvent.putString("key","value");
mFirebaseAnalytics.logEvent("click_event",bundleEvent);
                break;
            case R.id.btn_user_property:
                //點選進行使用者屬性上報
mFirebaseAnalytics.setUserProperty("property","user_property");
                break;
}
    }
}

這樣就可以列印使用者屬性了,不過Firebase新建屬性後,幾個小時後才能將屬性顯示在資料報告中。所以不能實時的看到打印出使用者屬性。Firebase提供了一個UserId的屬性,可以直接使用:

在程式中:

//設定userId屬性
mFirebaseAnalytics.setUserId("testUserId");
Firebase控制檯:


3.列印當前螢幕:

在佈局中新增按鈕:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
    <Button
android:id="@+id/btn_event"
android:text="Event"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
    <Button
android:id="@+id/btn_user_property"
android:text="USER PROPERTY"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_event"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
    <Button
android:id="@+id/btn_current_screen"
android:text="CURRENT SCREEN"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_user_property"
android:layout_width="match_parent"
android:layout_height="wrap_content" /></android.support.constraint.ConstraintLayout>

MainActivity中:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button btnEvent;
    private Button btnUserProperty;
    private Button btnCurrentScreen;
    private FirebaseAnalytics mFirebaseAnalytics;
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化Firebase
mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
bindView();
}

    private void bindView() {
        btnEvent = (Button) findViewById(R.id.btn_event);
btnUserProperty = (Button) findViewById(R.id.btn_user_property);
btnCurrentScreen = (Button) findViewById(R.id.btn_current_screen);
btnEvent.setOnClickListener(this);
btnUserProperty.setOnClickListener(this);
btnCurrentScreen.setOnClickListener(this);
}

    @Override
public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_event:
                //點選進行事件上報
Bundle bundleEvent = new Bundle();
bundleEvent.putLong("click_time",System.currentTimeMillis());
bundleEvent.putString("key","value");
mFirebaseAnalytics.logEvent("click_event",bundleEvent);
                break;
            case R.id.btn_user_property:
                //設定userId屬性
mFirebaseAnalytics.setUserId("testUserId");
//點選進行使用者屬性上報
mFirebaseAnalytics.setUserProperty("property","user_property");
                break;
            case R.id.btn_current_screen:
                //點選進行當前螢幕上報
mFirebaseAnalytics.setCurrentScreen(MainActivity.this,MainActivity.class.getSimpleName(),"onClick");
                break;
}
    }
}

這樣就將螢幕上報設定成功了,螢幕上報也不是實時的,24小時之內可以看到打點結果。一般的做法是將列印當前螢幕的點埋在onResume中,本例寫在點選事件中只是為了演示用法。

附上筆者寫的一個Firebase打點工具類:

public class FirebaseLogUtils {
    private static FirebaseAnalytics firebaseAnalytics;
    private static SimpleDateFormat format;
    public static void Log(String key, Bundle value){
        if(BuildConfig.DEBUG){
            return;
}
        if(firebaseAnalytics == null){
            firebaseAnalytics = FirebaseAnalytics.getInstance(BaseApplication.getApplication());
}
        if(format == null){
            format = new SimpleDateFormat("yyyy/MM/dd-hh:mm", Locale.getDefault());
}
        if(value == null){
            value = new Bundle();
}
        String time = format.format(System.currentTimeMillis());
value.putString("time",time);
firebaseAnalytics.logEvent(key, value);
}

    public static void Log(String key){
       Log(key,null);
}
}
在專案中直接使用FirebaseLogUtils.Log(String key, Bundle value)或者FirebaseLogUtils.Log(String key)即可打點。可以看到,此工具類中判斷了是否是除錯模式,如果是除錯模式則直接return,並且為每一個打點的地方添加了一個時間引數,以“time”作為key值,當前時間的“yyyy/MM/dd-hh:mm”格式作為value值。