Sin metafábrica de método estático

5 minutos de lectura

avatar de usuario
Stradtdog

Tengo un problema con mi aplicación que cuando inicio sesión, la aplicación falla y aparece el error:

java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory; or its super classes (declaration of 'java.lang.invoke.LambdaMetafactory' appears in /apex/com.android.runtime/javalib/core-oj.jar)
  at okhttp3.internal.Util.<clinit>(Util.java:87)
  at okhttp3.internal.Util.skipLeadingAsciiWhitespace(Util.java:321)
  at okhttp3.HttpUrl$Builder.parse(HttpUrl.java:1313)
  at okhttp3.HttpUrl.get(HttpUrl.java:917)
  at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:492)
  at com.example.usub.Remote.RetrofitClient.getClient(RetrofitClient.java:14)
  at com.example.usub.Common.Common.getGoogleAPI(Common.java:10)
  at com.example.usub.Welcome.onCreate(Welcome.java:208)
  at android.app.Activity.performCreate(Activity.java:7825)
  at android.app.Activity.performCreate(Activity.java:7814)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
  at android.os.Handler.dispatchMessage(Handler.java:107)
  at android.os.Looper.loop(Looper.java:214)
  at android.app.ActivityThread.main(ActivityThread.java:7356)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

He intentado meterme con el gradle y cambiar las variables. El problema parece provenir de este paquete:

import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;

public class RetrofitClient {
    private static Retrofit retrofit = null;

    public static Retrofit getClient(String baseURL)
    {
        if(retrofit == null)
        {
            retrofit = new Retrofit.Builder()
                         .baseUrl(baseURL)
                         .addConverterFactory(ScalarsConverterFactory.create())
                         .build();
        }
        return retrofit;
    }
}

Luego da a otra referencia a:

import com.example.usub.Remote.IGoogleAPI;
import com.example.usub.Remote.RetrofitClient;

public class Common {
    public static  final String baseURL = "https://maps.googleapis.com";

    public static IGoogleAPI getGoogleAPI()
    {
        return RetrofitClient.getClient(baseURL).create(IGoogleAPI.class);
    }
}

Aquí está mi gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    defaultConfig {
        applicationId "com.example.usub"
        minSdkVersion 26
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.2.0-alpha01'
    implementation 'com.firebase:geofire-android:2.1.2'
    implementation 'com.github.kmenager:material-animated-switch:1.2.2'
    implementation 'com.squareup.retrofit2:retrofit:2.7.0'
    implementation 'com.squareup.retrofit2:converter-scalars:2.7.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.google.firebase:firebase-database:19.2.0'
    implementation 'com.google.firebase:firebase-auth:19.2.0'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'com.github.d-max:spots-dialog:0.7@aar'
    implementation "androidx.cardview:cardview:1.0.0"
    implementation 'uk.co.chrisjenx:calligraphy:2.3.0'
    implementation 'com.rengwuxian.materialedittext:library:2.1.4'
    implementation 'com.google.android.gms:play-services-maps:17.0.0'
    //implementation 'com.google.android.gms:play-services:17.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation 'com.google.firebase:firebase-analytics:17.2.1'
    implementation 'com.google.android.gms:play-services-location:17.0.0'
}

apply plugin: 'com.google.gms.google-services'

¿Cómo puedo encontrar el método para corregir el error?

  • Ya había agregado las opciones de Java 8 en build.gradle y todavía tenía el problema. Lo que funcionó para mí es mover .addConverterFactory() antes de llamar a baseUri()

    – png

    9 de marzo de 2021 a las 17:49

avatar de usuario
Martín Zeitler

Intente cambiar al modo de compatibilidad de Java 8, para eliminar el azúcar de alguna biblioteca:

android {

    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Además, la API JSON de Google podría necesitar la GsonConverterFactory.

  • Según la documentación square.github.io/okhttp/upgrading_to_okhttp_4 también se recomienda agregar android { kotlinOptions { jvmTarget = “1.8” } }

    – Mijaíl Sharin

    20 de marzo de 2020 a las 7:55

  • @MikhailSharin Esto solo se aplica cuando se trans-pila de Kotlin a código de bytes de Java; por lo que solo se requiere para proyectos Kotlin (o proyectos mixtos), pero no se requiere para proyectos Java puros. Gracias por notarlo, porque estoy seguro de que esto eventualmente puede ayudar a alguien.

    – Martín Zeitler

    2 abr 2020 a las 17:11


  • Hombre, sé que no es profesional, ¡pero te amo! He estado luchando con él durante algunas horas, y al principio no vi la opción de compilación en mi gradle, así que la agregué y funciona perfecto, ¡gracias!

    – Estantería Lidor Eliyahu

    13 de diciembre de 2020 a las 16:56


  • En mi caso, estaba importando una nueva biblioteca de Android, mi biblioteca de Android era compatible con Java 8 pero mi proyecto principal no lo era. Mi solución fue hacer que ambos fueran compatibles con Java 8.

    – Luis Muñoz

    13 de agosto de 2021 a las 21:42


  • Tuve que hacer una compilación limpia después de implementar estos cambios para que funcionara.

    – oziomajnr

    23 de septiembre de 2021 a las 17:08

Puede resolver este error configurando compileOptions en build.gradle(aplicación) archivo.

android {
    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

  • Gracias @galian por tus inspiradoras palabras.

    – Creador de códigos

    21 de enero a las 12:56

avatar de usuario
Gk Mohammad Emón

En mi caso no fue por retrofit. Estaba usando un módulo de biblioteca local (nombrada Generador de XML a PDF de Android) que estaba usando Java version 1.8 (para usar Rx Java)pero mi nivel de aplicación Java version era menos que 1.8.

Así que simplemente agregué las siguientes líneas en mi nivel de aplicación construir.gradle

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

¡Entonces funcionó para mí!

avatar de usuario
Brijesh Kumbhare

Intente refactorizar las dependencias de Retrofit.

Escribe esto:

implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.2.0'

Acabo de cambiar mis dependencias a abajo y proyecto limpio. Estaba usando la última versión de la biblioteca de actualización antes, pero fallé con el mismo error. Funcionó para mí.

implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

¿Ha sido útil esta solución?