歡迎光臨
每天分享高質量文章

資料採集技術揭秘:手把手教你全埋點技術解決方案

導讀:全埋點,也叫無埋點、無碼埋點、無痕埋點、自動埋點。全埋點是指無需 Android 應用程式開發工程師寫代碼或者只寫少量的代碼,就能預先自動收集用戶的所有行為資料,然後就可以根據實際的業務分析需求從中篩選出所需行為資料併進行分析。

 

 

作者:神策資料

如需轉載請聯繫大資料(ID:hzdashuju)

全埋點採集的事件目前主要包括下麵四種(事件名稱前面的 $ 符號,是指該事件是預置事件,與之對應的是自定義事件):

  • $AppStart 事件:是指應用程式啟動,同時包括冷啟動和熱啟動場景。熱啟動也就是指應用程式從後臺恢復。

  • $AppEnd 事件:是指應用程式退出,包括應用程式的正常退出、按 Home 鍵進入後臺、應用程式被強殺、應用程式崩潰等場景。

  • $AppViewScreen 事件:是指應用程式頁面瀏覽,對於 Android應用程式來說,就是指切換 Activity 或 Fragment。

  • $AppClick 事件:是指應用程式控制元件點擊,也即 View 被點擊,比如點擊 Button、ListView 等。

在採集的這四種事件當中,最重要並且採集難度最大的是 $AppClick 事件。

所以,全埋點的解決方案基本上也都是圍繞著如何採集 $AppClick 事件的。

對於 $AppClick 事件的全埋點整體解決思路,歸根結底,就是要自動的找到那個被點擊控制元件的點擊處理邏輯(我們後文也會叫原處理邏輯),然後再利用一定的技術原理,對原處理邏輯進行“攔截”,或者在原處理邏輯的執行前面或執行者後面“插入”相應的埋點代碼邏輯,從而達到自動埋點的效果。

至於如何做到自動“攔截” 控制元件的原處理邏輯,一般都是參考 Android 系統的事件處理機制來進行的。關於 Android 系統的事件處理機制,由於篇幅有限,不再詳述。

本文來主要介紹 $AppClick 全埋點方案:AST,更多全埋點方案請關註《Android 全埋點解決方案》一書。

 

 

01 關鍵技術

1. APT

APT 是 ANNOTATION PROCESSING TOOL 的縮寫,即註解處理器,是一種處理註解的工具。確切的說它是JAVAC的一個工具,它用來在編譯時掃描和處理註解。註解處理器以JAVA代碼(或者編譯過的位元組碼)作為輸入,生成 .JAVA檔案作為輸出。簡單來說就是在編譯期,通過註解生成 .JAVA檔案。

2. Element

自定義註解處理器,需要繼承 AbstractProcessor 類。而 AbstractProcessor 最重要的就是 process 方法。process 方法處理的核心是 Element 物件。

我們下麵詳細的介紹一下 Element 物件。

Element的完整原始碼如下。

package javax.lang.model.element;

import java.lang.annotation.Annotation;
import java.util.List;
import java.util.Set;
import javax.lang.model.AnnotatedConstruct;
import javax.lang.model.type.TypeMirror;

public interface Element extends AnnotatedConstruct {
    TypeMirror asType();
    ElementKind getKind();
    Set getModifiers();
    Name getSimpleName();
    Element getEnclosingElement();
    List extends Element> getEnclosedElements();
    boolean equals(Object var1);
    int hashCode();
    List extends AnnotationMirror> getAnnotationMirrors();
     getAnnotation(Class var1);
     accept(ElementVisitor var1, P var2);
}

從以上定義可以看出, Element 其實就是一個接口,它定義了外部可以呼叫的幾個方法。

我們下麵簡單的介紹一下它規定的一些常用方法。

Element 有 5 個直接子類,它們分別代表一種特定型別的元素。五個子類各有各的用處並且有各種獨有的方法,在使用的時候可以強制將Element物件轉換成其中的任何一種,但是必須滿足轉換的條件,不然會丟擲異常。

其中 TypeElement 和 VariableElement 是最核心的兩個 Element,也是我們下文會使用到的。

3. APT實體

我們下麵來講解一個關於 APT 實體。

我們通過 APT 來實現一個功能,功能類似於 ButterKnife 中的 @BindView 註解。即通過對 View 變數的註解,實現對 View 的系結(無需呼叫 findViewById 方法)。

完整的專案原始碼可以參考:

https://github.com/wangzhzh/AutoTrackAPTProject

4. AST

我們下麵講解一下什麼是 AST。

AST,是 Abstract Syntax Tree 的縮寫,即“抽象語法樹”,是編輯器對代碼的第一步加工之後的結果,是一個樹形式表示的原始碼。原始碼的每個元素映射到一個節點或子樹。

Java 的編譯過程可以分成三個階段,參考圖11-5。

▲圖11-5 編譯過程

  • 第一階段:所有的源檔案會被解析成語法樹;

  • 第二階段:呼叫註解處理器,即 APT 模塊。如果註解處理器產生了新的源檔案,新的源檔案也要參與編譯;

  • 第三階段:語法樹會被分析並轉化成類檔案。

 

02 原理概述

編輯器對代碼處理的流程大概是:

JavaTXT->詞語法分析-> 生成AST ->語意分析 -> 編譯位元組碼

通過操作AST,可以達到修改原始碼的功能。

可以在自定義註解處理器的 process 方法里,通過 roundEnvironment.getRootElements() 方法可以拿到所有的 Element 物件,通過 trees.getTree(element) 方法可以拿到對應的抽象語法樹(AST),然後我們自定義一個 TreeTranslator,在 visitMethodDef 里即可對方法進行判斷。

如果是標的處理方法,則通過 AST 框架的相關 API 即可插入埋點代碼,從而實現全埋點的效果。

 

03 案例

 

下麵以自動採集 Android 的 Button點擊事件為例,詳細介紹該方案的實現。對於其它控制元件的自動採集,後面會進行擴展。

完整的專案原始碼可以參考:

https://github.com/wangzhzh/AutoTrackAppClick8

 

04 缺點

  • com.sun.tools.javac.tree 相關 API 語法晦澀,理解難度大,要求對編譯原理有一定的基礎;

  • APT 無法掃描其他 module,導致 AST 無法處理其它 module;

  • 不支持 Lambda 語法;

  • 帶有傳回值的方法,很難把埋點代碼插入到方法之後。

 

關於作者:國內知名大資料公司神策資料出品,作者王灼洲是神策資料合肥研發中心負責人,有近10年Android開發經驗,開發和維護著知名商用開源 Android & iOS 資料埋點 SDK。  

延伸閱讀《Android 全埋點解決方案

點擊上圖瞭解及購買

轉載請聯繫微信:DoctorData

推薦語:10年Andriod開發經驗專家撰寫,8種Android全埋點技術方案,附原始碼。適讀人群:適用於初級、中級、高級水平的Android 開發工程師、技術經理、技術總監等。

 

已同步到看一看
赞(0)

分享創造快樂