1. 程式人生 > 其它 >Android 埋點解決方案

Android 埋點解決方案

技術標籤:android工具類android埋點

Android埋點存在兩種方案,一種是全埋點方案,就是埋點全部自動收集資料,無需開發者寫程式碼,實現方案會很複雜,單模組的開發者控制不了邏輯;二是自埋點方案,大部分的埋點資料都是通過開發者自己埋入資訊,自由度很高。具體方案應該說適合的才是最好的。

一、全埋點方案

無需Android應用程式開發工程師寫程式碼或者只寫少量的程式碼,就能預先自動收集使用者的所有行為資料,然後根據實際的業務分析需求從中篩選出所需行為資料並進行分析。
全埋點採集事件分為4中:(事件名稱前面的$符號,指事件是預置事件,與之對應的是自定義事件)
$AppStart事件:指應用程式啟動,同時包括冷啟動和熱啟動場景

$AppEnd事件:指應用程式退出,包括應用程式的正常退出、按Home鍵進入後臺、應用程式被強殺、應用程式崩潰等場景
$AppViewScreen:指應用程式頁面瀏覽,對於Android應用程式來說,指切換Activity或Fragment
$AppClick事件:指應用程式控制元件點選,即View被點選
$AppClick事件全埋點技術分為兩種:
一是可以使用靜態代理的方式,通過Gradle Plugin在應用程式編譯期間“插入”程式碼或者修改程式碼(.Class檔案),比如AspectJ、ASM、Javassist、AST等方案。
在這裡插入圖片描述

二是動態代理,程式碼執行的時候去代理。比如View.OnClickListener、Window.Callback、View.AccessibilityDelegate等方案。

總體效能上來說,還是靜態代理優於動態代理,靜態程式碼在編譯期間就已經處理完成了,動態代理需要在程式碼執行期間進行處理,會對應用程式的整體效能有一定的影響.
$AppViewScreen埋點方案:
可以使用Application.registerActivityLifecycleCallbacks()方法,在onActivityResume()方法內部上傳Activity的$AppViewScreen事件,表示當前Activity可見了。
存在的問題是:如果當前頁面獲取許可權之後,又會重新呼叫onResume方法,這個時候需要去重。

$AppStart和$AppEnd全埋點方案
使用ContentProvider+SP檔案,儲存app啟動和關閉的時間

使用Application.registerActivityLifecycleCallbacks()方法,在onActivityStart中監測,判斷上個頁面退出的時間,如果沒有超過30s,那麼正常啟動$AppViewScreen事件。如果超過了30s,需要判斷之前是否觸發過$AppEnd事件,如果沒有,就需要觸發$AppEnd事件,然後在觸發$AppStart和$AppViewScreen事件。
在onActivityPause方法中,啟動30s倒計時,如果30s內沒有頁面啟動,那麼就觸發$AppEnd事件。啟動新頁面了,儲存一個標記位標記新頁面進來,倒計時關閉。因為一個app可能存在多個程序,所以使用程序間資料共享,通過ContentProvider+SP來進行儲存。然後通過ContentObserver監聽新頁面進來的標記位改變,從而取消上個頁面退出時啟動的倒計時。超過30s沒有新的頁面進來,觸發$AppEnd事件,或者下次啟動時候補發$End事件。當然這種情況也會導致$AppEnd事件丟失,因為app被解除安裝了或者不啟動了。

捕獲app崩潰日誌:
自定義一個類繼承UncaughtExceptionHandler 類,重寫內部的uncaughtException方法

/**
 * 收集崩潰資訊
 */
class CrashHandler :Thread.UncaughtExceptionHandler{

    companion object{
        val INSTANCE = CrashHandler()

    }

    private constructor(){
        Thread.setDefaultUncaughtExceptionHandler(this)
    }

    override fun uncaughtException(t: Thread, e: Throwable) {
        Log.e("CrashHandler", e.message.toString())
    }
}

二、自埋點方案

就是全部由程式設計師自己去埋點,也是包括app啟動、退出埋點、頁面埋點、點選埋點、曝光埋點,底層提供多個方法,由各模組自己去填入自己定義的資料格式,然後由base模組統一上傳資料,
分為幾種情況:
一是定時, 定時就是每隔幾分鐘上傳一次資料;
二是按home鍵或者退出app時候,會將儲存的所有埋點資料統一上傳;
三是資料量足夠的時候上傳,就是當資料超過100的時候上傳一次。
頁面埋點包括Activity和Fragment,這些都是需要開發、產品和業務事先確定好,否則容易發生資料錯亂問題。