Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

314
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda