Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
sharmag222cool opened this issue Feb 28, 2018 · 5 comments

Comments

@sharmag222cool
Copy link

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)

@sergeykomlach
Copy link

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;
    }
}

@abhimuktheeswarar
Copy link

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

@sergio11
Copy link

Same issue after update to Android Studio 3.1.1

@unclejay80
Copy link

same for me

@jerryweijin
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants