通過註解埋點
阿新 • • 發佈:2019-01-09
由於專案原來毫無框架可言,現在又需要獲取程式的執行狀態,考慮到工作量以及後續維護,現通過註解解決問題
1、控制元件都是通過setOnClickListener加監聽的,現在要對所有的監聽加上其執行時間
步驟 1、添加註解類
2、在BaseActivity中新增
InjectUtils.inject(this);
3、
import android.app.Activity; import android.graphics.Path; import android.provider.SyncStateContract; import android.util.Log; importandroid.view.View; import java.lang.reflect.Field; /** * Created by 邱乾坤 on 2017/3/4. */ public class InjectUtils { public static long CLICK_TIME; public static void inject(Activity activity) { intectEvents(activity); } private static void intectEvents(Activity activity) { Class<? extendsActivity> clazz = activity.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { OnClick onClick = field.getAnnotation(OnClick.class); if (onClick != null) {
//發現控制元件 int viewId = onClick.value(); View view = activity.findViewById(viewId); Class viewClass = view.getClass(); try{
//通過原始碼發現Listener是封裝在內部類的一個屬性,通過反射獲取內部類例項,在反射得到監聽事件,再通過代理模式獲取時間 Field field1 = viewClass.getSuperclass().getSuperclass().getDeclaredField("mListenerInfo"); field1.setAccessible(true); Object target = field1.get(view); // Class aClass = Class.forName(field1.getType().getName()); Field field2 = target.getClass().getDeclaredField("mOnClickListener"); field2.setAccessible(true); View.OnClickListener listener = (View.OnClickListener) field2.get(target); view.setOnClickListener(new MyClickListener(listener)); } catch (Exception e) { e.printStackTrace(); } } } } public static class MyClickListener implements View.OnClickListener { private View.OnClickListener listener; public MyClickListener(View.OnClickListener listener) { this.listener = listener; } @Override public void onClick(View view) { //CLICK_TIME = 0; CLICK_TIME = System.currentTimeMillis(); Log.e("onClick", CLICK_TIME + ""); listener.onClick(view); } } }
對每個view加上註解即可