Android 全埋点解决方案 (9):$AppViewScreen 全埋点方案 2.5

阅读数:4 2019 年 11 月 30 日 22:55

Android全埋点解决方案(9):$AppViewScreen全埋点方案 2.5

(扩展采集能力)

内容简介
这是一本实战为导向的、翔实的 Android 全埋点技术与解决方案手册,是国内知名大数据公司神策数据在该领域多年实践经验的总结。由神策数据合肥研发中心负责人亲自执笔,他在 Android 领域有近 10 年研发经验,开发和维护着知名的商用开源 Android & iOS 数据埋点 SDK。
本书详细阐述了 Android 全埋点的 8 种解决方案,涵盖各种场景,从 0 到 1 详解技术原理和实现步骤,并且提供完整的源代码,各级研发工程师均可借此实现全埋点数据采集,为市场解开全埋点的神秘面纱。
8 种 Android 全埋点解决方案包括:
AppClick 全埋点方案 1:代理 View.OnClickListener、
AppClick 全埋点方案 2:代理 Window.Callback
AppClick 全埋点方案 3:代理 View.AccessibilityDelegate
AppClick 全埋点方案 4:透明层
AppClick 全埋点方案 5:AspectJ
AppClick 全埋点方案 6:ASM
AppClick 全埋点方案 7:Javassist
AppClick 全埋点方案 8:AST

对于 Activity 的页面浏览事件,仅仅采集当前 Activity 的名称(包名 + 类名)是远远不够的,还需要采集当前 Activity 的 title(标题)才能满足实际的分析需求。

但是一个 Activity 的 title 的来源是非常复杂的,因为可以通过不同的方式来设置一个 Activity 的 title,甚至可以使用自定义的 View 来设置 title。比如说,可以在 Android-Manifest.xml 文件中声明 activity 时通过 android:label 属性来设置,还可以通过 activity.setTitle() 来设置,也可以通过 ActionBar、ToolBar 来设置。所以,在获取 Activity 的 title 时,需要兼容不同的设置 title 的方式,同时更需要考虑其优先级顺序。

我们目前写了一个比较简单的方法来获取一个 Activity 的 title,内容参考如下:

复制代码
/**
* 获取 Activity 的 title
* @param activity Activity
* @return
*/
public static String getActivityTitle(Activity activity) {
String activityTitle = null;
if (activity == null) {
return null;
}
try {
activityTitle = activity.getTitle().toString();
if (Build.VERSION.SDK_INT >= 11) {
String toolbarTitle = getToolbarTitle(activity);
if (!TextUtils.isEmpty(toolbarTitle)) {
activityTitle = toolbarTitle;
}
}
if (TextUtils.isEmpty(activityTitle)) {
PackageManager packageManager = activity.getPackageManager();
if (packageManager != null) {
ActivityInfo activityInfo = packageManager.getActivityInfo(activity.getComponentName(), 0);
if (activityInfo != null) {
activityTitle = activityInfo.loadLabel(packageManager).toString();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return activityTitle;
}

我们首先通过 activity.getTitle() 获取当前 Activity 的 title,因为用户有可能会使用 ActionBar 或 ToolBar,所以我们还需要获取 ActionBar 或 ToolBar 设置的 title,如果能获取到,就以这个为准(即覆盖通过 activity.getTitle() 获取的 title)。如果以上两个步骤都没有获取到 title,那我们就要尝试获取 android:label 属性的值。

获取 ActionBar 或 ToolBar 的 title 逻辑如下:

复制代码
@TargetApi(11)
private static String getToolbarTitle(Activity activity) {
try {
ActionBar actionBar = activity.getActionBar();
if (actionBar != null) {
if (!TextUtils.isEmpty(actionBar.getTitle())) {
return actionBar.getTitle().toString();
}
} else {
if (activity instanceof AppCompatActivity) {
AppCompatActivity appCompatActivity = (AppCompatActivity) activity;
android.support.v7.app.ActionBar supportActionBar = appCompat-Activity.getSupportActionBar();
if (supportActionBar != null) {
if (!TextUtils.isEmpty(supportActionBar.getTitle())) {
return supportActionBar.getTitle().toString();
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

修改 trackAppViewScreen(Activity activity) 方法,添加设置 $title 属性的逻辑:

复制代码
/**
* Track 页面浏览事件
*
* @param activity Activity
*/
@Keep
private static void trackAppViewScreen(Activity activity) {
try {
if (activity == null) {
return;
}
if (mIgnoredActivities.contains(activity.getClass().hashCode())) {
return;
}
JSONObject properties = new JSONObject();
properties.put("$activity", activity.getClass().getCanonicalName());
properties.put("$title", getActivityTitle(activity));
SensorsDataAPI.getInstance().track("$AppViewScreen", properties);
} catch (Exception e) {
e.printStackTrace();
}
}

运行 demo,可以看到打印的如下事件信息,参考图 2-3。

Android全埋点解决方案(9):$AppViewScreen全埋点方案 2.5

图 2-3 页面浏览事件详细信息

至此,一个相对完善的用来采集页面浏览事件的全埋点方案就算完成了。

Android全埋点解决方案(9):$AppViewScreen全埋点方案 2.5

购书地址 https://item.jd.com/12574672.html?dist=jd

评论

发布