自動化打點初探

dim.red
好處:
業(yè)務邏輯可以和打點邏輯分離.
打點更靈活.
防止漏打的情況.
發(fā)包以后可以新增打點:

實現原理:
(TalkingData靈動分析技術揭秘(下))
http://www.9miao.com/thread-70467-1-1.html
簡單的說:就是給View設置AccessibilityDelegate,而當View 產生了click,long_click 等事件的時候.會在響應原有的Listener方法后.發(fā)送消息給
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;
  }
}

優(yōu)缺點:
第一種對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()值并且繼續(xù)往上找,直到找到有id的view或者沒有父類為止

獲取額外信息

通過給View 設置setTag(int key, final Object tag).打印的時候獲取這個tag,當前view沒有,往它的Parent的找.直到沒有父控件或者找到tag為止.

Feature

  1. 配置化打點。
  • 配置化加點。
  • 自動獲取額外信息。
  • (已完成)獲取fragment信息。

最后

以后把源碼放到三帥上面.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容