Skip to content

Commit 938802c

Browse files
添加字节跳动 Android 面试题大纲
1 parent 488723d commit 938802c

12 files changed

Lines changed: 856 additions & 38 deletions

File tree

Android 技术文章/Android Hook 入门.md

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,28 @@
11
```java
2-
private void hookOnClickListener(View view) {
2+
/**
3+
* 实现点击监听
4+
*/
5+
public class OnClickListenerProxy implements View.OnClickListener{
6+
private View.OnClickListener mOriginalListener;
7+
8+
//直接在构造函数中传进来原来的OnClickListener
9+
public OnClickListenerProxy(View.OnClickListener originalListener) {
10+
mOriginalListener = originalListener;
11+
}
12+
13+
@Override public void onClick(View v) {
14+
if (mOriginalListener != null) {
15+
mOriginalListener.onClick(v);
16+
}
17+
Log.d("LOGCAT","hooked!");
18+
}
19+
}
20+
21+
public static void hookOnClickListener(View view) {
322
try {
423
// 得到 View 的 ListenerInfo 对象
524
Method getListenerInfo = View.class.getDeclaredMethod("getListenerInfo");
25+
//修改getListenerInfo为可访问(View中的getListenerInfo不是public)
626
getListenerInfo.setAccessible(true);
727
Object listenerInfo = getListenerInfo.invoke(view);
828
// 得到 原始的 OnClickListener 对象
@@ -11,13 +31,14 @@
1131
mOnClickListener.setAccessible(true);
1232
View.OnClickListener originOnClickListener = (View.OnClickListener) mOnClickListener.get(listenerInfo);
1333
// 用自定义的 OnClickListener 替换原始的 OnClickListener
14-
View.OnClickListener hookedOnClickListener = new HookedOnClickListener(originOnClickListener);
34+
View.OnClickListener hookedOnClickListener = new OnClickListenerProxy(originOnClickListener);
1535
mOnClickListener.set(listenerInfo, hookedOnClickListener);
1636
} catch (Exception e) {
17-
Log.e("hook clickListener failed!", e.getMessage());
37+
Log.d("LOGCAT","hook clickListener failed!", e);
1838
}
1939
}
2040

41+
2142
public void hookH_Handler() {
2243
try {
2344
//拿到 ActivityThread#H

0 commit comments

Comments
 (0)