我正在尝试记录我的应用程序中每个 JAVA 方法的方法执行时间。我尝试了许多 aspectj 插件,例如uPhyca、aspectx ,但由于 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 秒。
如何调整应用程序的性能。我不知道代码的哪一部分运行时间太长。