Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

312
Vistas
Tratar con R8 + JvmStatic Annotation + Lambda en la API pública para la biblioteca de Android escrita en Kotlin

En primer lugar, tenga en cuenta que no espero why do you want to obfuscate library . Este es un problema genuino por el que estoy preguntando.

He tenido problemas con R8/ofuscación con una biblioteca de Android escrita en Kotlin.

Tengo un método de API público que está anotado con @JvmStatic y ese método toma un Lambda como parámetro.

Por ejemplo, eche un vistazo al código a continuación,

 typealias MyLambdaCallback = (String, Map<String, Any>) -> Unit @Keep object MyApi { private var callback: MyLambdaCallback? = null @JvmStatic fun setCallback(callback: MyLambdaCallback) { this.callback = callback } }

He agregado @Jvmstatic para que el código de llamada de Java pueda llamar al método de forma estática en lugar de hacer MyApi.INSTANCE.setCallback()

Cuando libero la biblioteca sin minification , todo está bien y el código de llamada de Java y Kotlin se escribe como se esperaba.

Pero ahora quiero liberar la biblioteca mientras activo la minification .

Eso crea un problema.

aquí está el error

java.lang.IncompatibleClassChangeError: se esperaba que el método 'void setCallback(kotlin.jvm.functions.Function2)' fuera de tipo virtual, pero en cambio resultó ser de tipo estático (aparece la declaración de 'com.demo.basic.Application' en /data/app/com.demo.basic-_0uJXPbtfs3UZ2Rp2h-RdQ==/base.apk!classes2.dex)

¿Estoy cometiendo un error en alguna parte o esto se espera como algún tipo de limitación?

¿Qué probé?

  1. Eliminar @Jvmstatic resuelve el problema, pero creó un código de llamada Java feo

  2. Mantuvo @Jvmstatic pero eliminó Lambda , convirtiendo Lambda en una interface with one method y todo funciona bien. Desafortunadamente SAM for Kotlin classes aún no está disponible, por lo que llamar al código de Kotlin se ve feo.

over 4 years ago · Hanz Gallego
2 Respuestas
Responde la pregunta

0

Esto se rastrea en el rastreador de problemas R8 http://issuetracker.google.com/158393309 que tiene más detalles.

La historia corta es que esto se solucionó en R8 versión 2.1.35, que se puede usar haciendo los siguientes cambios en el archivo build.gradle de nivel superior:

 repositories { maven { url 'https://storage.googleapis.com/r8-releases/raw' } } dependencies { classpath 'com.android.tools:r8:2.1.35' // Must be before the Gradle Plugin for Android. classpath 'com.android.tools.build:gradle:XYZ' // Your current AGP version. }
over 4 years ago · Hanz Gallego Denunciar

0

El equipo de R8 solucionó este problema junto con el problema relacionado b/158400283 en la versión 2.1.42 de R8

La solución ya debería estar disponible en Android Studio 4.1 beta o superior, pero si está utilizando Android Studio 4.0 estable, agregue lo siguiente a su archivo build.gradle de nivel superior:

 buildscript { repositories { maven { url 'https://storage.googleapis.com/r8-releases/raw' } } dependencies { classpath 'com.android.tools:r8:2.1.42' // Must be before the Gradle Plugin for Android. classpath 'com.android.tools.build:gradle:XYZ' // Your current AGP version. } }
over 4 years ago · Hanz Gallego Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda