`
Z_萧晓
  • 浏览: 10784 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

太恐怖了!移动开发APP 可视化埋点技术原理竟然是这样的?!

阅读更多

一、背景

运营者能够对用户行为进行分析的前提,是对大量数据的掌握。在以往,这个数据通常是由开发者在控件点击、页面等事件中,一行行地编写埋点代码来完成数据收集的。然而传统的操作模式每当升级改版时,开发和测试人员就需要重复不断对代码进行更新,整个流程耗时长,无法满足业务的需求。

 

为帮助开发者解决这一痛点,个推应用统计“个数”推出“可视化埋点”这一技术来更高效地实现这个这一过程。“个数”的可视化埋点灵活、方便,开发者不需对数据追踪点添加任何代码,只需要连接管理台并圈选页面中需要埋点的元素,即可添加随时生效的界面追踪点。

本文将结合个数实践经验,对可视化埋点中的两大关键技术点即控件唯一标识和事件采集进行分析并提供解决方案。

 

二、可视化埋点关键技术点

可视化埋点的难点,或者说核心就是如何在开发者不编写任何代码的情况下,SDK 如何确定任意一个控件在该应用内的唯一性,以及如何监听控件的点击和页面的切换。

 

标识

 

为了防止不同页面中的控件标识重复出现,控件的唯一标识一般由页面标识加上控件标识生成。

 

页面标识生成

 

页面标识可以直接使用页面的名称,即 Activity name。其获取方式比较多,这里介绍一种比较通用的方法,即通过注册 Application.ActivityLifecycleCallbacks ,开发者可以在以下生命周期的回调中,轻松地拿到当前的 Activity 对象。此方法适用于一个 Activity 并无 Fragment 存在的情形。

 

代码详见下图:

 

获取方式也是比较多,不过较于 Activity 的获取会相对麻烦一些,因为系统没有直接提供 API ,因而需要稍微转个弯:通过 Gradle 插桩的方式,获取 Fragment 的生命周期,以及 Fragment 实例对象:

 

如果该应用的页面存在一个 Activity 中嵌套多个 Fragment 的情况,单单一个 Activity name则可能无法精准地定位到某个页面,因而还需要加上 Fragment 的名称。Fragment的获取可以通过 Gradle 插桩法来实现,即根据 Fragment 的生命周期来获取Fragment 实例对象。

 

1.2控件标识生成

理想的情况下页面中的每个控件都有属于自己的唯一 id,SDK 直接获取控件的 id 当做控件标识即可。但现实情况却是,一个页面中往往存在多个相同 id 的控件,或者是没有 id 的控件,比如 Listview 的 item ,开发者不可能给listview的每个item 设置不同的 id。

 

因此需要转变一下思路。我们可以从控件路径这个除id 外比较独特的性质着手来生成控件标识。开发者可以通过给控件的路径加上控件角标的结构方式,生成控件的唯一标识。下图是Github 上一个仿 B 站的应用。我们对这个应用进行一下控件树分析。首先我们使用 Android Studio 自带的 UI Automator Viewer 工具查看该页面的布局结构:

 

接下来,我们可以从Application.ActivityLifecycleCallbacks 的回调中拿到 Activity 实例,再使用 activity.getWindow().getDecorView().getRootView() 方法来获取当前页面的控件树。

 

例如图中的文字控件是 TextView,且无兄弟布局,则可以标记为 TextView[0] 。它的父布局是 LinearLayout 且排在兄弟布局中的第二位,那么就可以写成是 LinearLayout[1],然后使用自己定义的符号拼接,像是 LinearLayout[1]/TextView[0] 。之后以此类推、循环遍历、层层递进,将所有经过的控件以及它们的下标都拼接起来,组成控件在该页面中的唯一标识。

 

对于一些可复用的 View ,我们则需要采取一些特殊处理。例如对于 RecyclerView、ListView、 ViewPager 等复用控件,我们都需要采取不同的处理方式,去获取当前 View 在该控件中的具体下标。如果没有进行特殊处理,则会导致子控件错位,数据统计不准确。

 

采集

 

在以往的处理中,如果需要知道一个按钮的点击次数,开发者就要在该控件的click事件中加入对应的打点代码。这种重复劳作,无疑增加了开发者的开发负担。对此,我们可以采用动态代理方式或Gradle 插桩方式来改善这个问题。

 

动态代理方式

 

使用安卓自带的辅助功能 View.AccessibilityDelegate 。前文提到当页面变化时,我们可以通过 Application.ActivityLifecycleCallbacks 获取到 Activity 的实例对象,接着根据activity.getWindow().getDecorView().getRootView() 来获取到控件树。由于控件树可能会实时发生变化,我们则需要通过 ViewTreeObserver.OnGlobalLayoutListener 的方法监听视图变化,从而在该回调中拿到变化的控件。接着我们 要根据递归判断该控件是否为 ViewGroup、是否可以点击、是否能够显示等,继而给符合条件的 View 设置 sendAccessibilityEvent();此外,我们还要在继承了 View.AccessibilityDelegate 的定义类中,对以下这些方法添加 SDK 的代理:

 

当对应的控件被点击时,系统就会自动调用设置过代理的方法,存储或者上报对应数据。

 

Gradle 插桩的方式

Android Gradle 工具在1.5.0 版本后提供了 Transfrom API , 该API 允许第三方 Plugin 在打包 dex 文件之前的编译过程中操作 .class 文件。在编译期,开发者可以通过onClick、onItemClick等方法(详见下图)进行监听,这相当于是正则匹配。

当上述监听的方法被编译的时候,就可以将埋点的代理操作插入这些方法中,实现自动化埋点的流程。网上相关流程也是非常详细,有兴趣的可以自行搜索学习。

 

三、结语

以上就是APP端可视化埋点实现过程中的关键点,特别需要注意的是控件唯一标识那一块,由于布局千变万化,开发者针对很多特定的布局都需要采取对应的处理方式。

据目前应用统计——个数这个产品只需要一行初始化代码就可以自动帮助开发者采集包括页面统计、事件埋点、新增活跃等多维度信息。


最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

 

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

 

上述【高清技术脑图】以及【配套的架构技术PDF】可以 加我WX:X1524478394 免费获取

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

分享到:
评论

相关推荐

    APP可视化设计工具,支持HTML5设定,后台流程化引擎。

    综上所述,这款APP可视化设计工具集成了多种功能,旨在提供一个高效、一体化的开发环境,涵盖从界面设计到后端交互的全过程。通过使用这样的工具,开发者和设计师可以更加便捷地协作,快速迭代,创造出更高质量的...

    混合移动APP跨平台混合开发综述.pdf

    混合移动APP跨平台混合开发综述.pdf文章总结了当前混合移动APP跨平台混合开发的概况,介绍了传统移动APP开发的缺陷,以及混合开发技术的原理和模式。该文研究了Cordova框架下的APP软件体系结构,并提出了使用混合...

    基于移动终端的农产品产业链可视化销售APP设计与实现.pdf

    "基于移动终端的农产品产业链可视化销售APP设计与实现" 本资源摘要信息将基于移动终端的农产品产业链可视化销售APP设计与实现,提供了一个基于移动终端的农产品产业链可视化销售APP的设计和实现方案。该APP旨在解决...

    iOS全埋点技术白皮书精品报告2020.pdf

    iOS全埋点技术是iOS开发中用于追踪和分析用户行为的一系列方法论和技术。全埋点的目的是通过预先设定好的数据采集规则,在用户不知情的情况下,自动收集应用程序的使用数据,为开发者提供用户行为的详细视图。全埋点...

    基于.Net 5.0、Uni-App开发,支持可视化布局的小程序商城系统.zip

    小程序商城系统源码,基于.Net 5.0、Uni-App开发,支持可视化布局,前后端分离,支持分布式部署,跨平台运行,拥有分销、代理、团购、拼团、秒杀、直播、优惠券、自定义表单等众多营销功能,拥有完整SKU、下单、售后...

    《App Inventor移动终端应用开发》课程标准.pdf

    《App Inventor移动终端应用开发》是一门专为初学者设计的编程课程,旨在通过直观的积木式编程,让非专业程序员也能快速构建Android应用程序。App Inventor摒弃了传统编程中的复杂语法,转而采用图形化编程界面,...

    Android Studio实现安卓APP大作业百宝箱app源代码移动终端开发大作业.zip

    Android Studio实现安卓APP大作业百宝箱app源代码移动终端开发大作业。Android Studio实现安卓APP大作业百宝箱app源代码移动终端开发大作业。Android Studio实现安卓APP大作业百宝箱app源代码移动终端开发大作业。...

    Delphi XE8 iOS与Android移动应用开发(APP开发)[完整中文版]

    Delphi XE8 iOS与Android移动应用开发(APP开发)[完整中文版],这是一本不可多得的介绍使用delphi xe8开发iOS与Android移动应用的电子书,实用的技术开发教程与技术开发手册。 Delphi XE8跨平台开发让你使用一套...

    基于Matlab App Designer开发的App可视化界面及程序

    采用Matlab App Designer制作App可视化界面,开发程序,并进行相关计算

    App界面开发可视化移动应用流程.docx

    IoT Studio是阿里云推出的一款强大的物联网应用开发工具,它提供了可视化的界面开发功能,让开发者可以轻松地创建移动应用,并实现嵌入式硬件的联网。本文将详细讲解如何利用IoT Studio进行App界面的开发。 首先,...

    基于体验设计的健身类APP信息可视化设计研究.pdf

    "基于体验设计的健身类APP信息可视化设计研究" 本文从体验设计的角度,研究了健身类APP的信息可视化设计方法,以提高用户体验。通过对内容和形式的分析,探讨了数据整理、视觉层次与视觉流向的构建,并分析了健身类...

    移动互联网APP技术原理分析及监管策略研究.pdf

    信息采集层是移动互联网APP运行的基础信息层,通过网络爬虫技术,从海量的互联网信息中抓取有用的信息和音频等信息,与平台用户录入的原创信息一起存入基础信息库;同时完成用户基础信息的采集输入,为数据层的分析...

    移动学习APP科学开发与教学效果提升策略研究.pdf

    移动学习APP的科学开发与教学效果提升策略是当前教育领域关注的重要议题。随着智能手机的普及和网络技术的进步,移动学习已成为教育信息化的一大趋势。本文基于胡晓辉的研究,探讨了如何优化移动学习APP的设计,以及...

    基于APP中个性化需求交互式信息可视化设计研究.pdf

    "基于APP中个性化需求交互式信息可视化设计研究" 本文主要探讨了基于APP中的个性化需求交互式信息可视化设计研究,旨在提高信息可视化的 effetiveness,并为用户提供更加个性化的体验。 一、交互式信息可视化的...

    可视化网页开发工具ePage v0.41

    ePage是新一代的可视化11的所见即所得,目前主流的开发平台eclipse,vs,dreamweaver等都无法做到这一点。对代码和页面的树状统筹管理,可是轻松的实现2000+页面的超大型项目设计开发和维护。“事务集”概念的提出,在...

    运动类APP的信息可视化界面设计研究.pdf

    《运动类APP的信息可视化界面设计研究》是一篇深入探讨如何运用信息可视化理论来优化运动类应用程序界面设计的学术论文。作者袁浩等来自江苏大学,他们专注于智能装备、产品造型设计以及数控界面交互行为的研究。 ...

    基于uni-app框架和uview组件库开发的app可视化拖拽编辑器,适用于企业、个人等基于uni-app技术栈开发的项目

    uni-lowcode低代码开发平台是一款基于uni-app框架和uview组件库开发的app可视化拖拽编辑器,适用于企业、个人等基于uni-app技术栈开发的项目。适合各种小程序平台的开发人员、产品经理、UI等等。采用MIT开源协议,...

Global site tag (gtag.js) - Google Analytics