android無痕打點 aop+databing實現android無痕埋點


無痕打點github源碼

1.前提

      業務中經常需要對所有的打擊事件做統計, 最簡單的就是在每個click處加上自己的代碼, 或者全繼承自己的view, 這些都跟業務耦合性太高,除了一些特殊的點,可能大部分點都是

可以用通用打點的方式來實現, 利用AOP 切面 將打點在編譯前從業務中剝離出去,甚至打點數據直接從服務器下發,或者直接通過gradle腳本動態讀取PM的打點文檔實現自動注入

 

 

2.打點

 一.通用點

     一般是跟界面有關系的, 當前點處於哪個activity, fragment, 這里我們可以通過實現 通用的接口, 將界面通用點放入方法中,這個一般都能在基類中實現, 然后在AOP模塊中拿到對應數據,

  如果想完全解耦,甚至可以通過反射的方式拿到通用打點數據

二.元素特殊點

  比如我們需要知道當前元素處於列表中的位置,或者當前元素的名稱,點擊時間之類

  這邊介紹的都是通過databinding 綁定的事件 ,因為比較通用,如果你界面里用 setOnClickListener 的話可以用aop切全局

  

        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                  android:text="@{module.name}"
                  app:bindClickData='@{"name:" + module.name + ",position:" + position}'
                  android:textSize="20sp"
                  android:onClick="@{(view)->click.onMainClick(module,view)}"
                  android:padding="20dp"/>

  

app:bindClickData 是自定義的databind事件,這里 主要是為了傳遞一些item自有的參數,
這里可以看到我主要傳了當前item的 名稱 和在列表中的位置

public class BindAppUtils {
    @BindingAdapter("bindClickData")
    public static void bindClickData(View view, String data) {
        Log.e("lin","bindData="+data);
        view.setTag(R.id.snow_click_id,data);
    }
}

  這個就是自定義的綁定事件, 我們通過view.setTag 把特殊打點數據緩存到view中

android:onClick是view的普通點擊事件,
databind所有click事件都會走generatedJava 目錄下
你的包名.generated.callback.OnClickListener

    @Before("execution(* com.lin.aopdemo.generated.callback.OnClickListener.onClick(..))")
    public void onCommonClick(JoinPoint joinPoint) throws Throwable {
        View view  = (View)joinPoint.getArgs()[0];
        Log.e("lin","onClick="+joinPoint.getThis());
        if(view.getContext() instanceof ClickInter){
            ClickModel.INSTANCE.doClick(view,((ClickInter)view.getContext()).getPageParam());
        }
    }

  這里是切面方法,就是對應的點擊view, 這里取了界面的通用參數, 如果要完全解耦,可以用反射獲取getPageParam(),當然 直接取性能會比反射好

 

    fun doClick(view: View, m: Map<String,String>) {
        var data = view.getTag(R.id.snow_click_id) as String
        var map = mutableMapOf<String,String>()
        map.putAll(m);
        data?.split(",").forEach {
            if(it.contains(":")){
                map.put(it.split(":")[0],it.split(":")[1])
            }
        }
        Log.e("lin",map.toString())
    }

  具體的點擊方法  我們通過view.getTag拿到前面 databing塞進去的特殊數據, 全部塞到一個map中,從而完成一次打點

    后面具體通過什么 方法忘平台傳數據 可以自己定義

具體可以看頂部的源碼, 例子比較簡單,具體需求可以按照這種思路擴展


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM