Страницы

Поиск по вопросам

четверг, 15 ноября 2018 г.

Как можно проследить последовательность вызовов методов в Android приложении

Как можно развернуть во времени событийную последовательность вызова процедур указанных классов приложения? На примере Activity lifecycle, в onCreate, onResume, onPause и т.д. - в каждый метод можно вручную вставлять вызов Log.d. В LogCat после чего становится понятна последовательность вызовов. Подобное хотелось бы осуществлять в других классах исходных примеров, в которых может быть намного больше методов. Имеется ли автоматизация Log.d или аналогичный инструментарий? Методом trace получается много излишней информации над которой требуются дополнительные манипуляции при изучении. Или trace все же единственный подходящий способ?!


Ответ

Можно воспользоваться Аспектно - Ориентированным Программированием.
Добавить зависимости:
build.gradle
dependencies { ... classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.14' }
app/build.gradle
apply plugin: "android-aspectj" ... dependencies { ... compile 'org.aspectj:aspectjrt:1.8.9' }
Написать аспект:
LogAspect.java
@Aspect public class LogAspect { private static final String TAG = "aspect";
@Before("execution(* *(..)) ") public void doBeforeAyMethod(JoinPoint joinPoint) { if(joinPoint.getTarget() != null) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); Log.i(TAG, joinPoint.getTarget().getClass().getSimpleName() + " : " + method.getName()); } } }
Теперь все методы классов вашего приложения пропишутся в лог. Стоит помнить, что это сработает с методами непосредственно находящимися в классе, методы суперкласса не упадут в лог, только если они будут переопределены.
А если написать свою аннотацию, например:
MethodLog.java
@Target(ElementType.TYPE) public @interface MethodLog { }
Проаннотировать ею нужные классами, и добавить в аспект:
@Before("execution(* *(..)) && @within(MethodLog)")
В лог упадут методы только выбранных классов.

Комментариев нет:

Отправить комментарий