APP數據採集SDK設計

背景介紹

    隨着流量紅利逐漸消失,移動互聯網時代正式進入了一個新的階段,這個階段要求我們對有限的流量進行精細化運營、深度挖掘加工,從而使流量進行有效轉換和不斷增長。
    完備的前端監控系統是精細化運營的主要手段、它通過大數據來指導我們的運營策略、改善用戶體驗,同時也通過對數據半自動或者自動分析,來快速定位被監控系統的問題。
    前端監控的第一個環節就是數據採集,其中移動APP的數據採集在數據採集中佔主要的方面,本文就主要聊一聊Android端數據採集。

定義

數據採集指數據採集到後臺服務器的過程。

基本流程

名詞解釋

數據抓取
    抓取App運行數據、例如用戶點擊事件、性能數據、運行異常崩潰等,也叫數據採集、但是爲了跟我們大的數據採集區分開、我們本文中統稱爲數據抓取。
數據緩存
    根據數據抓取時App運行環境、進行不同策略的本地緩存。這裏不同策略是指緩存方式不同、緩存時間不同、觸發上報時機不同等。
    例如:緩存方式,當抓取的數據緩存時候、可以選擇文件緩存、數據庫緩存、內存緩存等;緩存時間、對於不同級別的監控,要求可以有立馬上報、每天上報、每小時上報等;觸發上報時機,例如將用戶瀏覽頁面的情況(瀏覽了哪些app頁面)存儲於本地數據庫,等用戶處於wifi環境時候把數據上傳到服務器。
數據上報
    在特定時機把抓取到的數據和緩存數據上傳到後臺服務器。

SDK設計要求

    爲了方便使用,我們一般會把數據採集部分做成一個單獨的模塊,以Lib的形式提供給主應用使用。一個好的SDK要滿足如下條件:

1.簡潔易用

a)易學習
  讓開發者儘量花比較少的時間來學習。
b)少侵入
  SDK接入時用戶儘可能的少的修改主應用代碼。
c) 少升級
  SDK接入後不會頻繁要求升級。

2.穩定

a)穩定的API
  對外提供穩定的API一旦確定,如無非常嚴重情況不可更改。
b)穩定的業務
  在穩定的API後,要有穩定的業務來支撐,業務邏輯也不可隨意更改。
c)穩定的運行
  SDK運行錯誤異常較少。

3.高效

a) 內存佔用少
b)流量費用低
c) 電量消耗少
d) 時間響應快

     參照數據採集基本流程和SDK設計原則,我們開始深入研究數據採集模塊.
     數據採集模塊LuckinMonitor概況圖如下

看到這裏基本就講完了,下面主要是針對一些具體部分進行介紹。

內容詳解

一 數據抓取

目標: 抓取用戶點擊事件、業務性能數據、異常崩潰、用戶設備信息等。
問題:不同類型的數據抓取方法不同。
要求:數據抓取是整個數據採集SDK與主應用的接入點,所以要求有少侵入,Api設計穩定合理,少而簡單、有新的需求易擴展。
實施:首先我們把所有的需要抓取的數據類型一一羅列出來、每一種數據類型都按照儘量少侵入業務代碼的思路去整理出來它的抓取方法。我列舉了一部分如下表格:


    接下來把需要採集的數據進行逐條分析,跟業務關聯比較緊密就不一一列舉。根據採集數據方法的不同,我們來構造不同的數據採集器-具體實現抓取數據的類。外界對數據抓取技術研究也挺多,大概分爲兩類.
1 侵入式抓取、也叫代碼中埋點;
2 非侵入式抓取,也可以叫無痕埋點。
    代碼中埋點,指的就是在你寫業務代碼時候,加上抓取事件的代碼。例如 你想知道一個Activity(頁面)啥時候顯示,那麼你在onResume地方打一個帶有時間戳的log ,就是把這個Activity顯示時間給抓取到了。
代碼中埋點,對不同的種類比如檢測內存泄漏、crash的可能就是一句初始化、一些具體業務邏輯可能需要在代碼中放置很多數據抓取的代碼,所以在monitor中 我們暫時有三種數據抓取方法:

1 代碼埋點抓取

    所謂代碼埋點,就是在程序中寫上我們抓取業務流程、性能數據等的代碼。
因爲是代碼埋點,不需要什麼特殊的技術、所以只需一個通用的上報數據處理器就好,但是爲了跟其他方式分割開,用一個空實現類DefaultReporter。

2 無痕埋點抓取點擊事件等

    LuckyMonitor中,採用AspectJ技術實現非入侵式代碼埋點、主要用來檢測各種view的點擊事件。AspectJ就是在編譯時候把埋點的代碼寫入到特定的位置,相當於編譯器幫助我們進行代碼埋點,我們需要做的就是告訴AspectJ的編譯器在哪裏進行代碼中埋點。

3 crash信息抓取

    crash信息抓取基本原理就是實現接Thread.UncaughtExceptionHandler
實現了這個接口就可以在程序發生crash時候、調用到這裏進行我們自己的處理邏輯,比如把抓到的crash trace存儲起來,上報等。

外部接口

    封裝的LuckyMonitor如何使用呢,一個庫如何才能更方便的使用呢? 肯定是對外提供的接口越簡單、越穩定越好。但是我們需要採集、處理的數據類型都各種不同、所以就需要我們提供更好的封裝。構造一個數據類型的超類,內部判斷可以根據不同的數據類型採取不同的數據抓取方案。

數據抽象類介紹(待完善)

頂層類:AppMessage裏面帶有一些通用的信息,比如app版本號、事件發生時間、手機類型Android or IOS、數據採集ID等。
具體來說有以下幾種數據
  1 DeviceMessage 設備信息例如手機品牌、手機型號、系統版本號等
  2 DnsMessage 域名系統信息
  3 EventMessage
  4 ExceptionMessage

參考文檔

  https://www.jianshu.com/p/5cf360fc9957
  https://blog.csdn.net/wozuihaole/article/details/70224920

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章