Android埋点研究

埋点这个没什么特别的兴趣,了解了一下就不在继续了

0x0 埋点 代码里直接插入

一种是手动加代码,还有一种是插件的形式

0x1 无埋点/可视化埋点

Dispatchevent , 基于android 自带的一些事件 ,需要用户继承我们的一个baseactivity,这里没有考虑到自定义的ui,即继承于View的子类,代码基本靠搬运。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public boolean dispatchTouchEvent(MotionEvent ev) {
ViewGroup v =(ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content);
Log.d(TAG, "start");
SearchView(v.getChildAt(0), ev);
return true;
}

public void SearchView(View view ,MotionEvent ev){
View v = null ;
if( isInView(view , ev) && view.getVisibility() == View.VISIBLE){
if(view instanceof ViewGroup){
Log.d(TAG, "in view group");
ViewGroup group =(ViewGroup)view;
Log.d(TAG,"child count"+group.getChildCount());
for(int i = group.getChildCount()-1 ; i>=0 ; i--){
Log.d(TAG,""+i);
View child = group.getChildAt(i);
if(child instanceof Button){
Log.d(TAG,"button");
}
if(child instanceof TextView){
Log.d(TAG,child.getClass().toString());
if(child.getClass().toString().contains("TextView")){
Log.d(TAG,"textview2");
}else {
Log.d(TAG, "button2");
}
}
SearchView(child ,ev);

}
}
v = view ;
}
}


public boolean isInView(View view , MotionEvent ev){
float clickX = ev.getRawX();
float clickY = ev.getRawY();
Log.d(TAG, "event x "+clickX+" y "+clickY);
int[] location = new int[2];
view.getLocationOnScreen(location);
int x = location[0];
int y = location[1];
Log.d(TAG, "view x "+x+" y "+y);
int width = view.getWidth() ;
int height = view.getHeight() ;
Log.d(TAG, "width "+width + "height "+height);
if( (clickX > x && clickX < (x+width) )){
if(clickY >y && clickY <(y+height)) {
return true;
}
}
return false ;
}

0x2 通过hook的方式进行埋点

使用hook框架对常用的一些事件进行hook,从而获取事件的信息