AndroidDevMetrics icon indicating copy to clipboard operation
AndroidDevMetrics copied to clipboard

Verify error after updating distribution url https\://services.gradle.org/distributions/gradle-4.4-all.zip in multi-module project.

Open sharmag222cool opened this issue 6 years ago • 5 comments

java.lang.VerifyError: Verifier rejected class com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer: boolean com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer.ajc$inlineAccessMethod$com_frogermcs_androiddevmetrics_aspect_Dagger2GraphAnalyzer$com_frogermcs_androiddevmetrics_aspect_Dagger2GraphAnalyzer$isMethodWithReturnType(com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer, org.aspectj.lang.reflect.CodeSignature) failed to verify: boolean com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer.ajc$inlineAccessMethod$com_frogermcs_androiddevmetrics_aspect_Dagger2GraphAnalyzer$com_frogermcs_androiddevmetrics_aspect_Dagger2GraphAnalyzer$isMethodWithReturnType(com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer, org.aspectj.lang.reflect.CodeSignature): [0x0] invoke-super/virtual can't be used on private method boolean com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer.isMethodWithReturnType(org.aspectj.lang.reflect.CodeSignature) (declaration of 'com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer' appears in /data/app/com.aranoah.healthkart.plus.staging.debug-1/base.apk:classes31.dex) at com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer.setEnabled(Dagger2GraphAnalyzer.java:20) at com.frogermcs.androiddevmetrics.AndroidDevMetrics.setupMetrics(AndroidDevMetrics.java:97) at com.frogermcs.androiddevmetrics.AndroidDevMetrics.setAndroidDevMetrics(AndroidDevMetrics.java:69) at com.frogermcs.androiddevmetrics.AndroidDevMetrics.initWith(AndroidDevMetrics.java:59) at com.frogermcs.androiddevmetrics.AndroidDevMetrics.initWith(AndroidDevMetrics.java:52) at com.frogermcs.androiddevmetrics.AndroidDevMetrics.initWith(AndroidDevMetrics.java:48) at com.aranoah.healthkart.plus.BaseApplication.initDevMetrics(BaseApplication.java:66) at com.aranoah.healthkart.plus.BaseApplication.onCreate(BaseApplication.java:59) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1032) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5970) at android.app.ActivityThread.-wrap3(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1710) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6776) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

sharmag222cool avatar Feb 28 '18 06:02 sharmag222cool

Faced with the same issue during AndroidDevMetric integration into the project

FATAL EXCEPTION: main
Process: com.mysomepackage.android, PID: 4809
java.lang.VerifyError: Verifier rejected class com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer due to bad method boolean com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer.ajc$inlineAccessMethod$com_frogermcs_androiddevmetrics_aspect_Dagger2GraphAnalyzer$com_frogermcs_androiddevmetrics_aspect_Dagger2GraphAnalyzer$isMethodWithReturnType(com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer, org.aspectj.lang.reflect.CodeSignature)(declaration of 'com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer'
    appears in /data/app / com.mysomepackage.android - 1 / split_lib_dependencies_apk.apk)
at com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer.setEnabled(Dagger2GraphAnalyzer.java: 20)
at com.frogermcs.androiddevmetrics.AndroidDevMetrics.setupMetrics(AndroidDevMetrics.java: 107)
at com.frogermcs.androiddevmetrics.AndroidDevMetrics.setAndroidDevMetrics(AndroidDevMetrics.java: 79)
at com.frogermcs.androiddevmetrics.AndroidDevMetrics.initWith(AndroidDevMetrics.java: 69)
at com.frogermcs.androiddevmetrics.AndroidDevMetrics.initWith(AndroidDevMetrics.java: 62)
at com.frogermcs.androiddevmetrics.AndroidDevMetrics.initWith(AndroidDevMetrics.java: 58)
at com.mysomepackage.android.MyApp.onCreate(MyApp.java: 235)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java: 1013)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java: 4707)
at android.app.ActivityThread. - wrap1(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java: 1405)
at android.os.Handler.dispatchMessage(Handler.java: 102)
at android.os.Looper.loop(Looper.java: 148)
at android.app.ActivityThread.main(ActivityThread.java: 5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 616)

I tried clean+build, invalidate the cache, manually delete cache + build dirs - no luck.

Reproduced on emulators with Android 4.0.3 - Android P

SysInfo: Android Studio 3.0.1 BuildTools 27.0.3 Android NDK rev16

After digging I found that problem appears in case D8 compiler enabled in gradle.properties:

android.enableD8=true //issue here

android.enableD8.desugaring=true

android.enableR8=true

If set android.enableD8 to false - all fine.

I believe that D8 recompile AndroidDevMetrics classes during build or merge.

Origin source code from lib

package com.frogermcs.androiddevmetrics.aspect;
import com.frogermcs.androiddevmetrics.internal.metrics.InitManager;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.CodeSignature;
import org.aspectj.lang.reflect.ConstructorSignature;
import org.aspectj.lang.reflect.MethodSignature;

import java.util.concurrent.TimeUnit;

@Aspect
public class Dagger2GraphAnalyzer {
    private static volatile boolean enabled = false;

    public static void setEnabled(boolean enabled) {
        Dagger2GraphAnalyzer.enabled = enabled;
    }

    public static boolean isEnabled() {
        return enabled;
    }

    @Pointcut("within(@dagger.Module *)")
    public void withinAnnotatedClass() {
    }

    @Pointcut("execution(@javax.inject.Inject *.new(..))")
    public void injectConstructor() {
    }

