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):新增classpathbuildscript { 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值。