自动化打点初探

作者: 轻微 | 来源:发表于2016-01-22 19:33 被阅读1953次

    dim.red
    好处:
    业务逻辑可以和打点逻辑分离.
    打点更灵活.
    防止漏打的情况.
    发包以后可以新增打点:

    实现原理:
    (TalkingData灵动分析技术揭秘(下))
    http://www.9miao.com/thread-70467-1-1.html
    简单的说:就是给View设置AccessibilityDelegate,而当View 产生了click,long_click 等事件的时候.会在响应原有的Listener方法后.发送消息给
    AccessibilityDelegate.然后在sendAccessibilityEvent方法下做打点操作.

    设置AccessibilityDelegate.

    方法一:

    在onResume中对activity.getWindow().getDecorView().getRootView()进行向下遍历

    
    
    application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
      @Override
      public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
       
      }
    
      @Override
      public void onActivityStarted(Activity activity) {
    
      }
    
      @Override
      public void onActivityResumed(Activity activity) {
        ViewTreeProcess.getInstant().process(activity.getWindow().getDecorView().getRootView());
      }
    
      @Override
      public void onActivityPaused(Activity activity) {
    
      }
    
      @Override
      public void onActivityStopped(Activity activity) {
    
      }
    
      @Override
      public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
    
      }
    
      @Override
      public void onActivityDestroyed(Activity activity) {
    
      }
    });
    

    第2种:

    拦截LayouInflater 对象

    
    /**
    * 类:
    * Created by dim on 16/1/9.
    */
    public class AutoTrackActivity extends AppCompatActivity {
    
      @Override
      public Object getSystemService(@NonNull String name) {
    
        Object object = super.getSystemService(name);
        if (traceEnable() && object instanceof LayoutInflater) {
          return new TrackLayoutInflater((LayoutInflater) object);
        }
        return object;
      }
    
      public boolean traceEnable() {
    
        return false;
      }
    }
    
    

    优缺点:
    第一种对app的浸入性小.只要在Application 注册一下就好了
    缺点是只遍历activity上面的View, 对类似PopupWindow 和Dialog 这种直接用WindowManger addView 的无能为力.

    第2种对app的浸入性比第一种大,但是并不是并不可接受的.
    使用AutoTrackActivity 作为activity的基类.或者对getSystemService方法进行拦截.因为要对LayoutInflater 进行代理的.对所有的使用到LayoutInflater的地方都可以覆盖到.像activity,dialog,PopupWindow都有很好的支持.

    定位View

    View 的唯一性.
    根据context的className+View自身的 Id的String 值.(String 值可以反射R文件得到)+View 的className值确定.
    当前没有id.向上需要父类的id,如果父类id 没有则记录父类className+getChildAt()值并且继续往上找,直到找到有id的view或者没有父类为止

    获取额外信息

    通过给View 设置setTag(int key, final Object tag).打印的时候获取这个tag,当前view没有,往它的Parent的找.直到没有父控件或者找到tag为止.

    Feature

    1. 配置化打点。
    • 配置化加点。
    • 自动获取额外信息。
    • (已完成)获取fragment信息。

    最后

    以后把源码放到三帅上面.

    相关文章

      网友评论

        本文标题:自动化打点初探

        本文链接:https://www.haomeiwen.com/subject/mydqkttx.html