    //Exclude methods from *_MonitoringModule (Dagger 2 producers)
    @Pointcut("!execution(* defaultSetOfFactories())")
    public void exceprDefaultSetOfFactories() {
    }

    @Pointcut("!execution(dagger.producers.monitoring.ProductionComponentMonitor *(..))")
    public void exceptProductionComponentMonitor() {
    }

    @Pointcut("execution(@dagger.Provides * *(..)) &&" +
            " withinAnnotatedClass() &&" +
            " exceptProductionComponentMonitor()" +
            " && exceprDefaultSetOfFactories()")
    public void providesMethod() {
    }

    @Around("providesMethod() || injectConstructor()")
    public Object logAndExecute(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.nanoTime();
        Object result = joinPoint.proceed();
        long stop = System.nanoTime();
        long took = TimeUnit.NANOSECONDS.toMillis(stop - start);

        if (!enabled) {
            return result;
        }

        CodeSignature codeSignature = (CodeSignature) joinPoint.getSignature();
        Class<?> cls = codeSignature.getDeclaringType();

        if (codeSignature instanceof ConstructorSignature) {
            InitManager.getInstance().addInitMetric(cls, joinPoint.getArgs(), took);
        }

        if (isMethodWithReturnType(codeSignature)) {
            if (result != null) {
                InitManager.getInstance().addInitMetric(result.getClass(), joinPoint.getArgs(), took);
            }
        }

        return result;
    }

    private boolean isMethodWithReturnType(CodeSignature codeSignature) {
        return codeSignature instanceof MethodSignature && ((MethodSignature) codeSignature).getReturnType() != void.class;
    }


}

Seems like broken source code after D8:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.frogermcs.androiddevmetrics.aspect;

import com.frogermcs.androiddevmetrics.internal.metrics.InitManager;
import java.util.concurrent.TimeUnit;
import org.aspectj.lang.NoAspectBoundException;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.CodeSignature;
import org.aspectj.lang.reflect.ConstructorSignature;
import org.aspectj.lang.reflect.MethodSignature;

@Aspect
public class Dagger2GraphAnalyzer {
    private static volatile boolean enabled = false;

    public Dagger2GraphAnalyzer() {
    }

    public static void setEnabled(boolean enabled) {
        enabled = enabled;
    }

    public static boolean isEnabled() {
        return enabled;
    }

    @Pointcut("within(@dagger.Module *)")
    public void withinAnnotatedClass() {
    }

    @Pointcut("execution(@javax.inject.Inject *.new(..))")
    public void injectConstructor() {
    }

    @Pointcut("!execution(* defaultSetOfFactories())")
    public void exceprDefaultSetOfFactories() {
    }

    @Pointcut("!execution(dagger.producers.monitoring.ProductionComponentMonitor *(..))")
    public void exceptProductionComponentMonitor() {
    }

    @Pointcut("execution(@dagger.Provides * *(..)) && withinAnnotatedClass() && exceptProductionComponentMonitor() && exceprDefaultSetOfFactories()")
    public void providesMethod() {
    }

    @Around("providesMethod() || injectConstructor()")
    public Object logAndExecute(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.nanoTime();
        Object result = joinPoint.proceed();
        long stop = System.nanoTime();
        long took = TimeUnit.NANOSECONDS.toMillis(stop - start);
        if(!ajc$inlineAccessFieldGet$com_frogermcs_androiddevmetrics_aspect_Dagger2GraphAnalyzer$com_frogermcs_androiddevmetrics_aspect_Dagger2GraphAnalyzer$enabled()) {
            return result;
        } else {
            CodeSignature codeSignature = (CodeSignature)joinPoint.getSignature();
            Class cls = codeSignature.getDeclaringType();
            if(codeSignature instanceof ConstructorSignature) {
                InitManager.getInstance().addInitMetric(cls, joinPoint.getArgs(), took);
            }

            if(ajc$inlineAccessMethod$com_frogermcs_androiddevmetrics_aspect_Dagger2GraphAnalyzer$com_frogermcs_androiddevmetrics_aspect_Dagger2GraphAnalyzer$isMethodWithReturnType(this, codeSignature) && result != null) {
                InitManager.getInstance().addInitMetric(result.getClass(), joinPoint.getArgs(), took);
            }

            return result;
        }
    }

    private boolean isMethodWithReturnType(CodeSignature codeSignature) {
        return codeSignature instanceof MethodSignature && ((MethodSignature)codeSignature).getReturnType() != Void.TYPE;
    }

    static {
        try {
            ajc$postClinit();
        } catch (Throwable var1) {
            ajc$initFailureCause = var1;
        }

    }

    public static Dagger2GraphAnalyzer aspectOf() {
        if(ajc$perSingletonInstance == null) {
            throw new NoAspectBoundException("com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer", ajc$initFailureCause);
        } else {
            return ajc$perSingletonInstance;
        }
    }

    public static boolean hasAspect() {
        return ajc$perSingletonInstance != null;
    }
}

sergeykomlach avatar Mar 26 '18 06:03 sergeykomlach

I'm also facing the same issue after updating to Android Studio 3.1

abhimuktheeswarar avatar Mar 28 '18 06:03 abhimuktheeswarar

Same issue after update to Android Studio 3.1.1

sergio11 avatar Apr 17 '18 16:04 sergio11

same for me

unclejay80 avatar Apr 24 '18 10:04 unclejay80

Face the same error. After adding android.enableD8=false to gradle.properties, everything works again.

jerryweijin avatar Jun 29 '18 19:06 jerryweijin