欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android下hook點擊事件的示例

 更新時間:2018年08月28日 13:57:19   作者:書柜里的松鼠  
這篇文章主要介紹了Android下hook點擊事件的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Hook是一種思想,也就是將原來的事件,替換到我們自己的事件,方便我們做一些切入處理。目的是不修改原來的代碼,同時也避免遺漏的N多類里面處理。

最近需要在現(xiàn)有的app中設(shè)置統(tǒng)計埋點。去業(yè)務(wù)代碼里埋的話似乎耦合度太高。所以決定使用hook的方法對事件進(jìn)行埋點處理。

這里先記一下對點擊事件hook的基本流程。

1.先建一個代理類實現(xiàn)View.OnClickListener,用來做點擊后的后續(xù)處理。

import android.view.View;

/**
 * 實現(xiàn)點擊監(jiān)聽
 */
public class OnClickListenerProxy implements View.OnClickListener{
  private View.OnClickListener mOriginalListener;

  //直接在構(gòu)造函數(shù)中傳進(jìn)來原來的OnClickListener
  public OnClickListenerProxy(View.OnClickListener originalListener) {
    mOriginalListener = originalListener;
  }

  @Override public void onClick(View v) {
    if (mOriginalListener != null) {
      mOriginalListener.onClick(v);
    }
    Log.d("LOGCAT","hooked!");
  }
}

2.通過java的反射機(jī)制進(jìn)行hook

public static void hookOnClickListener(View view) {
    try {
      // 得到 View 的 ListenerInfo 對象
      Method getListenerInfo = View.class.getDeclaredMethod("getListenerInfo");
      //修改getListenerInfo為可訪問(View中的getListenerInfo不是public)
      getListenerInfo.setAccessible(true);
      Object listenerInfo = getListenerInfo.invoke(view);
      // 得到 原始的 OnClickListener 對象
      Class<?> listenerInfoClz = Class.forName("android.view.View$ListenerInfo");
      Field mOnClickListener = listenerInfoClz.getDeclaredField("mOnClickListener");
      mOnClickListener.setAccessible(true);
      View.OnClickListener originOnClickListener = (View.OnClickListener) mOnClickListener.get(listenerInfo);
      // 用自定義的 OnClickListener 替換原始的 OnClickListener
      View.OnClickListener hookedOnClickListener = new OnClickListenerProxy(originOnClickListener);
      mOnClickListener.set(listenerInfo, hookedOnClickListener);
    } catch (Exception e) {
      Log.d("LOGCAT","hook clickListener failed!", e);
    }
  }

3.在你需要hook的事件后調(diào)用上面這個hookOnClickListener

Button btnSend = (Button) findViewById(R.id.btn_send);
    btnSend.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        log.info("onClick");
      }
    });
    HookManager.hookOnClickListener(btnSend);

4.作為統(tǒng)計埋點,不免需要帶點參數(shù)

在原業(yè)務(wù)代碼的onClick里設(shè)置參數(shù)

private View.OnClickListener clickBtn = new Button.OnClickListener(){
    @Override
    public void onClick(View v) {
      Map map = new HashMap();
      map.put("name",v.getClass().getName());
      v.setTag(v.getId(),map);
      HookManager.hookOnClickListener(v);
    }
  };

在自定義的代理onClick里接收參數(shù)

@Override public void onClick(View v) {
    if (mOriginalListener != null) {
      mOriginalListener.onClick(v);
    }
//    Log.d("LOGCAT","hooked!"+v.getId());
    //拿到之前傳遞的參數(shù)
    Object obj = v.getTag(v.getId());
    Log.d("LOGCAT","hooked!"+v.getId()+"_"+obj.toString());
  }

至此就可以在hook里隨意加入后續(xù)操作而不用改動原來的邏輯代碼了。

相關(guān)github地址: https://github.com/codeqian/android-class-lib/tree/master/utilDemo/app/src/main/java/Hook

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解析Android 如何獲得已安裝應(yīng)用大小

    解析Android 如何獲得已安裝應(yīng)用大小

    本篇文章是對Android獲得已安裝應(yīng)用大小的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Android 判斷是否連接成功了指定wifi

    Android 判斷是否連接成功了指定wifi

    本文主要介紹了Android 判斷是否連接成功了指定wifi的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • Android 模擬器的使用詳細(xì)介紹

    Android 模擬器的使用詳細(xì)介紹

    本文主要介紹Android 模擬器,在開發(fā)Android應(yīng)用過程中大家都要使用模擬器對應(yīng)用的測試,這里對模擬器的資料做了詳細(xì)整理,有興趣的小伙伴可以參考下
    2016-08-08
  • Android開啟新線程播放背景音樂

    Android開啟新線程播放背景音樂

    這篇文章主要為大家詳細(xì)介紹了Android開啟新線程播放背景音樂,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Flutter學(xué)習(xí)之構(gòu)建、布局及繪制三部曲

    Flutter學(xué)習(xí)之構(gòu)建、布局及繪制三部曲

    這篇文章主要給大家介紹了關(guān)于Flutter學(xué)習(xí)之構(gòu)建、布局及繪制三部曲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Flutter具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Android WebView交互傳遞json字符串并解析的方法

    Android WebView交互傳遞json字符串并解析的方法

    這篇文章主要給大家介紹了關(guān)于Android中WebView交互傳遞json字符串并解析的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-05-05
  • Android加載長圖的多種方案分享

    Android加載長圖的多種方案分享

    這篇文章主要介紹了Android加載長圖的多種方案分享,幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下
    2021-04-04
  • Android截屏分享功能

    Android截屏分享功能

    最近項目經(jīng)理交給我一個任務(wù),要求實現(xiàn)android截屏功能,包括Android截屏獲取圖片、將圖片保存到本地、通知系統(tǒng)相冊更新、通過微信、QQ、微博分享截屏圖片。小編把實現(xiàn)思路分享到腳本之家平臺,需要的朋友參考下
    2017-12-12
  • Android Native庫的加載及動態(tài)鏈接的過程

    Android Native庫的加載及動態(tài)鏈接的過程

    這篇文章主要介紹了Android Native庫的加載及動態(tài)鏈接的加載過程,需要的朋友可以參考下
    2018-01-01
  • Android橫豎屏切換及其對應(yīng)布局加載問題詳解

    Android橫豎屏切換及其對應(yīng)布局加載問題詳解

    這篇文章主要為大家詳細(xì)介紹了Android橫豎屏切換及其對應(yīng)布局加載問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04

最新評論