0

我正在尝试记录我的应用程序中每个 JAVA 方法的方法执行时间。我尝试了许多 aspectj 插件,例如uPhycaaspectx ,但由于 Java 8 兼容性或 gradle 插件兼容性而全部失败,或者主要是因为我在我的应用程序中使用了数据绑定。(我无法删除数据绑定,因为它在应用程序中被广泛使用)。我找到了雨果。这是一个插件,可用于记录应用程序中带有@Debuggable注释的任何方法时间。这个幕后项目也使用了aspectj 我没想到它可以与 current 一起使用,gradle但它可以工作,甚至我可以编写自己的 Aspect 类来拦截方法。我写了一个可以在这里记录方法时间的类

@Aspect
public class LoggingAspect {
    private static volatile boolean enabled = true;
    private static DisposableObserver<List<LogData>> subscription;
    private static final String TAG = LoggingAspect.class.getName();
    final static ExecutorService threadPoolExecutor = Executors.newFixedThreadPool(2);

    @Pointcut("execution(* example.aspect.dunmmy(..))")
    public void onClickEntryPoint() {
    }

    @Before("onClickEntryPoint()")
    public void onClickBefore(JoinPoint joinPoint) {
        Log.d(TAG, "Before Advice ==> Clicked on : " + joinPoint.getSignature().getName());
    }

    @Around("execution(* example.application..*(..))")
    public Object onClickAround(ProceedingJoinPoint joinPoint) throws Throwable {
        if (joinPoint != null && joinPoint.getTarget() != null) {
            long startNanos = System.nanoTime();
            Object result = joinPoint.proceed();
            long stopNanos = System.nanoTime();
            long lengthMillis = TimeUnit.NANOSECONDS.toMillis(stopNanos - startNanos);
            if (lengthMillis <= 10) {
                return result;
            }
            bufferResult(joinPoint, lengthMillis);
            return result;
        }
        return joinPoint.proceed();
    }

    @After("onClickEntryPoint()")
    public void onClickAfter(JoinPoint joinPoint) {
        Log.d(TAG, "After Advice ==> Clicked on : " + joinPoint.getSignature().getName());
    }

    @AfterReturning(pointcut = "onClickEntryPoint()")
    public void onClickAfterReturning() {
        Log.d(TAG, "AfterReturning Advice ==>");
    }

    private static void bufferResult(ProceedingJoinPoint joinPoint, long lengthMillis) {
        subscription = Observable.fromCallable(() -> {
            LogData data = new LogData();
            data.setClassName(joinPoint.getTarget().getClass().getSimpleName());
            data.setMethodName(joinPoint.getSignature().getName());
            data.setTimeTaken(lengthMillis);
            return data;
        }).buffer(2, TimeUnit.SECONDS)
                .observeOn(Schedulers.from(threadPoolExecutor))
                .observeOn(Schedulers.from(threadPoolExecutor))
                .subscribeWith(new DisposableObserver<List<LogData>>() {
                    @Override
                    public void onNext(List<LogData> logData) {
                        for (LogData logDatum : logData) {
                            Log.e("time taken: ", logDatum.getClassName() + "=>" +
                                    logDatum.getMethodName() + " " + "=> " + logDatum
                                    .getTimeTaken() + "ms");
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                    }

                    @Override
                    public void onComplete() {
                    }
                });
    }
}

它工作正常并记录下每个方法,example.application但出现的问题是应用程序变得如此缓慢,以至于加载 Activity 或 Fragment 需要 20-50 秒。

如何调整应用程序的性能。我不知道代码的哪一部分运行时间太长。

4

0 回答 0