如何使用 firebase 分析跟踪 android 个片段

How to track android fragments using firebase analytics

在我的 android 应用程序中,我有一个 Activity,它有 3 或 4 个片段,可以根据某些用户或服务器事件按顺序附加。

我想在 firebase 中跟踪所有这些片段作为屏幕。

理想情况下,如果可能的话,是否有一个 API 我可以在片段的 onCreate 中调用,并告诉 firebase 用户当前在片段 1、片段 2 或片段 3 中?

更新

由于 setCurrentScreen 已弃用,您可以使用 logEvent 方法

Bundle bundle = new Bundle();
bundle.putString(FirebaseAnalytics.Param.SCREEN_NAME, fragment.getClass().getSimpleName());
bundle.putString(FirebaseAnalytics.Param.SCREEN_CLASS, fragment.getClass().getSimpleName());
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle);

我使用了以下 adb 命令来检查是否一切正常。

adb shell setprop log.tag.FA VERBOSE
adb shell setprop log.tag.FA-SVC VERBOSE
adb logcat -v time -s FA FA-SVC

完成后,您将在 logcat 中看到 screen_view 个事件。喜欢这个:

10-15 13:14:13.744 V/FA-SVC (20323): Logging event: origin=app,name=screen_view(_vs),params=Bundle[{ga_event_origin(_o)=app, engagement_time_msec(_et)=31600, ga_previous_class(_pc)=ContentsFragment, ga_previous_id(_pi)=8077407744361472421, ga_previous_screen(_pn)=ContentsFragment, ga_screen_class(_sc)=TestFragment, ga_screen_id(_si)=8077407744361472423, ga_screen(_sn)=TestFragment}]

上一个回答

有一种设置当前屏幕的特殊方法 - setCurrentScreen

我是这样使用的

mFirebaseAnalytics.setCurrentScreen(this, fragment.getClass().getSimpleName(), fragment.getClass().getSimpleName());

调用该方法后,LogCat

中会出现以下消息

Logging event (FE): screen_view(_vs), Bundle[{firebase_event_origin(_o)=auto, firebase_previous_class(_pc)=HomeFragment, firebase_previous_id(_pi)=4121566113087629222, firebase_previous_screen(_pn)=HomeFragment, firebase_screen_class(_sc)=StatisticsFragment, firebase_screen_id(_si)=4121566113087629223, firebase_screen(_sn)=StatisticsFragment}]

以下事件出现在自动 activity 跟踪中:

Logging event (FE): screen_view(_vs), Bundle[{firebase_event_origin(_o)=auto, firebase_previous_class(_pc)=StatisticsFragment, firebase_previous_id(_pi)=4121566113087629223, firebase_previous_screen(_pn)=StatisticsFragment, firebase_screen_class(_sc)=LoginActivity, firebase_screen_id(_si)=4121566113087629224}]

如您所见,它们几乎相同,因此 setCurrentScreen 有效。

我只能在第二天在 Firebase 控制台中看到那些 类。这对于 Firebase 来说是正常的 - 处理如此大量的数据需要时间。

在此处为 Artem Mostyaev 的回答添加更多见解。 GA/Firebase 面板在 DEV 版本中反映了 class 名称,但在 PROD 版本中没有反映 version.The 这里的罪魁祸首是

fragment.getClass().getSimpleName()

混淆了 prod 中的片段名称。所以 GA/Firebase 显示 classname 就像 (a,b,ah, etc)

getSimpleName() 在其他情况下使用也很危险。

更多文献:https://medium.com/@elye.project/the-danger-of-using-class-getsimplename-as-tag-for-fragment-5cdf3a35bfe2

Progaurd 规则

-keepnames class com.somepackage.yourclass 

由于 setCurrentScreen 弃用 您可以使用 firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle) 代替。

有一个博客 post here 解释了有关手动跟踪屏幕的更多信息。

这里有一个例子:

private fun setCurrentScreen(screenName: String) = firebaseAnalytics?.run {
    val bundle = Bundle()
    bundle.putString(FirebaseAnalytics.Param.SCREEN_NAME, screenName)
    bundle.putString(FirebaseAnalytics.Param.SCREEN_CLASS, this@BaseFragment.javaClass.simpleName)
    logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle)
}

此外,如果您想自动跟踪屏幕,您可以在 BaseFragment 生命周期方法之一中调用此函数,例如 onResume。请记住,某些片段可能不必更改当前屏幕,例如在 ViewPager 中创建的片段,因此我声明了一个 open val,您可以 override ] 以更改默认行为。

这里是BaseFragment中的代码:

protected open val trackScreenView: Boolean = true

override fun onResume() {
    super.onResume()

    if (trackScreenView) setCurrentScreen(this.javaClass.simpleName)
}

您可以通过在目标中覆盖它来禁用它 Fragment:

override val trackScreenView: Boolean = false

顺便说一下,如果你使用的是NavigationUI组件,目前没有跟踪屏幕的自动解决方案,它只会跟踪你拥有的单个activity,这样你就可以防止firebase自动通过将此 meta-data 放入您的应用程序清单来进行屏幕报告:

<application
    android:name=".App"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    
    <!-- .... -->
    
    <meta-data
        android:name="google_analytics_automatic_screen_reporting_enabled"
        android:value="false" />
</application>

对于使用 NavigationUI 的项目,您可以使用侦听器 NavController.OnDestinationChangedListener

里面onCreate()

override fun onCreate() {
      super.onCreate()
      .
      .
      .
      .
      navController = Navigation.findNavController(context!!, R.id.nav_host_fragment)
      navController?.addOnDestinationChangedListener(listener)
}

在 3 个侦听器函数参数中,

  • controller 用于获取classname
  • destination 可用于通过属性 android:label
  • 获取布局 xml 在 nav_host_fragment 中找到的目标名称字符串
private val listener = NavController.OnDestinationChangedListener { controller, destination, arguments ->
      
      val bundle = Bundle()
      val currentFragmentClassName = (controller.currentDestination as FragmentNavigator.Destination).className
      bundle.putString(FirebaseAnalytics.Param.SCREEN_NAME, destination.label.toString())
      bundle.putString(FirebaseAnalytics.Param.SCREEN_CLASS, currentFragmentClassName)
      FirebaseAnalytics.getInstance(requireContext()).logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle)
      
}

别忘了清理

override fun onDestroy() {
      super.onDestroy()
      navController?.removeOnDestinationChangedListener(listener)
}