Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

329
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!