最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android下hook點(diǎn)擊事件的示例

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

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

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

這里先記一下對(duì)點(diǎn)擊事件hook的基本流程。

1.先建一個(gè)代理類實(shí)現(xiàn)View.OnClickListener,用來(lái)做點(diǎn)擊后的后續(xù)處理。

import android.view.View;

/**
 * 實(shí)現(xiàn)點(diǎn)擊監(jiān)聽(tīng)
 */
public class OnClickListenerProxy implements View.OnClickListener{
  private View.OnClickListener mOriginalListener;

  //直接在構(gòu)造函數(shù)中傳進(jìn)來(lái)原來(lái)的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.通過(guò)java的反射機(jī)制進(jìn)行hook

public static void hookOnClickListener(View view) {
    try {
      // 得到 View 的 ListenerInfo 對(duì)象
      Method getListenerInfo = View.class.getDeclaredMethod("getListenerInfo");
      //修改getListenerInfo為可訪問(wèn)(View中的getListenerInfo不是public)
      getListenerInfo.setAccessible(true);
      Object listenerInfo = getListenerInfo.invoke(view);
      // 得到 原始的 OnClickListener 對(duì)象
      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)用上面這個(gè)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)計(jì)埋點(diǎn),不免需要帶點(diǎn)參數(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ù)操作而不用改動(dòng)原來(lái)的邏輯代碼了。

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

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

相關(guān)文章

  • Kotlin標(biāo)準(zhǔn)庫(kù)函數(shù)使用分析及介紹

    Kotlin標(biāo)準(zhǔn)庫(kù)函數(shù)使用分析及介紹

    Kotlin提供了一個(gè)系統(tǒng)庫(kù),是Java庫(kù)的增強(qiáng)。其中有很多函數(shù)在適配了Java的類型和方法同時(shí)使用Kotlin的語(yǔ)法。其中一些底層的函數(shù) 是使用比較廣泛的
    2022-09-09
  • Android 圖片Bitmap的剪切的示例代碼

    Android 圖片Bitmap的剪切的示例代碼

    本篇文章主要介紹了Android 圖片Bitmap的剪切的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Android中banner的使用步驟

    Android中banner的使用步驟

    本文分步驟給大詳細(xì)介紹了Android中banner的使用,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧
    2017-06-06
  • Android自定義帶動(dòng)畫(huà)效果的圓形ProgressBar

    Android自定義帶動(dòng)畫(huà)效果的圓形ProgressBar

    這篇文章主要為大家詳細(xì)介紹了Android自定義帶動(dòng)畫(huà)效果的圓形ProgressBar,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 自定義AlertDialog去除黑色背景的解決方法

    自定義AlertDialog去除黑色背景的解決方法

    今天小編就為大家分享一篇自定義AlertDialog去除黑色背景的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Android Jetpack架構(gòu)中ViewModel接口暴露的不合理探究

    Android Jetpack架構(gòu)中ViewModel接口暴露的不合理探究

    這篇文章主要介紹了Android Jetpack架構(gòu)組件 ViewModel詳解,ViewModel類讓數(shù)據(jù)可在發(fā)生屏幕旋轉(zhuǎn)等配置更改后繼續(xù)存在,ViewModel類旨在以注重生命周期的方式存儲(chǔ)和管理界面相關(guān)的數(shù)據(jù)。感興趣可以來(lái)學(xué)習(xí)一下
    2022-07-07
  • Kotlin字符串操作在Android開(kāi)發(fā)中的應(yīng)用示例代碼

    Kotlin字符串操作在Android開(kāi)發(fā)中的應(yīng)用示例代碼

    本文介紹了Kotlin在Android開(kāi)發(fā)中的字符串操作,包括多行字符串的創(chuàng)建、字符串插值、獲取字符串長(zhǎng)度以及處理特殊字符等,通過(guò)示例代碼,展示了這些操作的實(shí)現(xiàn)方法,使開(kāi)發(fā)者在處理字符串時(shí)更加高效便捷,感興趣的朋友一起看看吧
    2025-03-03
  • 最近較流行的效果 Android自定義View實(shí)現(xiàn)傾斜列表/圖片

    最近較流行的效果 Android自定義View實(shí)現(xiàn)傾斜列表/圖片

    最近較流行的效果,這篇文章主要介紹了Android自定義View實(shí)現(xiàn)傾斜列表/圖片的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 利用Flutter制作一個(gè)摸魚(yú)桌面版App

    利用Flutter制作一個(gè)摸魚(yú)桌面版App

    Win10商店上架了一款名為《摸魚(yú)》的App,在下載打開(kāi)之后,這個(gè)App會(huì)讓你的電腦進(jìn)入一個(gè)假更新的畫(huà)面。本文將為大家介紹如何通過(guò)Flutter制作一個(gè)桌面版的摸魚(yú)APP,快跟小編一起學(xué)習(xí)一下吧
    2021-12-12
  • Android編程實(shí)現(xiàn)檢測(cè)當(dāng)前電源狀態(tài)的方法

    Android編程實(shí)現(xiàn)檢測(cè)當(dāng)前電源狀態(tài)的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)檢測(cè)當(dāng)前電源狀態(tài)的方法,涉及Android針對(duì)當(dāng)前電源的電量、容量、伏數(shù)、溫度等的檢測(cè)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下
    2015-11-11

最新評(píng)論

普定县| 曲沃县| 沂源县| 沙洋县| 靖宇县| 新蔡县| 上思县| 攀枝花市| 泾川县| 安吉县| 宁海县| 丽水市| 库伦旗| 玛沁县| 平和县| 灌云县| 大宁县| 贵州省| 邯郸县| 汤阴县| 峨山| 休宁县| 台安县| 太康县| 海晏县| 奉新县| 金昌市| 葫芦岛市| 韶关市| 聂荣县| 准格尔旗| 新昌县| 滕州市| 平阴县| 铁力市| 集贤县| 柳河县| 保亭| 清原| 青岛市| 灵丘县|